1.ホストからコンテナに接続できず、ERR_CONNECTION_REFUSEDがブラウザに表示
久しぶりにdocker-compose.ymlを作り、Webサーバのコンテナを起動し、ブラウザ(Chrome)でアクセスすると、サーバにアクセスできず、以下のメッセージが表示される。
このサイトにアクセスできません
localhost で接続が拒否されました。
次をお試しください
接続を確認する
プロキシとファイアウォールを確認する
ERR_CONNECTION_REFUSED
コンテナにログインをして、以下のようにcurlでアクセスするとindexファイルが取得できる。
curl http://127.0.0.1
つまり、コンテナ内でWebサーバーは稼働しており、ホストからコンテナへのアクセスができていない。
2.コンテナとホストのポート転送を確認
ポートの転送ができているのかをdockerコマンドで確認。
PORTSにIPアドレスがないので、転送できていない。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ded69e07b4fc nginx:latest "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 80/tcp 121nginx-nginx-run-7badcf62fd8b
念のため、コンテナのIPアドレスを確認してみたが、空文字。
docker inspect --format '{{.NetworkSettings.IPAddress}}' ded69e07b4fc
''
docker-compose.ymlは以下のような簡単なものだが、ポート転送の記述はしてある。
ちなみに、docker-composeを使ったのは、このあといくつか入れたい処理があったため。
version: '3.4'
services:
nginx:
image: nginx:latest
ports:
- "3000:80"
3.エラー原因:docker-compose upではなく、runをつかっていた
表層的な原因としては、ホストとコンテナの間の通信ができていないことなのは分かった。
それをどうやって解消するのか?
いろいろ探して、いろいろ調べ、試したけどだめ。
どうも自分のケースと他のケースは原因が違うようだ。
とりあえず、過去に使っていたプロジェクトのコンテナを起動して成功したものと、失敗したものの状況を比較することにした。
過去に使っていたプロジェクトのコンテナは、ブラウザにWebサーバからのレスポンスが表示された。
そのとき、あることに気づいた。
過去のプロジェクトは、特にコンテナに入るつもりはないので、upで起動 していた。
一方、今問題となっているコンテナは、早くコンテナ内でコマンドが打ちたかったので、upせずにrunでコンテナを起動 していた。
docker-compose run nginx sh
実は、これが接続できない原因だった。ドキュメントに下記の通り記載がある。
docker-compose run コマンドはサービス設定ファイルで指定したポートを作成しません。
ということで、以下のようにupをして、ブラウザでアクセスするとindexページが表示された。
docker-compose up
dockerコマンドでポートを確認すると、マッピング(0.0.0.0:3000->80/tcp)も確認できた。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fee115d6b0f nginx "/docker-entrypoint.…" 56 seconds ago Up 55 seconds 0.0.0.0:3000->80/tcp quirky_moser
久しぶりに触ると色々忘れるんだなと思いました。
もし、自分のようなオッチョコチョイの人がいてハマっている人の助けになれば幸いです。