Docker 网络必知

2024-01-02 17:06:55 浏览数 (2)

近日见闻

  1. 前几天,跨平台桌面应用开发工具 Electron v28.1.0 发布。
  2. 微软 Bing Chat 接入 GPT-4 Turbo 模型,不过据说是部分测试用户才能体验,所以可以关注下自己的微软搜索,是不是在测试之列,因为测试用户是随机的。
  3. 句子摘抄
代码语言:javascript复制
总以为时间是个小偷,

将我们拥有的一切偷走,

从不曾给我们机会。

但我们错了,他总是先给予再拿走。

每一分,每一秒,都是馈赠。


——《爱丽丝梦游仙境》

Docker 网络知识必知

在深入了解 Docker 之前,我们需要明确容器是如何在网络上进行通信的。Docker 网络是一个非常重要的主题,因为它决定了容器如何相互通信,以及容器如何与外部网络交互。在这篇文章中,我们将探讨 Docker 网络的几个关键概念,并通过实例来加深理解。

Docker 网络的类型

Docker 默认提供了几种网络驱动模式,让您可以选择适合您应用程序的网络类型:

  1. Bridge 网络默认情况下,当你启动一个容器时,它会自动连接到一个名为bridge的私有内部网络。每个使用 bridge 的容器都会获得一个内部 IP 地址,容器可以使用这些 IP 进行彼此通信。外部通信必须通过端口映射。
  2. Host 网络如果你希望容器更直接地使用主机的网络堆栈,你可以使用 host 网络。这样容器不会获得自己的 IP,而是直接使用宿主机的 IP 地址。
  3. Overlay 网络对于那些需要在多台 Docker 宿主机上运行的容器,overlay 网络允许容器跨主机边界进行通信。
  4. Macvlan 网络Macvlan 允许您为容器分配 MAC 地址,就像是真实的物理设备一样,使得容器能够直接出现在物理网络上。
  5. None 网络如果你不希望容器有网络连接,可以选择none网络。

在 CentOS 7.9 上安装 Docker 后,Docker 会默认创建三种网络类型:bridge、none 和 host。我们重点关注最常用的 bridge 网络模式。

Bridge 网络

当你在没有指定网络模式的情况下启动 Docker 容器时,容器会自动连接到名为docker0的默认桥接网络。docker0是一个虚拟的以太网桥接,它自动分配给每个容器一个内网 IP 地址。

要查看默认的docker0桥接网络,在 CentOS 7.9 系统的终端中输入以下命令:

代码语言:javascript复制
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/16172.18.0.0/16172.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.1192.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

注:您应该看到bridgehostnone等默认网络。

步骤 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 网络。如果您认为这篇文章有用,请不要忘记点击关注和分享给更多的技术爱好者。

0 人点赞