认识Docker
Docker 组成
镜像 (images):
类似于 C++的类,有了类,基于这个 就能 new 出新的不同的对象(或者说这是一个模板,可以通过此创建不同的对象)
容器(containers):
Docker 的容器技术就体现在这,各个容器之间分离,使用不同的内核与内容
每个容器都是一个微型的 Linux 系统
仓库(repository):
存放镜像的地方,分为公有和私有
国外 DockerHub,国内配置镜像访问
Docker 安装
见
卸载方法
# 1.卸载依赖
sudo yum remove docker-cli docker-ce-cli container.io
# 2.删除资源
rm -rf /var/lib/docker
# /var/lib/docker docker默认工作路径
底层原理
Docker 是如何工作的?
Docker 是一个 Client-Server 结构的系统,Docker 的守护进程运行在主机上,通过 Socket 从客户端访问
Docker-Server 接收到 Docker-Client 的指令就会执行这个指令
Docker 的常用命令
帮助命令
docker version
docker info # 更详细的版本信息
帮助文档:https://docs.docker.com/reference/
镜像命令
# 搜索镜像
$ docker search [images]
# 拉取镜像
$ docker pull [images]:tag
# 不写tag默认最新
# 分层下载是docker images的核心
# 删除镜像
$ docker rmi -f [id]
$ docker rmi [images]:tag #若只有一个,则不用指定tag
$ docker rmi -f $(docker images -aq) #删除全部容器
容器命令
前提:有了镜像才能创建容器
新建容器并且启动
$ docker run [可选参数] image
#参数说明
--name="Name" # 容器名字 用于区分容器
-d # 后台运行
-it # 交互方式运行,进入容器查看内容
-p # 指定容器端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P # 随机指定端口
# 测试,交互启动
[root@centos79 etc]# docker run -it centos /bin/bash
[root@db728d3bbc68 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@db728d3bbc68 ~]# exit
exit
[root@centos79 etc]#
列出所有运行的容器
# docker ps 命令
-a #列出所有
-n=? #显示最近创建的容器
-q #
推出容器
exit #直接容器停止退出
ctrl+P+Q #容器不停止退出
删除容器
docker rm 容器id #删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器,xargs搭配管道使用,将|前作为参数给|后
启动和停止容器
docker start 容器id #启动
docker stop 容器id #停止
docker restart 容器id #重启
docker kill 容器id #强制停止
其他常用命令
后台启动容器
$ docker run -d 镜像名
# 常见问题,docker容器使用后台运行,必须有一个前台进程,否则会直接结束
查看日志
docker logs -tf --tail num 容器id
查看容器中的进程信息
docker top 容器id
查看镜像的元数据
docker inspect 容器id
进入当前运行的容器
# 我们经常容器用后台运行,如果需要进入容器修改配置,则
# 命令1 docker exec
docker exec -it 容器id /bin/bash
# 测试
[root@centos79 etc]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d61aebdf9a85 centos "/bin/sh -c 'while t…" 10 minutes ago Up 10 minutes quirky_greider
[root@centos79 etc]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d61aebdf9a85 centos "/bin/sh -c 'while t…" 12 minutes ago Up 12 minutes quirky_greider
[root@centos79 etc]# docker exec -it d61aebdf9a85 /bin/bash
[root@d61aebdf9a85 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@d61aebdf9a85 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 08:12 ? 00:00:00 /bin/sh -c while true; do echo hello; sleep 1; done
root 762 0 0 08:24 pts/0 00:00:00 /bin/bash
root 798 1 0 08:25 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang = sleep /usr/bin/s
root 799 762 0 08:25 pts/0 00:00:00 ps -ef
# 命令 2
docker attach -it 容器 id /bin/bash
#测试
$ docker attach 容器 id
正在执行的代码。。。
# docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach # 进入容器正在运行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器 id: 容器内路径 目的主机路径
小结
attach Attach to a running container # 附加到一个正在运行的容器
build Build an image from a Dockerfile # 从 Dockerfile 构建一个镜像
commit Create a new image from a container's changes # 从容器的更改创建一个新的镜像
cp Copy files/folders from the containers filesystem to the host path # 从容器文件系统复制文件/文件夹到主机路径
diff Inspect changes on a container's filesystem # 检查容器文件系统的更改
events Get real time events from the server # 从服务器获取实时事件
export Stream the contents of a container as a tar archive # 将容器的内容作为 tar 归档流出
history Show the history of an image # 显示镜像的历史记录
images List images # 列出镜像
import Create a new filesystem image from the contents of a tarball # 从 tarball 的内容创建一个新的文件系统镜像
info Display system-wide information # 显示系统范围的信息
inspect Return low-level information on a container # 返回容器的低级信息
kill Kill a running container # 杀死一个正在运行的容器
load Load an image from a tar archive # 从 tar 归档加载一个镜像
login Register or Login to the docker registry server # 注册或登录到 docker 注册服务器
logs Fetch the logs of a container # 获取容器的日志
port Lookup the public-facing port which is NAT-ed to PRIVATE_PORT # 查找 NAT 到 PRIVATE_PORT 的公用端口
pause Pause all processes within a container # 暂停容器内的所有进程
ps List containers # 列出容器
pull Pull an image or a repository from the docker registry server # 从 docker 注册服务器拉取一个镜像或仓库
push Push an image or a repository to the docker registry server # 推送一个镜像或仓库到 docker 注册服务器
restart Restart a running container # 重启一个正在运行的容器
rm Remove one or more containers # 删除一个或多个容器
rmi Remove one or more images # 删除一个或多个镜像
run Run a command in a new container # 在一个新的容器中运行一个命令
save Save an image to a tar archive # 将一个镜像保存为 tar 归档
search Search for an image in the docker index # 在 docker 索引中搜索一个镜像
start Start a stopped container # 启动一个已停止的容器
stop Stop a running container # 停止一个正在运行的容器
tag Tag an image into a repository # 将一个镜像标记到一个仓库
top Lookup the running processes of a container # 查找容器的运行进程
unpause Unpause a paused container # 取消暂停一个已暂停的容器
version Show the docker version information # 显示 docker 版本信息
wait Block until a container stops, then print its exit code # 阻塞直到容器停止,然后打印其退出代码
测试
安装tomcat
# 官方教程
$ docker run -it --rm tomcat: 9.0
# 一般来说,我们都用后台启动,希望这个进程留存, 用此方法一般用来测试,用完即删除
# 当然,此时镜像还在,只是容器删除
$ docker run -it -d -p 3344:8080 --name " name " tomcat
注意
想要公网访问网站时候,需要同时开启防火墙规则+服务器安全组
必须两者都有才能访问,否则只能从本地访问
安装可视化Portainer
https://zhuanlan.zhihu.com/p/709299396
====
Docker镜像
镜像是什么?
是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件
所有的应用,直接打包docker镜像,就可以直接跑起来!
如何得到镜像
-
DockerHub
-
自己制作DockerFile
-
从其他地方拷贝
镜像原理
UnionFS(联合文件系统)
UnionFS:是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到用一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作不同具体的镜像
特点:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像加载实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
bootfs(boot file system)主要包含bootloader 和Kernel,bootloader主要是引导加载Kernel,Linux刚启动时回家再bootfs文件系统 ,在Docker镜像的最底层是bootfs。这一层与我们经典的Linux/Unix系统是一样的,包含boot加载器和内核,当boot加载完成后整个内核就在内存中,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上。包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubantu,CentOs等。
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以,因为底层直接用Host的kernel,自己只用提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs
每个镜像都是通过 DockerFile 文本文件定义的,Dockerfile 中的每条指令最终都会成为镜像中的 Layer。Layer 是按顺序构成的,最底层的 Layer 是基础镜像(base image),最上层是最终镜像(final image)。当一个镜像被更新或重新构建时,只有更新的层需要修改,其他没有更新的层可以直接复用本地缓存。这就是 Docker 镜像如此快速和轻量级的部分原因,每一层的大小加起来等于最终镜像的大小。
分层理解
Docker Commit
docker commit 提交容器成为一个新的版本(相当于把自己修改过的部分也打包成为镜像)
docker commit -m =" 提交的信息 " -a =" 作者 " 容器 id 目标镜像名:[TAG]
容器数据卷
什么是容器数据卷
首先,docker的理念是把应用和环境打包成为一个镜像
引出数据的问题?如果数据都在容器中,当容器删除时,数据也随之没了->数据的永久化存储
eg:MySQL,我们希望当容器删除后,数据还留在本地
此时就提出了一种数据共享技术
总结:
容器的持久化和同步技术!容器间的数据也能共享
使用数据卷
方法一:使用-v来进行挂载
docker run -it -v 主机目录:容器内目录
[root@centos79 home]# docker run -it -v /home/volumetest:/home centos /bin/bash
# 此时本地/home/volumetest和运行的匿名容器centos下的 /home实现同步功能
[!EXAMPLE]
实战 在mysql中实现
# 获取镜像
docker pull mysql
# 运行容器
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:var/lib/mysql -e MYSQL_ROOT_PASSWARD=123456 --name mysql01 mysql
# 参数解释
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
具名和匿名挂载
# 匿名卷挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /home/nginx nginx
[root@centos79 home]# docker volume ls
DRIVER VOLUME NAME
local a1b8b84fda279b29ba1bec02fa5079e345f7d0b44ae9d0bc5964e18bb8ebcae3
# 具名挂载
# -v 卷名:容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/home/nginx nginx
[root@centos79 home]# docker volume ls
DRIVER VOLUME NAME
local a1b8b84fda279b29ba1bec02fa5079e345f7d0b44ae9d0bc5964e18bb8ebcae3
local juming-nginx
[root@centos79 home]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2024-11-28T22:07:14+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有docker容器的卷,没有指定目录的情况下都是在 "/var/lib/docker/volumes/xxxxx/_data"
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
通过ro、rw还能指定卷的访问形式(只读和可读可写)
初始Dockerfile
Dockerfile就是构建镜像的文件,也就是一个命令脚本!
[!EXAMPLE]
# 创建一个dockerfile文件
FROM centos #指定镜像
VOLUME ["volume1","volume2"]
CMD echo "----end-----"
CMD /bin/bash
#进入镜像发现(此时相当于创建了一个容器),挂载的数据卷已经出现
[root@centos79 dockerfile-volume-test]# docker run -it 28850d771321 /bin/bash
[root@c7b7a6199377 /]# ls
bin etc lib lost+found mnt proc run srv tmp var volume2
dev home lib64 media opt root sbin sys usr volume1
# 退出后容器关闭,但是可以看到本地数据卷已经挂载
# 并且此时是一个匿名挂载
数据卷容器
用于几个容器之间的数据同步
# 测试
docker run -it --name docker01 dai-centos:1.0
docker run -it --name docker02 --volumes-from docker01 dai-centos:1.0
docker run -it --name docker03 --volumes-from docker01 dai-centos:1.0
结论:
容器间的配置信息传递,数据容器卷的生命周期一直持续到没有容器为止
但是如果你持续化到本地,本地的数据是不会删除的
Dockfile
Dockerfile 介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(Docker Hub、阿里云镜像)
Dockerfile 指令
FROM # 基础镜像,一切从这里开始
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建时候需要运行的命令
ADD # 步骤,tomcat镜像,这tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露的端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个生效(相当于是一个替代操作)
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,追加命令
ONBUILD # 构建一个被继承DockerFile这个时候就会运行ONBILD指令,触发命令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试
构建一个centos
# 1、编写自己的DockerFile文件
FROM centos:7
MAINTAINER dai<2248604517@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
CMD /bin/bash
RUN yum -y install net-tools
RUN yum -y install vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "-------end-------"
# 2、构建镜像
docker build -f dockerfile路径 -t 镜像名:[tag] .
发布自己的镜像
Dockerhub
小结
Docker网络
Docker0
[!QUESTION]
docker 是如何处理容器网络访问的?
# 首先创建一个容器
docker run -it -P --name tomcat01 tomcat
# 发现问题,创建的容器中无法查询ip addr
# 解决如下
apt update
apt install -y iproute2
apt install -y iputils-ping
apt install net-tools
# 1、创建容器查看网络
# 继续查看容器内网络,发现启动后容器中有一个60: eth0@if61 ,这就是docker分配的地址
root@02a768054956:/usr/local/tomcat# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
60: eth0@if61: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 2、发现Linux系统能之间ping到容器内
[root@centos79 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.065 ms
# 3、由于下载iproute2的过程有些麻烦,我们自己制作镜像在本地
docker commit tomcat01的id -m="add the iproute2" -a="dai" mytomcat:1.0
# 得到
[root@centos79 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 e8a2e8b061d0 5 minutes ago 705MB
# 4、接着再次创建一个容器,并且直接注入ip addr
docker run -it -P --name tomcat02 mytomcat:1.0
docker exec -it tomcat02 ip addr
[root@centos79 ~]# docker exec -it tomcat02 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
62: eth0@if63: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
原理
1、我们没启动一个docker容器,docker都会自动创建并且分配 一个ip,我们只要安装了docker,就会有一个docker网卡docker0
这个docker0使用的是桥接模式,使用的技术是evth-pair
2、我们发现容器带来网卡,都是一对一对的,evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连接着协议,一段彼此连接。正因为这个特性,evth-pair充当一个桥梁,连接各种虚拟网路设备的
3、结论:容器和容器之间也是互通的,但不是两个之间直接互连,而是通过docker0进行路由
4、所有的容器在不指定网路的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用IP
小结
Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0
Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!(内网传递文件快)
--Link
思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可用处理这个问题,可用怎么来进行访问容器?
[root@centos79 ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
# 如何解决“?
# 通过--link来解决网络连接的问题
[root@centos79 ~]# docker run -d -P --name tomcat03 --link tomcat02 mytomcat:2.0
9f7389b5a0d2aad7cf7a0bc02570afbe1cf23c64cd55a2f431c4139650e277b9
[root@centos79 ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.096 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.055 ms
# 此时tomcat03能成功ping通tomcat02,但是反过来不可以
# 原理发现 通过--link 配置,实际配置的就是hosts文件,并且一次只能配置一个
root@centos79 ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 78e0d5358e18
172.17.0.4 9f7389b5a0d2
[root@centos79 ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 78e0d5358e18
本质探究,--link就是在所配置的容器中多一条 172.17.0.3 tomcat02 78e0d5358e18 但是明显这样不是特别方便,所以在之后的使用中,如果有需要,得自己配置网络,而不是使用docker0分配
自定义网络
网络模式:
-
bridge:桥接docker(默认,自己创建也使用bridge模式)
-
none:不配置网络
-
host:和宿主机共享网络
# 1、我们直接启动的命令 --net bridge,而这个就是我们的docker0
docker run -it -P --name tomcat01 tomcat
docker run -it -P --name tomcat01 --net bridge tomcat
# docker0 的特点:默认,域名不能访问,--link可以打通
# 2、我们自己创建网络
[root@centos79 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 可以通过docker netword inspect [所配置的网络]来查看配置
# 3、在自定义网络下创建新的容器,发现容器出现在该网段下
[root@centos79 ~]# docker run -d -P --name network-tomcat01 --net mynet mytomcat:2.0
0807603313d6014d10c1571ab1ee35cbcec7d63bbb6c631565a6f65ce0ccc8f6
[root@centos79 ~]# docker run -d -P --name network-tomcat02 --net mynet mytomcat:2.0
fccbf4e86bf2e3985627b6a00e00e2ddcbe9a43ec5fe81c578968b37a51c92f9
[root@centos79 ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "fb84316efb96bfadbf230c8233e74ac26eaa2371fbc209c94676e1b8101e14d3",
"Created": "2024-11-29T21:36:45.381499207+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0807603313d6014d10c1571ab1ee35cbcec7d63bbb6c631565a6f65ce0ccc8f6": {
"Name": "network-tomcat01",
"EndpointID": "ea3d43c5d13a88f8e61cd576ecd4988aec7a638ae8d08f6c503f84e5bcab0261",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"fccbf4e86bf2e3985627b6a00e00e2ddcbe9a43ec5fe81c578968b37a51c92f9": {
"Name": "network-tomcat02",
"EndpointID": "3f361df5dd9099dc3440c53040bce3c49b16b7d4ed51164021201992c2ceb7c6",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
# 4、测试
# 发现此时可以直接通过容器名称就直接可以ping通
[root@centos79 ~]# docker exec -it network-tomcat01 ping network-tomcat02
PING network-tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from network-tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from network-tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.055 ms
[root@centos79 ~]# docker exec -it network-tomcat02 ping network-tomcat01
PING network-tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.058 ms
好处:不同的集群使用不同的网络,保证集群是安全和健康的
网络连通
# 测试联通 tomcat-mynet
# 发现连通之后 tomcat01 放到了mynet网络下
# 此时一个容器有了两个ip地址
# 就比如 阿里云服务器也有两个IP:一个公网IP、一个私网IP
[root@centos79 ~]# docker network connect mynet tomcat01
[root@centos79 ~]# docker exec -it tomcat01 ping network-tomcat01
PING network-tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from network-tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.055 ms