ポート転送サービス -> コンテナ

ポート転送サービス -> コンテナ

コンテナを 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 はアプリケーションが使用するポートを制御せず、それらのポートに転送するだけです。

関連情報