Dockerコンテナ内でlocalhostで起動するアプリに外部から接続する方法
Dockerコンテナで起動したアプリで、デフォルトでlocalhostで起動するアプリに外部からアクセスする方法をまとめました。
公開日:2020年1月18日
コンテナにホストのポートをバインドする
localhostで起動するアプリは、その多くがportを指定して起動するものだと思うので、そのアプリが使うポートをコンテナを起動させる時にホストのポートとバインドさせておきます。
docker run --name hoge-app -d -p 8080:8080 express
といった形です。
docker-composeだったら、
ports:
- "8080:8080"
としておけばOKです。
ポートは、必ずしもホストとコンテナで同じにする必要はありません。ただし、ホストとコンテナで違うポート番号をバインドする場合は、コンテナ内で「access localshot:ポート番号」といったメッセージが出た際のポート番号は、ホストで割り当てたものになるので気をつけてください。
コンテナのIPアドレスを確認する
しかし、このままではコンテナ内でlocalhostで起動するアプリには外部から接続ができません。
というのも、Dockerコンテナのネットワークは、localhost(127.0.0.1)はコンテナ内で完結していて、ホストとは繋がっていないからです。
Dockerコンテナのネットワークはこんなイメージです。
ホスト(192.168.1.102) -> Dockerネットワーク -> コンテナネットワーク(172.XX.XX.XX)-> コンテナ内部(127.0.0.1)
dockerが指定するバインドは、ホストとコンテナネットワークの接続です。つまり、localhostというのは「コンテナ内部」を示すので、ホストとは繋がっていません。
ホストとDockerネットワークで繋がっているIPアドレスは、docker inspect コマンドで確認できます。
docker inspect コンテナID
コンテナのdockerネットワーク内でのIPアドレスは「Networks」の「IPAddress」 です。多くの場合「172.XX.XX.XX」というアドレスになっていると思います。
または、ifconfigなどのネットワークアプリが入っているコンテナであれば、コンテナ内でIPアドレスを調べてlocalhostじゃないものがあったらそれがDockerネットワークに繋がるIPアドレスです。
アプリのバインドするIPを変更する
あとはアプリが起動する際にバインドするIPを先ほどのIPにすればOKです。アプリによって設定方法が違うのでここでは設定は割愛します。
Dockerコンテナ内でlocalhostで起動するアプリに外部から接続する方法を見てきました。
Dockerネットワークの仕組みがわかっていれば当たり前のことなのですが、docker imageで提供されているイメージばかり使っていると、こういうところが意外と抜けてしまいますね。
この方法がわかれば、開発環境をDockerコンテナにまとめて高性能な自宅サーバーなどで起動させておけば、開発プレビューなどがサクサク進んでとても快適になります。
新着ノート
-
Gitlabの2段階認証下でコンテナレジストリにPushする方法
gitlab
公開日:2020年12月23日
-
HUGO
公開日:2020年4月27日
新着コード
-
cURLでCloudflare APIでキャッシュを削除する
cloudflare
公開日:2020年5月1日
-
iOS Safariでselectを含む要素にoverflow-y:scrollすると横にスクロールする時の対応
iOS
公開日:2020年4月15日