beta

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コンテナにまとめて高性能な自宅サーバーなどで起動させておけば、開発プレビューなどがサクサク進んでとても快適になります。