Docker容器绑定了端口,但是我无法ping通它。

24

我有一个正在运行的Docker容器(来源于这个镜像)。就我所知,容器似乎运行正确(日志文件看起来不错,可以通过SSH连接到容器并在其中使用SQLPlus)。但是,我无法从我的主机连接到该容器。

我是这样启动容器的:

sudo docker run -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-oracle-xe-11g

我通过以下方式检查端口绑定:

$ sudo docker port <container> 8080
0.0.0.0:49162

当我运行sudo docker inspect <container>命令时,我会得到以下结果:

"NetworkSettings": {
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "Gateway": "172.17.42.1",
    "Bridge": "docker0",
    "PortMapping": null,
    "Ports": {
        "1521/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49161"
            }
        ],
        "22/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49160"
            }
        ],
        "8080/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49162"
            }
        ]
    }
},
当我尝试ping容器时,容器做出了响应:
$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_req=1 ttl=64 time=0.138 ms
64 bytes from 172.17.0.2: icmp_req=2 ttl=64 time=0.132 ms

但是我无法从我的主机(Windows)连接到Docker容器。我在Ubuntu 12.04虚拟机中运行Docker(在Windows上的VirtualBox中)。我不确定这是Docker、我的Linux虚拟机还是VirtualBox的问题。我在VirtualBox中转发了一堆端口:

enter image description here

这是sudo netstat -tpla的结果:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:sunrpc                *:*                     LISTEN      542/rpcbind
tcp        0      0 *:ssh                   *:*                     LISTEN      1661/sshd
tcp        0      0 *:51201                 *:*                     LISTEN      831/rpc.statd
tcp        0     80 docker:ssh              10.0.2.2:62220          ESTABLISHED 1902/sshd: vagrant
tcp6       0      0 [::]:49160              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:49161              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:56105              [::]:*                  LISTEN      831/rpc.statd
tcp6       0      0 [::]:49162              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN      542/rpcbind
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1661/sshd

我为什么无法从Windows连接到正在运行的Docker容器?

2个回答

14

更新:

您的配置看起来没问题,但我认为端口 49160-49162 应该绑定到 IPv4 接口而不是 IPv6。我在谷歌上搜到了这个问题,似乎您遇到了 Docker 的一个开放性 bug:

我看到你的问题有两种解决方案:

  1. 完全禁用 Ubuntu 虚拟机上的 IPv6
  2. 或者直接绑定到 IPv4 地址:-p 172.17.42.1:49162:8080

编辑前答案:

您不能使用 ping 操作来测试端口,因为 ping 使用的是 ICMP 协议。

如果无法连接到已发布的端口,则可以检查 Docker 容器内特定服务是否绑定到正确的网络接口(例如 0.0.0.0)而不是 localhost。 您可以使用 netstat -tpla 命令检查容器中所有正在监听的端口。


啊哈,好的,我明白了:D 当我对容器的 IP 地址执行 ping 172.17.0.2 时,我得到了预期的响应。但我仍然无法连接它… 我编辑了我的问题。 - Thomas Uhrig
@ThomasUhrig 我已经更新了答案。如果它解决了你的问题,请告诉我。 - Jiri
嗯,不幸的是,这并没有解决问题。我认为这必须是与我的网络配置有关的其他问题...我刚刚下载了一个新的Ubuntu映像(也是Ubuntu 12.04),安装了Docker和Oracle-XE映像 - 它可以工作。它还绑定到IPv6(sudo netstat -tpla的输出完全相同),但它以某种方式工作。我可以从我的Linux VM以及我的Windows主机访问容器。但我仍然不知道我的问题的真正来源...无论如何,感谢您的帮助!现在它可以工作 :) - Thomas Uhrig
你可能需要连接 Docker 实例。 - Efox

2
当你在Windows上运行Docker时,结构如下:
Windows machine [
  Docker Virtual Box VM [ 
    Container1,
    Container2,
    ...
  ]
]

当您在容器中暴露端口并使用-p参数将其绑定到主机机器上的所有地址时,该端口实际上是在docker虚拟机VM中公开,而不是在Windows机器上。
例如,当您运行以下命令时:
docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306  SomeImage:V1

在Windows命令提示符中运行netstat命令。 奇怪的是,您将看不到localhost:43306端口处于LISTEN模式。

现在从boot2docker控制台运行boot2docker ssh以登录Docker虚拟机VM,然后运行netstat命令。 哇……你会发现localhost:43306列在Docker虚拟机VM上。

解决方法:

进入Virtual Box VM后,运行ipconfig命令并找到VM的IP地址。 在运行docker命令时使用此IP,而不是127.0.0.1。 这种解决方法的缺点是,DHCP服务器有时会通过每次启动boot2docker虚拟盒子VM分配不同的IP地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接