Docker 网络-container 模式
容器与主机、容器与容器之间是互相隔离的。同时,我们可以通过配置 docker 网络,为容器创建完全独立的网络命名空间,或者使容器共享主机或者其他容器的网络命名空间,以应对不同场景的需要。
这里有4 种常用的单宿主机网络模式:
- bridge 模式;
- host 模式;
- container 模式;
- none 模式。
本节将介绍网络模式中的 container 模式:
1. container 模式
与 host 模式类似,container 模式可以使一个容器共享另一个已存在容器的网络,此时这两个容器共同使用同一网卡、主机名、IP 地址,容器间通讯可直接通过本地回环 lo 接口通讯。
新运行一个 busybox 的容器 b1,设定它共享已存在的容器 b0 的网络:
docker run -d -t --network container:b0 --name b1 busybox
Tips:端口转发设定以已存在的容器为准,出于安全和权限控制的角度,container 模式下运行的容器设定端口转发不生效。
查看 b0,b1 的网络配置,验证两者的网络配置是否相同:
docker exec b0 ifconfig
docker exec b1 ifconfig
此时的网络拓扑图如下:
container 网络拓扑不再使用的容器记得删除掉,释放资源和空间
docker rm -f b0 b1
nginx 镜像自带的网络命令非常少,查看网络不方便,而 busybox 的网络命令比较齐全,使用 container 模式,可以快速解决这个问题。
我们新运行一个名为 n0 的 nginx 容器,再将它的网络共享给 busybox 容器 n0-net:
docker run -d -t --name n0 nginx
docker run -d -t --network container:n0 --name n0-net busybox
使用 n0-net 容器,执行 docker exec n0-net ip a
进行网络状态查看自身网络信息,也就是 nginx 的网络信息
执行如下命令,通过 localhost 访问 n0 的 web 服务,说明通过 container 模式下,共享的网络中的容器能够使用 lo 访问其他容器的服务。
docker exec n0-net telnet localhost 80
# 在交互中输入
# GET /
#
不再使用的容器记得删除掉,释放资源和空间:
docker rm -f n0 n0-net
2. 小结
在 container 模式下的容器,会使用其他容器的网络命名空间,其网络隔离性会处于 bridge 桥接模式与 host 模式之间:当容器共享其他容器的网络命名空间,则在容器之间不存在网络隔离;而它们又与宿主机以及其他不在此共享中的容器存在网络隔离。