Docker 网络 bridge 模式
容器与主机、容器与容器之间是互相隔离的。同时,我们可以通过配置 docker 网络,为容器创建完全独立的网络命名空间,或者使容器共享主机或者其他容器的网络命名空间,以应对不同场景的需要。
这里有4 种常用的单宿主机网络模式:
bridge 模式;
host 模式;
container 模式;
none 模式。
本节将介绍网络模式中的 bridge 模式。
1. bridge 模式
Docker 服务启动时,会在宿主机上创建 docker0 虚拟网桥 (Linux Bridge, 可以理解为软件虚拟出来的交换机)。它会在挂载到它的网口之间进行转发。同时 Docker 分配可用的私有 IP 地址给 docker0 接口。如果容器使用认网络参数启动,那么它的网口也会分配与 docker0 同网段的 IP 地址。
我们使用命令 @H__31@ip address show dev docker0 docker0 网络信息,它的地址是 172.17.0.1, 子网掩码为 255.255.0.0,如下图所示:
我们来做个测试,看看认新建的容器是否能互相连通。
使用 busy@R_516_2@ 镜像分别运行 b0,b1 两个容器:
docker run -d -t --name b0 busy@R_516_2@ docker run -d -t --name b1 busy@R_516_2@
容器新建并运行成功后,查看两个容器的 IP 地址:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' b0 # 172.17.0.2 docker inspect --format '{{ .NetworkSettings.IPAddress }}' b1 # 172.17.0.3
Tips:的 IP 是的,跟 Docker 版本与运行环境有关,以自己的 IP 为准,下同
两个容器互相 ping 一下,证明它们的网络能连通:
docker exec -it b0 ping 172.17.0.3 docker exec -it b1 ping 172.17.0.2
此时网络拓扑结构如下所示:
容器 b1 之后用不到,我们可以先它来释放资源。
除了使用认 docker0 做网桥,我们还可以使用 @H__31@docker network 相关命令网桥:
这里将创建网桥 @H__31@br0,设定网段是 @H__31@172.71.0.0/24,网关为 @H__31@172.71.0.1:
docker network create -d bridge -- '172.71.0.0/24' --gateway '172.71.0.1' br0# -d 指定管理网络的驱动方式,认为bridge# -- 指定子网网段# --gateway 指定认网关
使用命令 @H__31@docker network ls 查看当前的 docker 网络列表,发现新增的 br0 网桥。
接下来,我们尝试在使用这个网桥 br0 来新建运行两个容器,并测试它们的连通性。使用 busy@R_516_2@ 镜像分别运行 b2,b3 两个容器:
docker run -d -t --network br0 --name b2 busy@R_516_2@ docker run -d -t --network br0 --name b3 busy@R_516_2@
容器新建并运行成功后,分别执行下列命令,互相 ping 一下验证网络连通:
docker exec b2 ping b3 docker exec b3 ping b2
ping 测试过程中,输入的并不是 IP,而是容器名。在网桥中,容器名会在需要的时候解析到对应的 IP,也了容器重启可能导致 IP 变动的问题。
不再使用的容器记得掉,释放资源和空间
docker rm -f b2 b3 docker network rm br0 # 的网桥
将宿主机的本地端口,与指定容器的服务端口进行映射绑定,之后访问宿主机端口时,会将请求转发到容器的端口上,实现外部对容器内网络服务的访问。
创建名为 n0 的 容器,映射宿主机 8000 端口到它的 80 端口
docker run -d -t -p 8000:80 --name n0
Tips:指定的宿主机端口必须是未被占用的端口,否则操作会失败,且无法正常启动的容器 n0, 需要手动。
使用 @H__31@docker port n0 查看 n0 的端口映射信息,如下:
80/tcp -> 0.0.0.0:8000
打开浏览器,地址栏输入 或 http:// 宿主机 IP:8000, 都能访问到 n0 的 服务。
如果需要绑定多个容器端口,可以连续使用 @H__31@-p 参数多次指定
docker run -d -t -p 8001:80 -p 8433:443 --name n1 ngin
如果不想主动指定宿主机端口,可以使用 @H__31@-P 参数,宿主机使用可用端口与容器端口进行映射
docker run -d -t -P --name n2
如果只想使用宿主机上特定的网口与容器进行映射
docker run -d -t -p 192.168.1.13:8002:80 --name n3
Tips:此处 @H__31@192.168.1.13 指代 宿主机映射网口的 IP 地址,需要根据网口的实际 IP 更改 *。
我们执行 @H__31@docker ps 可能出现如下几个的 容器:
比对上面两个的,不难发现,这种端口转发方式的本质是通过配置 iptables 规则转发实现的,效率较低,如果容器的服务端口过多,需要配置较多的映射,占用大量宿主机端口,也不便于管理。
不再使用的容器记得掉,释放资源和空间
docker rm -f n0 n1 n2 n3
2. 小结
使用端口映射访问容器是常用的方式之一,它配置简单,通用性强,可以跨宿主机访问,基本覆盖个人日常使用的场景,但它仍有一些缺陷。