dockerでWebサーバを立て、ブラウザで
http://localhost:8080/
にアクセスしたが、エラーが表示されたりしてアクセスできない
そんなときの確認ポイントを記載します。
アクセスできないときにどこが悪いかを確認する手順
まずは、アクセスできないときにどこが悪いかを順を追って確認しましょう。
ホストOSからコンテナのサーバにアクセスできない場合は、
- そもそもWebサーバが動いていない
- Webサーバは起動しているが、ホストOSからネットワーク的に接続できない
のどちらかの原因である場合が多いです。
最初に確認するのは、Dockerコンテナで起動するWebサーバがちゃんと動いているのかどうかです。
docker exec -it <起動したコンテナ名> bash
とするとコンテナ内のOSにシェルでログインできますので、ここでcurlコマンドでサーバからちゃんとレスポンスが返ってきているかを確認します。
curl http://localhost:8080/
これでエラーが返ってきたり、レスポンスが返ってこない場合は、ポートの公開とか、ポートフォワーディングの前に、そもそもWebサーバが起動していないと思います。
上記でアクセスできない場合、もう一つ調べるとよいのは、localhostではなく、実IPアドレスでアクセスしたらどうか?ということです。
docker inspect –format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ con_name
このコマンドで、コンテナに割り振られているネットワーク・ドレスが分かります。
172.17.0.2 のように表示されたとしたら、
curl http://172.17.0.2:8080/
でもレスポンスがどうなるかを確認しておきましょう。
両方とも正常に返ってくる場合は、Webサーバは起動しています。
デフォルトの設定だと、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/
でサーバにアクセスできます。