Docker 容器网络互联及网络别名

以下是 Docker 容器网络互联及网络别名 的详细解析和实验指导:


1. 什么是 Docker 容器的网络互联?

1.1 简介

  • Docker 容器在运行时,默认通过 虚拟网桥(如 docker0 实现网络通信。
  • 每个容器会自动分配一个独立的 IP 地址,容器之间可以通过 IP 地址进行通信。
  • 但如果一个容器的 IP 地址发生变化(例如容器重启或删除后重新创建),其他容器可能会无法访问。

1.2 四种网络模式

  1. 桥接模式(Bridge,默认模式):

    • 容器通过虚拟网桥(docker0)与宿主机和其他容器通信。
    • 容器会分配独立的 IP 地址,默认隔离。

    命令:

    docker run --net=bridge [OPTIONS]
  2. 主机模式(Host):

    • 容器与宿主机共享网络栈,容器不分配独立 IP 地址。
    • 容器使用宿主机的 IP 和端口,性能较高,但不隔离。

    命令:

    docker run --net=host [OPTIONS]
  3. 容器模式(Container):

    • 新的容器共享另一个已存在容器的网络栈。
    • 两个容器共享同一个 IP 地址和端口。

    命令:

    docker run --net=container:<container_name_or_id> [OPTIONS]
  4. 无网络模式(None):

    • 容器完全隔离,没有网络连接。

    命令:

    docker run --net=none [OPTIONS]

2. Docker 网络基础

2.1 Docker 默认网络(桥接模式)

  • 安装 Docker 后,会自动创建一个虚拟网桥 docker0
  • docker0 网桥的典型特点:
    1. 默认 IP 地址:172.17.0.1
    2. 子网掩码:/16
    3. 每个运行的容器会通过 虚拟网卡设备对(vethdocker0 网桥连接。
      • 一个接口在容器中,另一个接口在宿主机上。
    4. 容器之间可以通过 172.17.x.x 的 IP 地址通信。

2.2 查看 Docker 网络

  1. 检查 docker0 网桥:

    ip addr show docker0
  2. 安装网桥管理工具:

    yum install -y bridge-utils
  3. 使用 brctl 查看网桥配置:

    brctl show

    输出示例:

    bridge name bridge id STP enabled interfaces
    docker0 8000.0242ac110001 no veth1c2b4c0
    veth2d3f4e1
    • docker0 是虚拟网桥。
    • 每个 veth 接口对应一个正在运行的容器。

3. 容器互联实验

以下是演示 Docker 容器间的网络通信及设置网络别名的实验过程:


3.1 创建两个容器

  1. 创建第一个容器(test1):

    docker run -itd --name test1 centos
  2. 创建第二个容器(test2):

    docker run -itd --name test2 centos
  3. 查看所有运行中的容器:

    docker ps

3.2 检查容器 IP 地址

  1. 进入 test1 容器,查看其 IP:

    docker exec -it test1 bash
    ip addr

    示例输出:

    3: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    • test1 的 IP 地址是:172.17.0.2
  2. 进入 test2 容器,查看其 IP:

    docker exec -it test2 bash
    ip addr
    • test2 的 IP 地址是:172.17.0.3

3.3 测试容器间的通信

  1. 进入 test2 容器,Ping test1 容器的 IP 地址:

    ping 172.17.0.2
    • 如果成功,说明容器间通过默认桥接网络可以通信。

3.4 容器重启后 IP 变化问题

  1. 删除并重新启动 test1 容器:

    docker rm -f test1
    docker run -itd --name test1 centos
  2. 再次查看 test1 的 IP 地址:

    docker exec -it test1 bash
    ip addr
  3. 新 IP 地址可能发生变化(例如:172.17.0.4)。

    • 如果 test2 容器尝试访问旧 IP 将失败。

4. 设置 Docker 网络别名

4.1 什么是网络别名?

  • 网络别名是为容器创建的一个友好名称,容器间可以通过这个别名直接访问,而无需关心 IP 地址变化。
  • 类似于域名的作用。

4.2 实验:使用网络别名

  1. 删除旧容器:

    docker rm -f test1 test2
  2. 创建一个自定义网络:

    docker network create my_network
  3. 运行容器 test1 并设置网络别名:

    docker run -itd --name test1 --net=my_network --network-alias=webserver centos
  4. 运行容器 test2 并加入同一个网络:

    docker run -itd --name test2 --net=my_network centos
  5. 测试别名通信:

    • 进入 test2 容器:

      docker exec -it test2 bash
    • Ping test1 容器的网络别名:

      ping webserver
      • 成功说明:通过别名可以直接访问容器。
  6. 即使 test1 的 IP 变化,test2 仍然可以通过 webserver 访问。


5. 总结

  1. 默认网络:

    • Docker 默认使用桥接模式,容器间通过 IP 地址通信。
    • 容器重启或删除后重新启动,IP 地址可能发生变化。
  2. 网络别名解决方案:

    • 使用 网络别名,避免因 IP 地址变化导致通信失败。
    • 配置步骤:
      1. 创建自定义网络。
      2. 运行容器时指定 --network-alias 参数。
  3. 场景推荐:

    • 测试环境: 使用默认桥接模式(docker0)。
    • 生产环境: 使用自定义网络,并设置网络别名。

posted @   皇帽讲绿帽带法技巧  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示