写点什么

Docker 基础修炼 6-- 网络初探及单机容器间通信

用户头像
黑马腾云
关注
发布于: 2020 年 07 月 21 日
Docker基础修炼6--网络初探及单机容器间通信

前文演示 docker 容器内部数据共享与持久化,本文继续讨论 docker 网络以及容器之间的通信。


通过前面几篇文章的学习,大家对 docker 已经有了初步的认识,已经能够对单个容器进行管理操作。但在实际工作中,往往需要多个服务容器之间共同协作,这就要求多个容器之间能够相互访问到对方的服务。比如我们部署个人博客网站,往往将数据库服务和 web 服务放在不同的容器中,web 服务需要访问数据库,因此就要求 web 容器能否访问数据库容器。如何实现这个功能,正是本文将要探讨的。


本文先简要描述 docker 网络相关基础知识,然后再基于 bridge 网络模式,演示如何将容器端口映射到宿主机供外部访问、如何通过互联机制实现容器之间相互通信。


一、docker 网络初探


正如前文“Docker 基础修炼 3--Docker 容器介绍及常用命令”中演示,通过 httpd 镜像 run 一个容器的同时指定端口映射,就可以通过宿主机 ip 和端口访问到 web 容器。这是怎么实现的呢,底层原理是什么?要理解这个现象就要理解 docker 相关的网络知识。


1.1 网络实现原理


docker 使用 Linux 桥接在宿主机虚拟一个 docker 容器网桥(名称为 docker0),每当启动一个容器时会根据 docker 网桥的网段分配一个 IP 地址给容器(称为容器 IP),同时把 docker 网桥作为每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器 IP 直接通信。


为了更好的理解上边这句话,来看如下案例


1.1.1 案例 1:查看 docker 容器网桥信息


我们可以通过 ifconfig 命令查看 docker0 容器网桥信息


[root@docker ~]# ifconfigdocker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ca:9b:e4:a9  txqueuelen 0  (Ethernet)        RX packets 0  bytes 0 (0.0 B)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 0  bytes 0 (0.0 B)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.78.101 netmask 255.255.255.0 broadcast 192.168.78.255 inet6 fe80::20c:29ff:fea8:5807 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a8:58:07 txqueuelen 1000 (Ethernet) RX packets 155 bytes 16984 (16.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 180 bytes 22972 (22.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0...省略部分内容
复制代码


可以看到 docker0 即为容器网桥,是宿主机虚拟出来的,并不是真实存在的网络设备。另外一个 eno16777736(每台电脑可能名称不一样)则为网卡信息,可以通过它配置宿主机的 IP 信息。


1.1.2 案例 2:新建两个容器观察容器 IP 以及互通性


通过案例 1 可以看到 docker0 的 ip 为:172.17.0.1。本例以官方提供的 centos 镜像为例,创建容器 mycentos1、mycentos2,观察这两个容器 IP 与 docker0 的 IP 之间的关系


先创建 mycentos1


[root@docker ~]# docker run -it --name mycentos1 centos[root@6db829977fc4 /]# ifconfigbash: ifconfig: command not found[root@6db829977fc4 /]# yum install net-tools...省略部分内容,中途需要按两次y进行确认[root@6db829977fc4 /]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)        RX packets 2562  bytes 12723956 (12.1 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 2168  bytes 121391 (118.5 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...省略部分内容[root@6db829977fc4 /]# netstat -rnKernel IP routing tableDestination     Gateway         Genmask         Flags   MSS Window  irtt Iface0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0[root@6db829977fc4 /]# 
复制代码


基于官方镜像 centos 创建容器 mycentos1 后,进入容器发现 ifconfig 命令提示不存在,原因是此官方进行默认没有安装网络工具包,因此通过 yum install net-tools 命令安装网络工具,安装完成后再次通过 ifconfig 命令即可看到该容器的 ip 为:172.17.0.2 ,然后再通过 netstat -rn 查看该容器的网关为:172.17.0.1。


这就证实了前面说的:每当启动一个容器时会根据 docker 网桥的网段分配一个 IP 地址给容器,同时把 docker 网桥作为每个容器的默认网关。


接下来继续创建容器 mycentos2,验证两容器之间 IP 的连通性。


克隆一个连接会话,然后按如下步骤执行


[root@docker ~]# docker run -it --name mycentos2 centos[root@400c375d202d /]# yum install net-tools...与上面相同,因此省略输出过程[root@400c375d202d /]# ifconfigeth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)        RX packets 1957  bytes 12693925 (12.1 MiB)        RX errors 0  dropped 0  overruns 0  frame 0        TX packets 1584  bytes 89868 (87.7 KiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...省略部分输出[root@400c375d202d /]# netstat -rnKernel IP routing tableDestination     Gateway         Genmask         Flags   MSS Window  irtt Iface0.0.0.0         172.17.0.1      0.0.0.0         UG        0 0          0 eth0172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 eth0[root@400c375d202d /]# 
复制代码


同理可以看到 mycentos2 容器的 ip 地址为:172.17.0.3,网关为:172.17.0.1


在 mycentos2 中通过 ip 去 pingmycentos1 的 ip,观察连通性


[root@400c375d202d /]# ping -c 1 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.069 ms
--- 172.17.0.3 ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.069/0.069/0.069/0.000 ms[root@400c375d202d /]# exitexit[root@docker ~]#
复制代码


可以看到在 mycentos2 中可以直接通过 ping 通 mycentos1 的 ip,反过来亦然。这充分证明了:因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器 IP 直接通信。


1.2 常见网络模式


1.2.1 docker 网络相关命令


先简单介绍下几个 docker 网络相关的命令


docker network ls:查看网络


docker network create:创建网络


docker network inspect:查看网络细节


docker port:查看宿主机与容器间的端口映射


1.2.2 docker 网络模式


我们先来看看 docker 安装后默认的网络


[root@docker ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEd0f8ab5a4b42        bridge              bridge              local28991c6c5348        host                host                local969fd1293425        none                null                local[root@docker ~]# 
复制代码


通过 docker network ls 命令查看宿主机网络情况,可以看到安装 docker 后,自动安装了三个网络,启动类型分别为:bridge、host、null。


实际上 docker 有如下几种类型的网络驱动:bridge、none、container、host、overlay 等



(1)bridge 模式


bridge 模式是 docker 的默认网络模式,不写--net 参数,就是 bridge 模式。


bridge 模式示意图如下:



从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过 brctl show 命令查看。


当使用命令 docker run -p 创建容器时,docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 命令查看。


(2)none 模式


使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。


none 模式示意图如下:



这种网络模式下容器只有 lo 回环网络,没有其他网卡。none 模式可以在容器创建时通过--network=none 来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。


(3)container 模式


这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。


container 模式示意图如下:



(4)host 模式


如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。


host 模式如下图所示:



使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了,网络的隔离性不好。


(5)overlay 模式


overlay 网络用于连接不同机器上的 docker 容器,允许不同机器上的容器相互通信,同时支持对消息进行加密,当我们初始化一个 swarm 或是加入到一个 swarm 中时,在 docker 主机上会出现两种网络:


a、称为 ingress 的 overlay 网络,用于传递集群服务的控制或是数据消息,若在创建 swarm 服务时没有指定连接用户自定义的 overlay 网络,将会加入到默认的 ingress 网络


b、名为 docker_gwbridge 桥接网络会连接 swarm 中所有独立的 docker 系统进程



关于 overlay 网络的更多细节将在后续讲解,此处提到的 swarm 是一个新的概念,docker swarm 是官方提供的集群管理工具,它将若干台 docker 主机抽象为一个整体以便于统一进行管理。


总结:


在一台主机上的多个独立的容器,用 bridge 模式


需要将容器的网络环境和主机的网络环境绑定时,用 host 模式


需要多个主机上的多个容器相互通信,用 overlay 网络


二、docker 端口映射


Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机 IP]:[容器端口]访问容器。


正如前面所述,容器有自己的内部网络和 ip 地址,使用 docker inspec 可以详细查看。


前文已经通过 ngnix 进行了演示,本例再以 training/webapp 镜像为例进行演示-p 和-P 的用法。


training/webapp 镜像是一个运行 python 的环境,里边包含了简单的基于 python 的 web 程序,运行后即可访问,类似于前文的 ngnix 演示效果,内部运行端口为 5000。如果你没有 python 基础,完全不用关心镜像内部的细节,本文重点是演示容器端口映射的几种方法。


首先下载镜像


[root@docker ~]# docker pull training/webappUsing default tag: latestlatest: Pulling from training/webapp...输出内容省略
复制代码


2.1 使用 P 参数随机映射端口


当容器中运行一些网络应用, 要让外部访问这些应用时, 可以通过-P 或-p 参数来指 定端口映射。 当使用 P(大写的)标记时, Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。


[root@docker ~]# docker run -d -P training/webapp python app.py3f6e17415056c27d3186dad236371be9be9bbdd121babfbf3aed6c8b2c86d01f[root@docker ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES3f6e17415056        training/webapp     "python app.py"     14 seconds ago      Up 12 seconds       0.0.0.0:32768->5000/tcp   nifty_wing[root@docker ~]# 
复制代码


可以看到随机映射到宿主机的端口为 32786,因此外部可以通过宿主机 ip:32786 的形式进行访问。


另外需要注意,如果没有通过--name 显式指定容器名称,则会自动随机生成一个容器名,如此处的容器名 nifty_wing。



此处的 IP 地址为我演示是宿主机的 ip 地址,因此需要改为自己对应的 ip 即可。


此外,我们还可以通过 docker logs 命令查看 python 应用的输出信息,其中 3f6e17415056 为容器的 ID,也可以通过容器名称访问。


[root@docker ~]# docker logs -f 3f6e17415056 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)192.168.78.1 - - [07/Apr/2020 23:38:03] "GET / HTTP/1.1" 200 -192.168.78.1 - - [07/Apr/2020 23:38:03] "GET /favicon.ico HTTP/1.1" 404 -
复制代码


当使用 p(小写)参数时,则可以指定要映射的端口,并且在一个指定端口上只可以绑定一个容器。支持格式为:IP:HostPort:ContainerPort 或 IP:: ContainerPort 或 HostPort:ContainerPort,也就是说除了容器端口必须指定外,宿主机 IP、宿主机端口可以不同时指定。


2.2 映射所有接口地址


使用 HostPort:ContainerPort 格式将本地的 5000 端口映射到容器的 5000 端口, 可以执行如下命令:


[root@docker ~]# docker run -d -p 5000:5000 --name test2 training/webapp python app.py511a5a103216391f5075a3e8c3b841bb104806dbd177fce7db1318a887df9f46[root@docker ~]# docker psCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES511a5a103216        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   test2[root@docker ~]# 
复制代码

此时在通过宿主机 ip:5000 的形式在浏览器再次访问,将看到 2.1 中同样的效果,这样就把容器内的 5000 端口映射到了宿主机的 5000 端口上。


可以通过 docker port 命令查看端口映射


[root@docker ~]# docker port test2 50000.0.0.0:5000[root@docker ~]# 
复制代码

可以看到容器内 5000 端口映射到了宿主机的 0.0.0.0:5000。其中 0.0.0.0 表示任意地址。


由于此处未指定宿主机 ip 地址,因此当有多块网卡或多 IP 的时候,都可以通过这种形式访问到。


2.3 映射到指定地址的指定端口


可以使用 IP:HostPart:ContainerPort 格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1:


[root@docker ~]# docker run -d -p 127.0.0.1:5001:5000 --name test3 training/webapp python app.py4b689b1be9faed3d8b50beac57ce4b5a95899ef38c6ed7bdbcde11a7d2dddebd[root@docker ~]# docker port test3 5000127.0.0.1:5001[root@docker ~]# 
复制代码

此时由于指定的宿主机固定地址为 127.0.0.1,物理主机上将无法直接通过这个地址或宿主机 IP 访问



此外,还可以采用 IP::ContainerPort 的形式,不指定宿主机端口,本地主机会自动分配一个端口。这种方式就不演示了。


三、容器互联互通


本文只讨论 bridge 网络模式下容器之间的相互通信,以后将要讲解的 swarm 模式下,也是可以通过服务名称进行相互通信的。


容器的互联(linking)是一种让多个容器中的应用进行快速交互的方式。它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的 IP 地址。


查看容器名称除了可以用 docker ps 进行查看外,还可以用 docker inspect 命令。前面文章中学习过 docker inspect 命令,它是用于查看容器内部详细信息的,我们可以通过-f 参数来照看指定内容。


[root@docker ~]# docker inspect -f "{{.Name}}" test2      /test2
复制代码

另外,在执行 docker run 的时候如果添加--rm 标记,则容器在终止后会立刻删除。- -rm 和-d 参数不能同时使用。


截至目前为止,我们创建的容器都是采用默认的 bridge 驱动类型的名称为 bridge 的网络,因为如果在创建容器时没有显示通过--net 指定网络,则默认采用 bridge 网络。


这里有个大坑,都是 dridge 驱动类型的网络,默认的 bridge 和自定义的 bridge 两者有些区别,3.1 和 3.2 就是用来演示他们的不同


3.1 bridge 默认网络下容器间互通


默认的 bridge 网络下,使用--link 参数可以让容器之间安全地进行交互。


在操作之前,我们采用如下命令删除之前创建的所有容器


[root@docker ~]# docker rm -f $(docker ps -aq)
复制代码

本例我们通过 training/postgres 和 training/webapp 这 2 个镜像进行演示。其中 postgres 为数据库,webapp 镜像为基于 python 的 web。


先下载对应的镜像


[root@docker ~]# docker pull training/postgres
复制代码
3.1.1 创建 db 容器


[root@docker ~]# docker run -d --name db training/postgres370dd884b187bfc4f91af955270d1695f737d20883fbb9e11601afbc1a98274a[root@docker ~]#
复制代码
3.1.2 创建 web 容器


[root@docker ~]# docker run -d -P --name web --link db:db training/webapp python app.py429c3b111d76948812be1a495ff5eebf4fe8340c540c7633a0fe2e212c35cc74[root@docker ~]# 
复制代码

此时,db 容器和 web 容器建立互联关系。 --link 参数的格式为--link name: alias, 其中 name 是要链接的容器的名称 , alias 是别名。


3.1.3 连通性测试


通过 docker ps 命令查看,相互进入容器 ping 对方容器名称


[root@docker ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                     NAMES429c3b111d76        training/webapp     "python app.py"          22 seconds ago       Up 20 seconds       0.0.0.0:32769->5000/tcp   web370dd884b187        training/postgres   "su postgres -c '/us…"   About a minute ago   Up About a minute   5432/tcp                  db[root@docker ~]# docker exec -it web /bin/bash         root@429c3b111d76:/opt/webapp# ping -c 1 dbPING db (172.17.0.2) 56(84) bytes of data.64 bytes from db (172.17.0.2): icmp_seq=1 ttl=64 time=0.183 ms
--- db ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.183/0.183/0.183/0.000 msroot@429c3b111d76:/opt/webapp# exitexit[root@docker ~]# docker exec -it db /bin/bashroot@370dd884b187:/# ping webping: unknown host webroot@370dd884b187:/# exitexit[root@docker ~]#
复制代码

可以看到在 web 容器内可以 ping 通 db,但是 db 内却 ping 不通 web,因此说明--link 是单向的。


这相当于在两个互联的容器之间创建了一个虚机通道, 而且不用映射它们的端口到宿主主机上。 在启动 db 容器的时候并没有使用 -p 和 -P 标记, 从而避免了暴露数据库服务 端口到外部网络上。


从这个单向性也可以看出,在目前这种默认的 bridge 网络下,如果在创建 web 容器时不通过--link 指定连接,则在 web 内是无法连接到 db 的,可以自己动手验证一下。


3.1.4 link 内部原理


docker 通过两种方式为容器公开连接信息:环境变量和/etc/hosts 文件。


当我们创建容器时,指定--link,实际上 docker 内部会自动做一些事情,才使得容器之间能够互联。


进入 web 容器观察环境变量


[root@docker ~]# docker exec -it web /bin/bash root@1424259bc79d:/opt/webapp# envHOSTNAME=1424259bc79dDB_NAME=/web/dbTERM=xtermDB_PORT_5432_TCP_ADDR=172.17.0.2DB_PORT=tcp://172.17.0.2:5432DB_PORT_5432_TCP=tcp://172.17.0.2:5432...省略部分内容
复制代码

其中 DB—开头的环境变量是供 web 容器连接 db 容器使用, 前缀采用大写的连接别名。


除了环境变量, Docker 还添加 host 信息到父容器的 /etc/hosts 的文件。 下面是父容器 web 的 hosts 文件


root@1424259bc79d:/opt/webapp# cat /etc/hosts...省略部分无关内容172.17.0.2      db d31f1617c99f172.17.0.3      1424259bc79droot@1424259bc79d:/opt/webapp# exitexit[root@docker ~]# 
复制代码

这里有 2 个 hosts 信息, 第一个是 web 容器, web 容器用自己的 id 作为默认主机名, 第二个是 db 容器的 IP 和主机名。


这个过程都是自动的,无需人工干预。这样就实现了容器间的互联。


3.2 bridge 自定义网络下容器间互通


上一节演示了创建容器是不指定网络,采用默认的 bridge 的网络,需要指定--link 才能实现容器间通信。而如果是自定义的 bridge 网络,则无需指定直接就可以通信。


避免干扰,先删除所有容器


[root@docker ~]# docker rm -f $(docker ps -qa)1424259bc79dd31f1617c99f[root@docker ~]# 
复制代码
3.2.1 创建自定义 bridge 网络


[root@docker ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEda812afe6179        bridge              bridge              local28991c6c5348        host                host                local969fd1293425        none                null                local[root@docker ~]# docker network create -d bridge --attachable mybridge12d1d3bc9619d8e5f00785a2ac29eb4a5a1cef06610015e1689eddef79ae47b1[root@docker ~]# docker network lsNETWORK ID          NAME                DRIVER              SCOPEda812afe6179        bridge              bridge              local28991c6c5348        host                host                local12d1d3bc9619        mybridge            bridge              local969fd1293425        none                null                local[root@docker ~]# 
复制代码

创建网络采用 docker network create 命令,-d 参数指定网络驱动类型,--attacheable 指定网络是否可以附加。


3.2.2 创建容器是指定自定义网络


[root@docker ~]# docker run -d --name db --network mybridge training/postgres   9b0fad4485c4fdb08346b1154da4932c4dbf40b20f2af049733bc31edc261638[root@docker ~]# docker run -d -P --name web --network mybridge training/webapp python app.py2aa7fcd3400eafb833aa2473eed4d7ecce532e4f571af380fa3df3c459ad73fc[root@docker ~]# docker psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES2aa7fcd3400e        training/webapp     "python app.py"          10 seconds ago      Up 8 seconds        0.0.0.0:32772->5000/tcp   web9b0fad4485c4        training/postgres   "su postgres -c '/us…"   44 seconds ago      Up 42 seconds       5432/tcp                  db
复制代码
3.2.3 测试容器连通性


[root@docker ~]# docker exec -it db /bin/bashroot@9b0fad4485c4:/# ping -c 1 webPING web (172.18.0.3) 56(84) bytes of data.64 bytes from web.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.101 ms
--- web ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.101/0.101/0.101/0.000 msroot@9b0fad4485c4:/# exitexit[root@docker ~]# docker exec -it web /bin/bashroot@2aa7fcd3400e:/opt/webapp# ping -c 1 dbPING db (172.18.0.2) 56(84) bytes of data.64 bytes from db.mybridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.094 ms
--- db ping statistics ---1 packets transmitted, 1 received, 0% packet loss, time 0msrtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 msroot@2aa7fcd3400e:/opt/webapp# exitexit[root@docker ~]#
复制代码

可以看到不用--link 也可以正常访问,并且是相互能通的。说明自定义 bridge 网络,无须指定--link 参数(如果你指定了也不会报错)直接就可以访问了。


3.3 bridge 自定义网络和默认网络区别


上边两个案例演示了基于 bridge 网络驱动的默认网络和自定义网络之间的区别,在此做一个总结。


按照一般的思维,docker 默认提供的 bridge 网络与用户自定义的 bridge 网络之间,在功能上应该没有什么区别,但实际情况与此相反,两者之间存在着一些不同,假设有两个容器连接在同一个 bridge 网络之上,在网络是默认的与用户自定义的情况下的一些不同点:



本文详细演示了 docker 网络中 bridge 网络驱动模式下默认网络和自定义网络的区别,关于 overlay 网络模式将在以后进行介绍。



自学帮


发布于: 2020 年 07 月 21 日阅读数: 148
用户头像

黑马腾云

关注

程序员、终身学习者、创业者。 2020.06.22 加入

“自学帮”公众号主。

评论

发布
暂无评论
Docker基础修炼6--网络初探及单机容器间通信