近日见闻
- 前几天,跨平台桌面应用开发工具 Electron v28.1.0 发布。
- 微软 Bing Chat 接入 GPT-4 Turbo 模型,不过据说是部分测试用户才能体验,所以可以关注下自己的微软搜索,是不是在测试之列,因为测试用户是随机的。
- 句子摘抄
总以为时间是个小偷,
将我们拥有的一切偷走,
从不曾给我们机会。
但我们错了,他总是先给予再拿走。
每一分,每一秒,都是馈赠。
——《爱丽丝梦游仙境》
Docker 网络知识必知
在深入了解 Docker 之前,我们需要明确容器是如何在网络上进行通信的。Docker 网络是一个非常重要的主题,因为它决定了容器如何相互通信,以及容器如何与外部网络交互。在这篇文章中,我们将探讨 Docker 网络的几个关键概念,并通过实例来加深理解。
Docker 网络的类型
Docker 默认提供了几种网络驱动模式,让您可以选择适合您应用程序的网络类型:
- Bridge 网络默认情况下,当你启动一个容器时,它会自动连接到一个名为
bridge
的私有内部网络。每个使用 bridge 的容器都会获得一个内部 IP 地址,容器可以使用这些 IP 进行彼此通信。外部通信必须通过端口映射。 - Host 网络如果你希望容器更直接地使用主机的网络堆栈,你可以使用 host 网络。这样容器不会获得自己的 IP,而是直接使用宿主机的 IP 地址。
- Overlay 网络对于那些需要在多台 Docker 宿主机上运行的容器,overlay 网络允许容器跨主机边界进行通信。
- Macvlan 网络Macvlan 允许您为容器分配 MAC 地址,就像是真实的物理设备一样,使得容器能够直接出现在物理网络上。
- None 网络如果你不希望容器有网络连接,可以选择
none
网络。
在 CentOS 7.9 上安装 Docker 后,Docker 会默认创建三种网络类型:bridge、none 和 host。我们重点关注最常用的 bridge 网络模式。
Bridge 网络
当你在没有指定网络模式的情况下启动 Docker 容器时,容器会自动连接到名为docker0
的默认桥接网络。docker0
是一个虚拟的以太网桥接,它自动分配给每个容器一个内网 IP 地址。
要查看默认的docker0
桥接网络,在 CentOS 7.9 系统的终端中输入以下命令:
ip addr show docker0
通常,你会看到docker0
被分配了一个 172.17.0.1/16 的 IP 地址。
为什么默认使用172.17.0.0/16?
选择172.17.0.0/16
网段作为默认网段的原因是多方面的:
- 冲突最小化:
172.16.0.0/16
中的网段相对不常用于家庭或小型办公环境,这降低了与现有网络冲突的可能性。相比之下,192.168.x.x
网段在家庭和商用路由器中更为常见。 - 规模考量:
172.17.0.0/16
网段能够提供65534个有效主机地址,这对大多数本地部署来说是足够的。
为什么不默认使用192.168.1.0/24?
- 通用性:
192.168.1.0/24
网段在家庭和小型企业网络中非常常见,因此Docker避免使用它作为默认设置,以减少与现有网络发生冲突的风险。 - 网络规模:
/24
子网只能提供254个有效主机地址,对于一些大型部署来说可能不够用。
在实际操作中,您应当根据实际情况选择合适的网段。
如何自定义docker网段
IPAM(IP地址管理)是一个用来规划、跟踪和管理网络空间中IP地址使用情况的方法或者工具。在Docker中,IPAM负责为容器和网络自动分配IP地址和路由,这可以简化容器部署和网络管理的复杂性。
Docker的IPAM有其默认的配置,但也可以自定义IPAM配置以适应特定的网络需求。这包括指定子网、网关、IP范围等。
Docker IPAM的默认行为
当创建一个Docker网络但不指定任何IPAM配置时,Docker会使用默认的IPAM驱动来分配网络地址。对于桥接和覆盖网络,Docker会选择172.17.0.0/16
、172.18.0.0/16
、172.19.0.0/16
等默认网段,每个新的网络都会选择一个不冲突的网段。对于每个网络来说,.1
地址通常被分配给网络网关。
自定义IPAM配置
在创建自定义Docker网络时,您可能需要使用自己的IPAM配置。这里是一个使用自定义IPAM配置创建Docker网络的例子:
代码语言:javascript复制sudo docker network create
--driver=bridge
--subnet=192.168.1.0/24
--ip-range=192.168.1.0/26
--gateway=192.168.1.1
my_custom_network
在这个例子中:
--subnet
定义了网络的子网,所有容器的IP地址都将从这个子网中分配。--ip-range
限制了Docker分配容器IP的范围。在此例中,只有从192.168.1.1
到192.168.1.62
的IP地址会被分配给容器。--gateway
定义了子网的网关地址。容器将使用这个地址作为默认网关。
通过自定义IPAM配置,您可以非常精确地控制Docker网络的IP地址使用,这对于满足特定的网络策略和规划非常有用。
实例:在 CentOS 7.9 上配置自定义 Bridge 网络
现在让我们通过一个实例来演示如何在 CentOS 7.9 中创建一个自定义的 bridge 网络,并在该网络中启动两个容器进行通信。
步骤 1:安装 Docker
代码语言:javascript复制# 安装Docker
sudo yum install -y docker
# 启动Docker服务
sudo systemctl start docker
# 设置Docker服务开机自启
sudo systemctl enable docker
步骤 2:查看默认网络配置
安装 Docker 后,系统会自动创建几种默认的网络。使用以下命令查看:
代码语言:javascript复制# 查看现有的Docker网络
sudo docker network ls
注:您应该看到bridge
、host
和none
等默认网络。
步骤 3:创建自定义 Bridge 网络
自定义网络提供了更好的管理和隔离能力。创建自定义 bridge 网络的命令如下:
代码语言:javascript复制# 创建自定义bridge网络
sudo docker network create --driver bridge my-bridge-network
这个命令创建了一个新的网络,名为my-bridge-network
,使用 bridge 驱动。
步骤 4:运行容器并连接至网络
接下来,启动两个容器,并将它们连接到新建的网络:
代码语言:javascript复制# 在自定义网络中启动容器1
sudo docker run -dit --name container1 --network my-bridge-network alpine ash
# 在自定义网络中启动容器2
sudo docker run -dit --name container2 --network my-bridge-network alpine ash
这里我们使用了 Alpine Linux 镜像,并以交互式终端模式(-it
)运行ash
shell。
步骤 5:探索网络配置
为了详细了解网络配置,您可以检查网络信息:
代码语言:javascript复制# 查看自定义网络的详细信息
sudo docker network inspect my-bridge-network
此命令会列出网络的配置,包括容器的 IP 地址、网关和网络名称等。
步骤 6:测试容器间通信
现在,我们来测试一下两个容器是否能够在网络中相互通信:
代码语言:javascript复制# 进入container1的终端
sudo docker exec -it container1 /bin/ash
# 在container1内部ping container2
ping container2
ping
命令应该能成功显示来自container2
的响应包,这表明两个容器能够通过自定义的 bridge 网络相互通信。
步骤 7:端口映射(可选)
如果您的容器运行了 web 服务或需要暴露端口给外界,可以在启动容器时设置端口映射:
代码语言:javascript复制# 启动一个容器并映射端口
sudo docker run -dit --name mywebserver -p 8080:80 --network my-bridge-network nginx
在这个例子中,我们将容器内的 80 端口映射到了宿主机的 8080 端口,通过宿主机的 IP 和 8080 端口即可访问容器内的 nginx 服务。
总结
通过以上详细步骤,展示了如何在 CentOS 7.9 系统上管理和操作 Docker 网络。从创建自定义网络到容器间通信,可以感受和了解到 Docker 网络的灵活性和强大功能。
希望这篇指南能够帮助你更好地理解 Docker 网络。如果您认为这篇文章有用,请不要忘记点击关注和分享给更多的技术爱好者。