Dockerコンテナで起動したサーバにアクセスできないときの確認と対処方法

dockerでWebサーバを立て、ブラウザで

http://localhost:8080/

アクセスしたが、エラーが表示されたりしてアクセスできない

そんなときの確認ポイントを記載します。

アクセスできないときにどこが悪いかを確認する手順

まずは、アクセスできないときにどこが悪いかを順を追って確認しましょう。

ホストOSからコンテナのサーバにアクセスできない場合は、

  • そもそもWebサーバが動いていない
  • Webサーバは起動しているが、ホストOSからネットワーク的に接続できない

のどちらかの原因である場合が多いです。

①コンテナ内のWebサーバがちゃんと起動して動いているか

最初に確認するのは、Dockerコンテナで起動するWebサーバがちゃんと動いているのかどうかです。

docker exec -it <起動したコンテナ名> bash

とするとコンテナ内のOSにシェルでログインできますので、ここでcurlコマンドでサーバからちゃんとレスポンスが返ってきているかを確認します。

curl http://localhost:8080/

これでエラーが返ってきたり、レスポンスが返ってこない場合は、ポートの公開とか、ポートフォワーディングの前に、そもそもWebサーバが起動していないと思います。

②localhost以外ではアクセスできるかを確認

上記でアクセスできない場合、もう一つ調べるとよいのは、localhostではなく、実IPアドレスでアクセスしたらどうか?ということです。

docker inspect –format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ con_name

このコマンドで、コンテナに割り振られているネットワーク・ドレスが分かります。

172.17.0.2 のように表示されたとしたら、

curl http://172.17.0.2:8080/

でもレスポンスがどうなるかを確認しておきましょう。

両方とも正常に返ってくる場合は、Webサーバは起動しています。

③コンテナで特定のポートが公開されているか?(EXPOSE 命令)

デフォルトの設定だと、Dockerのコンテナはポートを公開していないので、ホストOSからもアクセスできません。
コンテナの特定のポートを公開するには、Dockerfileで「EXPOSE命令」を書いてあげる必要があります。

# Dockerfileファイル中に以下のような記述を追加し、8080番ポートを公開する
EXPOSE 8080

④公開されたポートにつながるように設定できているか?(ポートフォワード)

Dockerコンテナで公開されたポートにホストOSから「localhost:8081」のように接続するには、

ホストOSの8081番ポートとコンテナの8080番ポートをつないであげる必要があります。

localhost:8081 —–> コンテナ:8080

こんな感じにつながるイメージですね。

そうするには、上記のように、「localhost:8081」に来たリクエストを「コンテナ:8080」に転送してあげるようにするわけです。

この設定を「ポートフォワードする」といいます。

このように設定するには、コンテナをrunするときに-p (–publish) オプションを指定します。

docker run -p 8081:8080 –name <起動するコンテナ名>

-p 【ホストOS側のポート】:【コンテナ側で公開されたポート】

のように指定します。

すると、

http://localhost:8081/

でサーバにアクセスできるようになります。

もちろん、

docker run -p 8080:8080 –name <起動するコンテナ名>

としてdocker runすると

http://localhost:8080/

でサーバにアクセスできます。