Networking 如何使docker容器宿主不可知

Networking 如何使docker容器宿主不可知,networking,docker,Networking,Docker,我想要此配置: webcontainer1 / / haproxy_container \ \ webcontainer2 这三个组件都是docker容器。 是的,我可以链接它们,并将容器名称放入haproxy配置,只要所有3个都在同一台主机上,一切都可以正常工作 但是,我希望

我想要此配置:

                   webcontainer1
                  /
                 /
haproxy_container 
                 \ 
                  \
                   webcontainer2
这三个组件都是docker容器。 是的,我可以链接它们,并将容器名称放入haproxy配置,只要所有3个都在同一台主机上,一切都可以正常工作

但是,我希望能够根据需要将我的WebContainer移动到其他主机,而不必更改haproxy的配置

换句话说,我希望我的配置与我的web容器运行的位置无关:不管是否是同一个主机,我希望它们可以简单地通过名称ping

怎么做

另外,我知道如何将端口从一个容器转发到另一个主机,并且我知道我可以将我的WebContainer的名称替换为我要将其移动到的主机的名称—这不符合回答的条件


我们的目标是在不更改任何配置的情况下自由移动设备。

我使用下一种方法运行与自己的静态IP绑定的大多数停靠服务:

  • 我为docker主机上的所有服务创建ip别名
  • 然后我运行每个服务,将端口从这个ip重定向到容器中,这样每个服务都有自己的静态ip,外部用户和其他容器可以使用它
  • 所有容器都使用IP或域名来访问其他容器
  • 现在,我可以将容器(带有ip别名)移动到任何其他docker主机,所有其他容器都将继续使用它—无需触摸它们

    样本:

    docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
    docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
    docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
    docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
    ...
    
    回答评论(因为评论太长):

    1) 正确-我甚至不需要知道容器的ip-我使用静态ip地址来处理容器中的服务

    2) 是的,容器不能ping,只有必要的端口暴露在那里

    3) 是单个接口的附加ip地址


    作为映射到ip别名的每个容器的必要端口,我不需要知道关于容器的任何其他信息,我只是使用ip:port(或name:port)来处理它。其他好处-我有多个容器映射同一主机中的暴露端口80-我不需要使用代理或不同的端口:并且正在工作-因为它们有不同的ip地址(这是别名,我可能有很多)。还有另一种方法,将主机容器视为子网。如果我理解正确,您希望至少有两个子网。您需要一种连接这些子网的方法,这意味着您必须更改默认设备docker0的子网。这就是我所尝试并成功的:

  • 停止docker:
    • 主机1:
      服务停靠站
    • 主机2:
      服务停靠站
  • 从POSTROUTING链中删除现有的伪装规则:
    • 主机1:
      iptables-t nat-F后路由
    • 主机2:
      iptables-t nat-F后路由
  • 从docker网桥中删除现有IP地址:
    • 主机1:
      ip链接设置dev docker0关闭和ip地址删除172.17.42.1/16 dev docker0
    • 主机2:
      ip链接设置dev docker0关闭和ip地址删除172.17.42.1/16 dev docker0
  • 选择子网:
    • 主机1:
      ip地址添加192.168.3.1/24 dev docker0和&ip链接设置dev docker0向上和&ip地址显示docker0
    • 主机2:
      ip地址添加192.168.4.1/24 dev docker0和&ip链接设置dev docker0向上和&ip地址显示docker0
  • 启动docker:
    • 主机1:
      service docker start
    • 主机2:
      service docker start
  • 验证是否已使用新子网的伪装规则更新后路由链:

    • 主机1:
      iptables-tnat-L-n
    • 主机2:
      iptables-tnat-L-n
  • 连接两个主机子网:

    • 主机1:
      ip路由通过192.168.1.2 dev eth0添加192.168.3.0/24
    • 主机2:
      ip路由通过192.168.1.3 dev eth0添加192.168.4.0/24
  • 用于创建群集:

    • 主机1:
      农奴代理人
    • webcontainer1:
      serf代理-h=webcontainer1
    • 主机2:
      农奴代理人
    • webcontainer2:
      serf代理-h=webcontainer2
    • haproxy1:
      serf-agent-h=haproxy1
  • haproxy,您可以使用以下脚本使用主机的IP更新/etc/hosts。使用serf,您不能使用重复的名称加入群集:
  • #/bin/bash
    updatehosts()
    {
    sed-i's/\+#serf/'/etc/hosts
    serf成员| sed's/:.\+$//g'| grep-v`hostname`| awk'{print$2”“$1'#serf'}>>/etc/hosts
    }
    中的案例“${SERF_EVENT}”
    成员(加入)
    更新主机
    ;;
    会员假期)
    更新主机
    ;;
    成员(失败)
    更新主机
    ;;
    以撒
    
    我看到的最后配置主机而不是容器的唯一部分是子网部分,但您也可以在具有适当权限的容器中进行配置


    我希望这能有所帮助

    我需要澄清一下这一点。1) 您显示的ip似乎表示主机接口,而不是分配给容器的ip,如果我的读取正确的话2)我看不出您的容器如何可以通过容器主机名ping,因为您甚至没有使用--host 3)将主机名分配给您的容器,“我创建ip别名”是什么意思-我不太明白this@dmitry-z、 修改答案,因为回复太长,无法评论。谢谢。您能否演示如何创建IP别名,特别是如何选择IP号码?这取决于您的网络。如果我们谈论的是非公共地址-它们应该与机箱的主ip位于同一子网中(因此不需要对其他机箱进行额外配置),但不在dhcp范围内,以避免冲突。在上面的示例中,子网是172.16,专门用于docker容器的子网是172.16.177。如果您的子网是192.160.0.*,那么别名也应该从192.160.0开始,因此您可以在主机A上的/etc/sysconfig/network scripts/(如果是RHEL etc)中添加IP别名