Docker 的两个 Container,无法通过 [主机 ip:port] 互相 curl

查看 80|回复 7
作者:KratosOmega   
我的 Docker 有两个运行中的 Container 容器:
[ol]

  • Jenkins:
  • ip:192.168.0.220:10240
  • 名称:myjenkins

  • Gitlab:
  • ip:192.168.0.220:10082
  • 名称:mygitlab

    [/ol]
    (主机 ip 为:192.168.0.220)
    经过一次 [公司的网络改造] 后,发现这两个容器无法通过 [主机 ip:port ] 的方式 curl ,但是可以 ping 得通。以下为一些表现,求大家帮忙找找问题。(注:网络改造前,完全是可以通过 [主机 ip:port ] 互相访问的)。
    在 jenkins 容器上:
    [ol]
  • ping gitlab ip: ping 192.168.0.220:10082。没有问题。
  • curl gitlab ip: curl 192.168.0.220:10082。一直没反应。
  • curl gitlab 容器名称+port:curl http://mygitlab:3000。没有问题。(由于 gitlab 与 Jenkins 容器处于同一个 bridge network 当中,所以可以通过容器名称访问。其中 3000 为 gitlab 自身的端口号)
    [/ol]
    在主机上:
    [ol]
  • ping gitlab ip: ping 192.168.0.220:10082。没有问题。
  • curl gitlab ip: curl 192.168.0.220:10082。没有问题。
    [/ol]
    麻烦大家帮忙看看,为什么这两个容器没法通过 [主机 ip:port ] 互相 curl ?
  • whileFalse   
    ping 还能带端口呢?
    winterpotato   
    1. 假设你的容器网络为 bridge network ,那么容器之间要 link,才能互相通过对方的 hostname 访问(你也提到了这点)
    2. bridge network 情况下,需要通过 -p 发布端口到宿主机的某个接口,宿主机外面才能访问
    3. bridge network 下,容器如果想要访问宿主机(的某个服务),那么一般会选择 docker0 也就是 172.17.0.1 ,当然选择 host 的某个网卡 IP 也行,只是不那么靠谱因为可能会变。
    4. ping 没有端口的啦
    根据你的现象总结,可能需要检查下
    1. publish port 的写法以及 host 的 IP
    2. 是否新增 iptables 规则,docker 是靠的 iptables
    DefoliationM   
    ping 是 icmp ,http 是 tcp ,完全两个东西,并不能说明一个行则另一个必须行。
    KratosOmega
    OP
      
    @whileFalse #1 不知道啊,计算机网络不怎么懂
    KratosOmega
    OP
      
    @winterpotato #2 感谢大佬。
    但是,我们公司 [网络改造] 之前,jenkins 容器是完全可以通过 [主机 ip:port] 的方式访问 gitlab 的,现在确不行了。
    -p 规则检查过了,现在宿主机外面访问完全没问题了。比如:宿主机外 192.168.0.220:10082 是完全可以访问 gitlab 的。
    我周一去检查一下 iptables 规则。
    KratosOmega
    OP
      
    @DefoliationM #3 那 http 不行怎么办呢?我们 [网络改造] 前,是完全行的。
    wheat0r   
    简单了解一下 tcp/ip 模型,然后了解一下 docker 的网络,你就知道了。
    不解释的情况下,请使用容器名互访。
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部