自学内容网 自学内容网

docker 同宿主机不同网络容器通信+跨宿主机容器之间网络互连详解

一  同宿主机不同网络容器通信

方法一:使用 Docker 网络连接

  1. 创建一个自定义桥接网络

    • 创建一个新的自定义桥接网络,然后将需要通信的容器连接到这个网络。
    docker network create my_custom_network
  2. 将容器连接到自定义网络

    • 将需要通信的容器连接到同一个自定义网络。
    # 假设有两个容器 container1 和 container2 分别连接到不同的网络
    docker network connect my_custom_network container1
    docker network connect my_custom_network container2
  3. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
    docker exec -it container1 ping container2

方法二:使用端口映射

  1. 将容器的端口映射到宿主机

    • 通过 -p 选项将容器的端口映射到宿主机的端口。
    docker run -d --name container1 -p 8080:80 my_image1
    docker run -d --name container2 -p 8081:80 my_image2
  2. 通过宿主机 IP 地址通信

    • 容器可以通过宿主机的 IP 地址和映射的端口进行通信。
    # 获取宿主机的 IP 地址
    HOST_IP=$(hostname -I | awk '{print $1}')
    
    # 从 container1 访问 container2
    docker exec -it container1 curl http://$HOST_IP:8081

方法三:使用 Docker Compose

  1. 创建一个 Docker Compose 文件

    • 使用 Docker Compose 文件定义多个服务,并将它们连接到同一个网络。
    version: '3'
    services:
      container1:
        image: my_image1
        networks:
          - my_custom_network
      container2:
        image: my_image2
        networks:
          - my_custom_network
    networks:
      my_custom_network:
        driver: bridge
  2. 启动 Docker Compose

    • 使用 docker-compose up 命令启动服务。
    docker-compose up -d
  3. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
    docker exec -it container1 ping container2

方法四:使用 Docker 网络插件

  1. 安装网络插件

    • 使用第三方网络插件,如 Weave Net 或 Flannel,这些插件可以提供更高级的网络功能,包括跨网络的容器通信。
    # 安装 Weave Net
    docker plugin install weaveworks/net-plugin:latest_release
  2. 配置网络插件

    • 按照插件的文档进行配置,将需要通信的容器连接到同一个网络。
    # 使用 Weave Net 创建网络
    docker network create -d weave my_weave_network
    
    # 将容器连接到 Weave 网络
    docker network connect my_weave_network container1
    docker network connect my_weave_network container2
  3. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
    docker exec -it container1 ping container2

 二 跨宿主机容器之间网络互连

1. 覆盖网络(Overlay Network)

覆盖网络是 Docker 内置的一种网络模式,允许多个 Docker 守护进程之间的容器相互通信。这是实现跨宿主机容器网络互连的最常用和推荐的方法。

步骤
  1. 初始化 Docker Swarm(可选,但推荐):

    • 如果你使用 Docker Swarm 模式,首先需要初始化 Swarm。
    # 在其中一个宿主机上初始化 Swarm
    docker swarm init --advertise-addr <宿主机IP>
    • 获取加入 Swarm 的命令,并在其他宿主机上执行。
    # 获取加入命令
    docker swarm join-token worker
    
    # 在其他宿主机上执行加入命令
    docker swarm join --token <TOKEN> <宿主机IP>:2377
  2. 创建覆盖网络

    • 创建一个覆盖网络,指定网络驱动为 overlay
    docker network create --driver overlay my_overlay_network
  3. 启动容器并连接到覆盖网络

    • 在每个宿主机上启动容器,并将它们连接到同一个覆盖网络。
    # 在宿主机1上启动容器
    docker run -d --name container1 --network my_overlay_network my_image
    
    # 在宿主机2上启动容器
    docker run -d --name container2 --network my_overlay_network my_image
  4. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
    docker exec -it container1 ping container2

2. 使用第三方网络插件(Weave Net)

Weave Net 是一个流行的第三方网络插件,提供了易于使用的跨主机网络解决方案。

步骤
  1. 安装 Weave Net

    • 在每个宿主机上安装 Weave Net。
    curl -L git.io/weave -o /usr/local/bin/weave
    chmod +x /usr/local/bin/weave
  2. 启动 Weave Net

    • 在每个宿主机上启动 Weave Net。
    # 在第一个宿主机上启动 Weave Net
    weave launch
    
    # 获取第一个宿主机的 IP 地址
    HOST1_IP=$(hostname -I | awk '{print $1}')
    
    # 在其他宿主机上启动 Weave Net 并连接到第一个宿主机
    weave launch $HOST1_IP
  3. 创建 Weave 网络

    • 创建一个 Weave 网络。
    docker network create -d weave my_weave_network
  4. 启动容器并连接到 Weave 网络

    • 在每个宿主机上启动容器,并将它们连接到同一个 Weave 网络。
    # 在宿主机1上启动容器
    docker run -d --name container1 --network my_weave_network my_image
    
    # 在宿主机2上启动容器
    docker run -d --name container2 --network my_weave_network my_image
  5. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。
    docker exec -it container1 ping container2

3. 使用桥接网络(变通方法)

虽然 Docker 的默认桥接网络(bridge)不支持跨宿主机通信,但可以通过一些变通的方法实现这一点。一种常见的方法是使用路由和 IP 转发。

步骤
  1. 配置 IP 转发

    • 在每个宿主机上启用 IP 转发。
    echo 1 > /proc/sys/net/ipv4/ip_forward
  2. 配置路由

    • 在每个宿主机上配置路由,使容器的流量通过宿主机转发。
    # 假设宿主机1的 IP 地址是 192.168.1.100
    # 宿主机2的 IP 地址是 192.168.1.101
    
    # 在宿主机1上配置路由
    ip route add 172.18.0.0/16 via 192.168.1.101
    
    # 在宿主机2上配置路由
    ip route add 172.17.0.0/16 via 192.168.1.100
  3. 创建自定义桥接网络

    • 在每个宿主机上创建自定义桥接网络。
    docker network create --driver bridge --subnet 172.17.0.0/16 my_custom_bridge
  4. 启动容器并连接到自定义桥接网络

    • 在每个宿主机上启动容器,并将它们连接到同一个自定义桥接网络。
    # 在宿主机1上启动容器
    docker run -d --name container1 --network my_custom_bridge my_image
    
    # 在宿主机2上启动容器
    docker run -d --name container2 --network my_custom_bridge my_image
  5. 验证通信

    • 进入其中一个容器,尝试 ping 另一个容器的 IP 地址。
    docker exec -it container1 ping 172.17.0.2

总结

跨宿主机的容器网络互连可以通过多种方法实现,每种方法都有其特点和适用场景:

  1. 覆盖网络(Overlay Network)

    • 优点:内置支持,易于使用,支持多主机通信和服务发现。
    • 缺点:需要 Docker Swarm 模式。
  2. 第三方网络插件(如 Weave Net)

    • 优点:提供更高级的网络功能,适用于复杂网络需求。
    • 缺点:需要额外安装和配置。
  3. 使用桥接网络(变通方法)

    • 优点:不需要额外的网络插件,适用于简单的跨宿主机通信。
    • 缺点:配置复杂,需要手动设置路由和 IP 转

 还有种docker compose 需要借助 docker swarm 就不介绍了


原文地址:https://blog.csdn.net/m0_66705547/article/details/143023900

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!