【问题标题】:Docker swarm, listening in container but not outsideDocker swarm,在容器中侦听,但不在外部
【发布时间】:2016-11-10 12:19:41
【问题描述】:

我们有许多 docker 镜像以 swarm 模式运行,但无法让其中一个镜像外部监听。

如果我执行到容器,我可以将 URL 卷曲到 0.0.0.0:8080。

当我查看主机上的网络时,我看到 1 个数据包卡在 Recv-Q 中,用于此侦听端口(但其他正常工作的端口没有。

查看 NAT 规则,我实际上可以在 docker 主机 (docker_gwbridge) 上 curl 172.19.0.2:8084,但不能在实际的 docker-host IP (172.31.105.59) 上卷曲。

我尝试了许多不同的点(7080、8084、8085)并且还停止了 docker,做了一个 rm -rf /var/lib/docker,然后尝试只运行这个容器,但没有运气。关于为什么这不适用于这个容器图像但其他 5 个可以正常工作的任何想法?

Docker 服务

docker service create --with-registry-auth --replicas 1 --network myoverlay \
  --publish 8084:8080 \
  --name containerimage \
  docker.repo.net/containerimage

ss -ltn

State       Recv-Q Send-Q                                              Local Address:Port                                                               Peer Address:Port

LISTEN      0      128                                                 172.31.105.59:7946                                                                          *:*
LISTEN      0      128                                                             *:ssh                                                                           *:*
LISTEN      0      128                                                     127.0.0.1:smux                                                                          *:*
LISTEN      0      128                                                 172.31.105.59:2377                                                                          *:*
LISTEN      0      128                                                            :::webcache                                                                     :::*
LISTEN      0      128                                                            :::tproxy                                                                       :::*
LISTEN      0      128                                                            :::us-cli                                                                       :::*
LISTEN      0      128                                                            :::us-srv                                                                       :::*
LISTEN      0      128                                                            :::4243                                                                         :::*
LISTEN      1      128                                                            :::8084                                                                         :::*
LISTEN      0      128                                                            :::ssh                                                                          :::*
LISTEN      0      128                                                            :::cslistener                                                                   :::*

iptables -n -L -t nat

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER-INGRESS  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.19.0.0/16        0.0.0.0/0
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match src-type LOCAL
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
MASQUERADE  all  --  172.18.0.0/16        0.0.0.0/0

Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

Chain DOCKER-INGRESS (2 references)
target     prot opt source               destination
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8084 to:172.19.0.2:8084
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9000 to:172.19.0.2:9000
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8083 to:172.19.0.2:8083
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.19.0.2:8080
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8081 to:172.19.0.2:8081
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8082 to:172.19.0.2:8082
RETURN     all  --  0.0.0.0/0            0.0.0.0/0

ip a | grep 172.19

inet 172.19.0.1/16 scope global docker_gwbridge

ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP qlen 1000
    link/ether 12:d1:da:a7:1d:1a brd ff:ff:ff:ff:ff:ff
    inet 172.31.105.59/24 brd 172.31.105.255 scope global dynamic eth0
       valid_lft 3088sec preferred_lft 3088sec
    inet6 fe80::10d1:daff:fea7:1d1a/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:55:ae:ff:f5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ce:b5:27:49 brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.1/16 scope global docker_gwbridge
       valid_lft forever preferred_lft forever
    inet6 fe80::42:ceff:feb5:2749/64 scope link
       valid_lft forever preferred_lft forever
23: vethe2712d7@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether 92:58:81:03:25:20 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::9058:81ff:fe03:2520/64 scope link
       valid_lft forever preferred_lft forever
34: vethc446bc2@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether e2:a7:0f:d4:aa:1d brd ff:ff:ff:ff:ff:ff link-netnsid 4
    inet6 fe80::e0a7:fff:fed4:aa1d/64 scope link
       valid_lft forever preferred_lft forever
40: vethf1238ff@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether e6:1a:87:a4:18:2a brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::e41a:87ff:fea4:182a/64 scope link
       valid_lft forever preferred_lft forever
46: vethe334e2d@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether a2:5f:2c:98:10:42 brd ff:ff:ff:ff:ff:ff link-netnsid 6
    inet6 fe80::a05f:2cff:fe98:1042/64 scope link
       valid_lft forever preferred_lft forever
58: vethda32f8d@if57: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether ea:40:a2:68:d3:89 brd ff:ff:ff:ff:ff:ff link-netnsid 7
    inet6 fe80::e840:a2ff:fe68:d389/64 scope link
       valid_lft forever preferred_lft forever
41596: veth9eddb38@if41595: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether fa:99:eb:48:be:b0 brd ff:ff:ff:ff:ff:ff link-netnsid 9
    inet6 fe80::f899:ebff:fe48:beb0/64 scope link
       valid_lft forever preferred_lft forever
41612: veth161a89a@if41611: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker_gwbridge state UP
    link/ether b6:33:62:08:da:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::b433:62ff:fe08:dac4/64 scope link
       valid_lft forever preferred_lft forever

【问题讨论】:

  • 只是为了确定,当您尝试通过其内部 IP 访问容器时,您使用的是 8080 端口而不是 8084 端口,对吗?
  • 正确,这是我们得到的(需要验证消息)curl 0.0.0.0:8080/about The resource requires authentication, which was not supplied with the reques
  • 所以基本上这行得通curl 172.19.0.2:8084/about 而这行不通curl 172.31.105.59:8080/about
  • 不完全是,curl 172.19.0.2:8084/about 有效,但 curl 172.31.105.59:8084/about 无效(均为 8084)。
  • 好的,这是您的容器的正常行为,端口映射仅适用于主机 IP。所以 8080 与容器和 8084 外部因为你的 --publish

标签: linux networking docker docker-swarm


【解决方案1】:

好的,这是您的容器的正常行为,端口映射仅适用于主机 IP。 因此,如果您使用容器 IP,您必须到达端口 8080(您的应用程序的真实端口)。

因为你使用了--publish,所以你容器的8080端口映射到你主机IP的8084端口

【讨论】:

  • 那是行不通的。如果我尝试访问主机 eth0 IP 上的 8084,它不起作用,但是 8080 在容器内工作。
猜你喜欢
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2016-06-14
  • 2019-01-30
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多