私のコンタナーのドッカーポートをホストマシンに公開します
docker run -p 80:80 ...
netstat
を使用して、デバッグ目的ですべてのリスニングポートを表示しようとします。例:
netstat -at
奇妙なことに、netstatは、ポートを公開しているドッカーコンテナーを表示しませんが、ブラウザーはリッスンして応答します。
netstat
にこれらの公開されたポートを表示させるにはどうすればよいですか?
PDATE: Debian 8 Jessieでこれを実行しています。ここに私がやることがあります:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9dfa08bab50d workflows-nginx "/bin/sh -c '/usr/sbi" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp workflows-nginx
d0b0c3f90f13 workflows-Django "/bin/sh -c 'python /" 7 hours ago Up 3 hours 0.0.0.0:8000->8000/tcp workflows-Django
99a857c92533 workflows-db "/docker-entrypoint.s" 7 hours ago Up 3 hours 5432/tcp workflows-db
ここで、Dockerはコンテナポートがホストに転送されることを報告します。さらに、workflows-nginx
コンテナを停止すると、http(ポート80)によるブラウザへの応答が停止します。もう一度起動すると、再び応答し始めます。
Sudo netstat -at | less
の出力は次のとおりです。
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 localhost:ipp *:* LISTEN
tcp 0 0 *:15672 *:* LISTEN
tcp 0 0 *:postgresql *:* LISTEN
tcp 0 0 localhost:smtp *:* LISTEN
tcp 0 0 *:25672 *:* LISTEN
tcp 0 0 *:48142 *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN
tcp 0 0 *:epmd *:* LISTEN
tcp 0 0 bob-Acer:34866 104.16.33.249:http ESTABLISHED
tcp 0 0 bob-Acer:42380 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42543 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42525 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:44076 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42944 stackoverflow.com:https ESTABLISHED
tcp 0 0 localhost:epmd localhost:50831 ESTABLISHED
tcp 0 0 bob-Acer:42655 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42384 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:44626 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42390 stackoverflow.com:https ESTABLISHED
tcp 0 0 localhost:50831 localhost:epmd ESTABLISHED
tcp 0 0 bob-Acer:48301 c2.52.c0ad.ip4.st:https ESTABLISHED
tcp 0 0 bob-Acer:42151 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42205 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:42539 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:44737 stackoverflow.com:https ESTABLISHED
tcp 0 0 bob-Acer:39648 77.94.164.251:https ESTABLISHED
tcp6 0 0 [::]:ssh [::]:* LISTEN
tcp6 0 0 localhost:ipp [::]:* LISTEN
tcp6 0 0 [::]:postgresql [::]:* LISTEN
tcp6 0 0 localhost:smtp [::]:* LISTEN
tcp6 0 0 [::]:44794 [::]:* LISTEN
tcp6 0 0 [::]:8000 [::]:* LISTEN
tcp6 0 0 [::]:amqp [::]:* LISTEN
tcp6 0 0 [::]:sunrpc [::]:* LISTEN
tcp6 1 0 localhost:58497 localhost:ipp CLOSE_WAIT
ご覧のとおり、ポート80もポート443も報告されていません。何らかの理由でworkflows-Django
のポート8000がIPv6インターフェイスで開かれます。さらに、ホストマシンでpostgresを無効にするのを忘れましたが、postgresコンテナーworkflows-db
と衝突しません。
すべてがローカルのノートブックで実行されているため、ホストと混乱することはないでしょう。
私のドッカーのバージョンは次のとおりです。
docker --version
Docker version 1.10.3, build 20f81dd
ANSWER:これは、Docker EXPOSEパラメーターに関連しています。 dockerfileにこの行を記述し、-pでコンテナを実行すると、ポートがnetstatに表示されます。 -pを使用してもEXPOSEを記述しない場合、ポートはnetstatによってリストされません。
netstatは、公開されたポートを表示する必要があります。ここに例があります
anovil@anovil-Latitude-E6440:docker$ Sudo netstat -at|grep 3030
anovil@anovil-Latitude-E6440:docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
anovil@anovil-Latitude-E6440:docker$ docker run -d -p 3030:80 httpd:2.4
4310ac5fbdbc7314ab4d23e34099a710a3a8790dcf2c6d0a84202c1de5c9fd30
anovil@anovil-Latitude-E6440:docker$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4310ac5fbdbc httpd:2.4 "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:3030->80/tcp hungry_fermat
anovil@anovil-Latitude-E6440:docker$ Sudo netstat -at|grep 3030
tcp6 0 0 [::]:3030 [::]:* LISTEN
anovil@anovil-Latitude-E6440:docker$ Sudo netstat -tulpn|grep 3030
tcp6 0 0 :::3030 :::* LISTEN 10294/docker-proxy
anovil@anovil-Latitude-E6440:docker$
自分自身を確認するために必要な基本的な事項:
docker ps
docker ps
ポート転送をリストしますか?上記のように、このようなものを見ることができるはずです0.0.0.0:3030->80/tcp
また、docker-proxyはホストで実行されているものであることに注意してください。上記のすべてのコマンドは、Linux上で実行することを前提としています。これはubuntu 15.10でテストされました
それでも転送が見つからないと感じる場合は、オペレーティングシステム、ドッカーバージョンなどをポストバックしてください。
おかげで、