コンテナを 1 つ含むサービスが 1 つあります。
コンテナ内にはポート 8000 が開いている Django サーバーがあります。
私のサービスとコンテナ環境は以下の通りです
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
500e9b49dd35 registry:5000/myapp/djangosrc:latest "python manage.py ru…" 2 minutes ago Up 2 minutes 80/tcp, 8000-8001/tcp django_python.ti4iq9vbe6b6tskrnfni1r194.prc5s92pxrrfeerjj0oqnjykl
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
l1z94x8t69li django_python global 1/1 registry:5000/myapp/djangosrc:latest *:8001->8001/tcp, *:8082->8000/tcp
したがって、コンテナ内で wget を実行すると、正常に動作します。
/ #docker container exec -it 500e9b49dd35 wget localhost:8000
index.html 100%[===================>] 77.36K --.-KB/s in 0s
しかし、接続できないwget localhost:8082
Connecting to localhost:8082 (127.0.0.1:8082)
wget: can't connect to remote host (127.0.0.1): Connection refused
何か誤解しているのでしょうか???
助けてください。どんな助けやヒントでも大歓迎です。
これらは @BMitch が提案したテストです (ありがとうございます !!)
docker run --rm --net container:500e9b49dd35 nicolaka/netshoot ss -lnt
Status: Downloaded newer image for nicolaka/netshoot:latest
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.11:40105 0.0.0.0:*
LISTEN 0 10 127.0.0.1:8000 0.0.0.0:*
私はその問題を解決しました。
これはポート転送ではなくサーバーによるものです。
私のサーバーは
python manage.py runserver
それは結びつく127.0.0.1
そこで私は
python manage.py runserver 0.0.0.0:8000
外部からもアクセスできます。
助けてくれてありがとう。
答え1
この出力から、コンテナ内のアプリケーションが 127.0.0.1 でリッスンしていること、つまりループバックしていることがわかります。
docker run --rm --net container:500e9b49dd35 nicolaka/netshoot ss -lnt
Status: Downloaded newer image for nicolaka/netshoot:latest
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 127.0.0.11:40105 0.0.0.0:*
LISTEN 0 10 127.0.0.1:8000 0.0.0.0:*
ループバック インターフェイスを含む、Docker の名前空間でのネットワーク。そのため、各コンテナーには、デフォルトでホストや他のコンテナーとは別の独自のループバック インターフェイスがあります。公開されたポートが機能するなど、コンテナーの外部からアプリケーションにアクセスできるようにするには、すべてのインターフェイスをリッスンするようにアプリケーションを構成する必要があります。IPv4 では、127.0.0.1 ではなく 0.0.0.0 をリッスンすることを意味します。これはアプリケーション自体で構成する必要があります。Docker はアプリケーションが使用するポートを制御せず、それらのポートに転送するだけです。