Docker 网络 - container 模式

容器与主机、容器与容器之间是互相隔离的。同时,我们可以通过配置 docker 网络,为容器创建完全独立的网络命名空间,或者使容器共享主机或者其他容器的网络命名空间,以应对不同场景的需要。

这里有4 种常用的单宿主机网络模式:

  1. bridge 模式;
  2. host 模式;
  3. container 模式;
  4. 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 模式之间:当容器共享其他容器的网络命名空间,则在容器之间不存在网络隔离;而它们又与宿主机以及其他不在此共享中的容器存在网络隔离。