當前位置: 首頁>>技術問答>>正文


Docker容器綁定到端口,但我無法ping它

, , ,

問題描述

我有一個正在運行的Docker容器(來自this圖像)。據我所知,容器似乎正常運行(log-files看起來很好,可以通過SSH連接到容器並在其中使用SQLPlus)。但是,我無法從主機連接到容器。

我像這樣啟動容器:

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

我這樣檢查了port-binding:

$ 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 VM或VirtualBox是否存在問題。我在VirtualBox中轉發了一堆端口:

networking,ubuntu,ping,docker

這是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:

我看到你的問題的兩個解決方案:

  1. 在Ubuntu VM上完全禁用IPv6

  2. 或直接綁定到IPv4地址:-p 172.17.42.1:49162:8080


編輯前回答:

你不能ping端口。 Ping正在使用ICMP協議。

如果無法連接到已發布的端口,則可以檢查docker容器中的特定服務是否綁定到正確的網絡接口(f.e.0.0.0.0)而不是localhost。您可以檢查容器中的所有偵聽端口:netstat -tpla

次佳解決辦法

當您在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命令。奇怪的是,你不會在LISTEN模式下看到localhost:43306端口

現在從boot2docker控製台執行boot2docker ssh以登錄docker虛擬機VM運行netstat命令。 Vola …..你會發現Docker虛擬盒VM上列出了localhost:43306

解決方法:

進入Virtual Box VM後,運行ipconfig命令並找出VM的IP地址。在運行docker命令中使用此IP,而不是127.0.0.1這項工作的缺點是,每次啟動boot2docker虛擬機VM時,您的DHCP服務器可能會通過分配不同的IP來進行嚴重破壞。

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/7136.html,未經允許,請勿轉載。