web-dev-qa-db-ja.com

Dockerコンテナはポートにバインドしますが、pingを実行できません

実行中のDockerコンテナーがあります( this imageから)。私が見る限り、コンテナは正しく動作しているようです(ログファイルは見栄えが良く、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仮想マシン(WindowsのVirtualBox)内でDockerを実行しています。 Docker、Linux VM、または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コンテナに接続できない理由は何ですか?

21
Thomas Uhrig

UPDATE:

あなたの設定は私には問題ないようですが、ポート49160-49162は、IPv6ではなくIPv4インターフェイスにバインドする必要があります。私はこれをグーグルで調べましたが、ドッカーで未解決のバグに遭遇したようです:

あなたの問題に対する2つの解決策があります:

  1. ubuntu VMでIPv6を完全に無効にします
  2. または、IPv4アドレスにを直接バインドします:-p 172.17.42.1:49162:8080

編集前に回答:

ポートにpingすることはできません。 PingはICMPプロトコルを使用しています。

公開されたポートに接続できない場合、Dockerコンテナ内の特定のサービスが適切なネットワークインターフェースにバインドしているかどうかを確認できます(f.e. 0.0.0.0localhostではありません。コンテナ内のすべてのリスニングポートを確認できます:netstat -tpla

12
Jiri

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 sshコンソールからboot2dockerを実行して、Docker仮想ボックスにログインしますVM netstatコマンドを実行します。 Docker仮想ボックスVMにリストされているlocalhost:43306を見つけます

回避策:

Virtual Box VMで、ipconfigコマンドを実行し、VMのIPアドレスを見つけます。 127.0.0.1の代わりに、run dockerコマンドでこのIPを使用します。この回避策のマイナス面は、boot2docker仮想ボックスVMを起動するたびに異なるIPを割り当てることでDHCPサーバーが大混乱を引き起こす可能性があることです。

2
Raghavan Iyer