実行中の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に多数のポートを転送しました。
これは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コンテナに接続できない理由は何ですか?
UPDATE:
あなたの設定は私には問題ないようですが、ポート49160-49162
は、IPv6ではなくIPv4インターフェイスにバインドする必要があります。私はこれをグーグルで調べましたが、ドッカーで未解決のバグに遭遇したようです:
あなたの問題に対する2つの解決策があります:
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 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サーバーが大混乱を引き起こす可能性があることです。