こんにちは!seiです!
ローカルPC(WSL)から立ち上げたDocker コンテナにWindowsPCから接続できなくて、2時間ほどはまったので備忘録です!
Dockerコンテナに外部から接続できない原因
Dockerコンテナに接続できないときの原因は主に以下3つです。
- コンテナ内アプリを0.0.0.0でリッスンしてない
- ポートのマッピングが間違っている
- コンテナが実行されていない
コンテナ内アプリを0.0.0.0でリッスンしてない
今回僕がはまってしまったのはこれが原因でした!
コンテナ内でFastAPIを用いてバックエンドサーバを立ててました。
dockerFile
FROM python:3.8-slim-buster
RUN pip install fastapi "uvicorn[standard]"
CMD ["uvicorn", "app.main:app", "-reload"]
コンテナ内のログ
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
しっかりlocalhostで立ち上がっちゃってます。これだと、コンテナ内部からの通信しか許容されません。
全てのネットワークからのリクエストを受け付けるために「0.0.0.0」で立ち上げる必要がありました。
INFO: Uvicorn running on 0.0.0.0:8000 (Press CTRL+C to quit)
これでホストマシンからの通信もアプリケーションに到達できるようになります。
ポートのマッピングが間違っている
「docker run -p ポート番号:コンテナのポート番号」やdocker-compose.yamlに書いたポートのマッピングが間違ってると接続できません。
例えば、コンテナ内で0.0.0.0:8000で立ち上げているアプリに対して、ローカルPCからはlocalhost:5000でアクセスしたい場合は以下のようになります。
docker run -p 5000:8000
上手くいかない場合は、pingやtelnetコマンドを用いて通信できるかを確かめてみると良いです。
ping localhost
telnet 127.0.0.0 5000 // ホスト名、ポート番号の順
コンテナが実行されていない
超初歩的ですが、コンテナがちゃんと立ち上がっているか確認しましょう。マッピングしようとしているポートに、webサーバ等何もアクセスするものがない場合はコンテナは立ち上げた瞬間に落ちます。
立ち上がっているコンテナはdoker psコマンドで確認できます。
docker psコマンドやdocker execコマンドでコンテナの状態を確認するの結構面倒ですよね。そんなときはGUIツールを使ってコンテナの状態を可視化すると良いです!
wsl上でdocker desktopを使っていない人(WSL上のみで完結するdokerを使っている人)は「portainer」というGUIツールがおすすめです。(無料)
Portainer is your container management software to deploy, t…