web-dev-qa-db-ja.com

Dockerとnetstat:netstatはポートを表示せず、Dockerコンテナによって公開されます

私のコンタナーのドッカーポートをホストマシンに公開します

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によってリストされません。

25
Boris Burkov

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$ 

自分自身を確認するために必要な基本的な事項:

  1. 昇格した特権でnetstatを実行していますか?あなたが非ルートであるとき、何かが逃すかもしれません
  2. Dockerコンテナは、予想と同じホストで実行されていますか?確認する docker ps
  3. docker psポート転送をリストしますか?上記のように、このようなものを見ることができるはずです0.0.0.0:3030->80/tcp

また、docker-proxyはホストで実行されているものであることに注意してください。上記のすべてのコマンドは、Linux上で実行することを前提としています。これはubuntu 15.10でテストされました

それでも転送が見つからないと感じる場合は、オペレーティングシステム、ドッカーバージョンなどをポストバックしてください。

おかげで、

2
Maniankara