Dockerでコンテナを再立ち上げしたらlocalhostが表示されなくなった問題
状況
前回docker-compose.yml ファイルを使ってコンテナを作成
ローカルのhttp://localhost:8080/ で表示ができた。
Dockerデスクトップを再起動し、ファイルの編集を行おうとしたところ、http://localhost:8080/ で表示ができなくなっていた
確認
dockerコンテナの状況を確認します
docker container ps
表示されたコンテナ情報↓
563ac18a216f apprentice_dev1-app:latest "docker-php-entrypoi…" 3 minutes ago Up 3 minutes 80/tcp stoic_grothendieck
80/tcp は PORTS の値です。
これはコンテナの内部ポート 80 がリッスンしていることを意味し、外部のポート(ホストマシンのポート)にマッピングされていないことを示しています。
コンテナの内部ポート80がリッスンしているというのは、そのコンテナ内で動作しているサービス(通常はWebサーバー)がポート80で接続を待ち受けていることを意味します。Dockerでは、コンテナは独自の仮想ネットワーク環境にあり、その中で個別のIPアドレスを持ちます。そのため、コンテナのポートはデフォルトではホストマシンから直接アクセスできないようになっています。
コンテナのポート80に外部からアクセスするためには、ホストマシンのポートをコンテナのポートにマッピングする必要があります。
このためには、一旦コンテナを削除し再度コンテナを立ち上げる動作が必要になります。
使用したいDockerコンテナは前回、docker-compose.ymlを使用して立ち上げています。
この記事で説明するのはdocker-compose.ymlを使用してコンテナを立ち上げなおす方法です。
docker-compose.ymlのあるフォルダに移動
windows PowerShellでの操作になります。
docker-compose.ymlのあるフォルダに移動します。
cd [ファイルがあるフォルダのパス]
Dockerコンテナを削除する
docker-compose.ymlを使用し立ちあげたコンテナを削除します
docker-compose down
コンテナを再度立ち上げる
状況によって違いますが今回は以下のコマンドを入力しています。
docker compose up -d --build
docker-compose up:
docker-compose.yml ファイルに定義されたサービス(コンテナ)を起動するための基本コマンド。
このコマンドは、必要に応じてコンテナをビルドする(ただし、--build オプションがなければ既存のイメージを使用します)
<オプション>
--d :
バックグラウンドでコンテナを実行
--build :
docker-compose.yml ファイルで定義されたサービスのビルドを強制的に行うよう指示します。
サービスのイメージが既に存在する場合でも、そのイメージを最新のソースコード
またはDockerfileに基づいて再ビルドします
コンテナの状況を確認する
docker compose ps
確認したところ、コンテナは無事作成されポートの設定はこうなっていました。
0.0.0.0:8080->80/tcp
この意味は以下の通りです↓
0.0.0.0:8080: ホストマシンの全てのIPアドレス(0.0.0.0はすべてのIPv4アドレスを意味する)のポート8080で、外部からの接続を受け付けています。
->: この記号はマッピングを表しており、ホストマシンのポートからコンテナ内のポートへの接続の流れを示しています。
80/tcp: コンテナ内のTCPプロトコルを使用するポート80に接続を転送します。
つまり、ホストマシンのポート8080への接続は、Dockerコンテナ内のポート80に転送されます。
ということで無事に
での表示ができるようになりました。エラーの原因は?
はっきりとした原因をつかめていません。
しかし直前にDcokerDesktopを再起動したため、それが原因では?と推測しています。
PCの再起動時は別として、通常はPowerShellなどのコマンドラインで制御するようにします。
Discussion