Networking Docker容器绑定到端口,但我无法ping它

Networking Docker容器绑定到端口,但我无法ping它,networking,ubuntu,ping,docker,Networking,Ubuntu,Ping,Docker,我有一个正在运行的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.

我有一个正在运行的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
当我尝试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中转发了大量端口:

这是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容器吗?更新:

您的配置在我看来似乎还可以,但我认为端口
49160-49162
应该绑定到IPv4接口,而不是IPv6。我在谷歌上搜索了这个,你似乎在docker中遇到了一个开放的bug:

我认为有两种方法可以解决您的问题:

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

  • 编辑前回答:

    你不能ping端口。Ping正在使用ICMP协议


    如果无法连接到已发布的端口,可以检查docker容器中的特定服务是否绑定到正确的网络接口(即
    0.0.0.0
    )而不是
    localhost
    。您可以检查容器中的所有侦听端口:
    netstat-tpla

    当您在windows中运行docker时,构造如下

    Windows machine [
      Docker Virtual Box VM [ 
        Container1,
        Container2,
        ...
      ]
    ]
    
    因此,当您在容器中公开一个端口并将其绑定到主机中的所有地址(比如使用
    -p
    参数)时,该端口实际上在docker virtual box VM中公开,而不是在windows计算机上公开

    比如说你跑步

    docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306  SomeImage:V1
    
    从windows命令提示符运行
    netstat
    命令。奇怪的是,在
    LISTEN
    模式下,您不会看到
    localhost:43306
    端口

    现在从
    boot2docker
    控制台执行
    boot2docker ssh
    以登录到docker虚拟机 运行
    netstat
    命令。沃拉。。。。。您将在docker虚拟机上找到列出的
    localhost:43306

    解决办法:

    进入虚拟机后,运行
    ipconfig
    命令并找出虚拟机的IP地址。在run docker命令中使用此IP,而不是
    127.0.0.1

    这种解决方法的缺点是,每次启动
    boot2docker
    virtualbox虚拟机时,您的DHCP服务器有时会分配不同的IP,从而造成严重破坏。

    Ahh好的,我明白了:D当我对容器的IP地址执行
    ping 172.17.0.2
    时,我会得到预期的响应。但我仍然无法连接到它。。。我编辑了我的问题。@thomashrig我已经更新了答案。让我知道它是否解决了你的问题。嗯,不,不幸的是,这没有解决问题。我想这一定与我的网络配置有关。。。我刚下载了一个新的Ubuntu映像(也是Ubuntu 12.04),安装了Docker和OracleXE映像,它就工作了。它还绑定到IPv6(sudonetstat-tpla的输出看起来完全相同),但它可以以某种方式工作。我可以从Linux虚拟机和Windows主机访问容器。但我仍然不知道我的问题的真正根源。。。不过,谢谢你的帮助!它正在工作:)您可能需要链接docker实例。
    docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306  SomeImage:V1