Dockerで構築したWebアプリに他のPCからアクセスする手順を確認します。
Windows10(以下ホスト)に入れたDocker Compose上に、Django(Python)のWebアプリやpgAdminを起動し、ホスト以外のPCからブラウザでアクセスします。
また、Djangoをデバッグする場合、リモート接続し開発サーバを起動することになりますが、少し工夫する必要があります。
前提条件
- Windows10
- Docker Compose
Docker Compose は、公式サイトのインストール手順等を参考にすれば、簡単に準備できるでしょう。
バージョン確認
> docker -v Docker version 20.10.5, build 55c4c88 > docker-compose -v docker-compose version 1.29.0, build 07737305
Dockerコンテナに他PCからアクセス
こちらを参考に環境構築します。
> docker-compose up -d
ホスト | Windows10(PC名:host-pc) |
Docker コンテナ1 | Django(ポート:8080) |
Docker コンテナ2 | pgAdmin(ポート:8083) |
ホストから各コンテナへは「http://localhost:8080」「http://localhost:8083」でアクセスすることができます。
他のPCからはホストを経由して各コンテナへアクセスするので、ホストのPC名に置き換えて、「http://host-pc:8080」「http://host-pc:8083」でアクセスできます。
アクセスできない場合は、ホストのファイアーウォールやアンチウィルスソフトなどがブロックしている可能性があります。一旦ホストのファイアーウォールなどを無効にして確認してみてください。ファイアーウォールが原因であれば、上記のポートを許可するなどの対応が必要です。
また、ホストでポートの状態を確認すると、「0.0.0.0:8080」のようになっており、他PCからアクセスできる状態になっていました。
> netstat -an プロトコル ローカル アドレス 外部アドレス 状態 ・・・ TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING TCP 0.0.0.0:8083 0.0.0.0:0 LISTENING
Djangoの開発サーバに他PCからアクセス
こちらを参考にDockerコンテナにリモート接続し、Djangoをデバッグ実行すると開発サーバ起動が起動します。
Starting development server at http://127.0.0.1:8000/
ホストからは「http://127.0.0.1:8000」のほかに「http://localhost:8000」でアクセスできますが、他のPCからはアクセスできませんでした。
ホストでポートの状態を確認すると、「127.0.0.1:8000」となっていて、ダメなようです。
> netstat -an プロトコル ローカル アドレス 外部アドレス 状態 ・・・ TCP 127.0.0.1:8000 0.0.0.0:0 LISTENING
解決編
デバッグの設定(.vscode\launch.json)を確認すると、開発サーバを起動する際にIPアドレスなどを指定していなかったので、「0.0.0.0:8000」(または「0:8000」)を指定します。
・・・ "args": [ "runserver", "0.0.0.0:8000" ], ・・・
次に、コンテナにリモート接続した際の設定(.devcontainer/docker-compose.yml)ができているので、portsを指定すれば、他PCからもアクセスできるようになります。
・・・ ports: - "8088:8000" ・・・
これで、ホストからは「http://localhost:8088」、他PCからは「http://host-pc:8088」でアクセスすることができます。
> netstat -an プロトコル ローカル アドレス 外部アドレス 状態 ・・・ TCP 0.0.0.0:8088 0.0.0.0:0 LISTENING
Djangoの場合、これだけでは「Invalid HTTP_HOST header ・・・」となるので、「settings.py」でALLOWED_HOSTSに他PCを指定することで、アクセスを許可します。「’*’」とすれば全て許可できます。

・・・ ALLOWED_HOSTS = ['other-pc'] ・・・
開発サーバを本番環境で利用すべきではなく、これらの設定も開発や検証時の利用のみにすべきでしょう。
コメント