您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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. 小结

使用端口映射访问容器是常用的方式之一,它配置简单,通用性强,可以跨宿主机访问,基本覆盖个人日常使用的场景,但它仍有一些缺陷。


联系我
置顶