docker-compose で起動したweb、MySQLに接続できない事象

概要

以前作成したPHP + MySQL + LaravelのDockerプロジェクトがコンテナを立ち上げても画面にアクセスできなくなってしまったときの解決方法です。

以前の記事は以下です。

【Laravel + MySQL】Dockerで開発環境を作る
https://www.s-watanabe.work/2020/12/laravel-mysqldocker.html

発生事象

コンテナを起動

$ docker-compose up -d
Starting laravel-project_mysql_1 ... done
Starting laravel-project_app_1   ... done
Starting laravel-project_web_1   ... done

ブラウザでアクセス

いつものようにブラウザでアクセスしますが接続できません。

http://localhost:8000

※この時Docker側のログには何も出力されません。

MySQLへ接続

MySQLも確認してみましたが同じく接続できなくなりました。

$ mysql -h 127.0.0.1 -u user -ppassword -D test
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2

調査・確認

まず以下の記事を参考に新規のDockerプロジェクトが起動・接続できるかを確認しました。

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04-ja

# docker-compose はインストール済み
$ docker-compose --version
docker-compose version 1.26.0, build d4451659

mkdir test
cd test
mkdir app
echo "<h1>test</h1>" > app/indexhtml
vim docker-compose.yml

docker-compose.yml

version: '3.7'
services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html

Docker Composeを実行

$ docker-compose up -d
Creating network "test_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
a0d0a0d46f8b: Pull complete
bc3893c8dbcc: Pull complete
f21b23410f57: Pull complete
43ba45444676: Pull complete
7223cfd05eeb: Pull complete
25319a3e9e44: Pull complete
Digest: sha256:859ec6f2dc548cd2e5144b7856f2b5c37b23bd061c0c93cfa41fb5fb78307ead
Status: Downloaded newer image for nginx:alpine
Creating test_web_1 ... done

# 確認
$ curl http://localhost:8000/
<h1>test</h1>

docker-compose 自体は問題なさそう。以下コマンドで終了する。

$ docker-compose kill
Killing test_web_1 ... done

原因と解消について

原因はどうやら長く同じコンテナで作業をしているとポートがバッティングしてしまい、接続できなくなるらしい。※よく分かっていないので分かったら追記します。

とにかく一度こうなってしまうとネットワークを再構築しなくてはならない。その手順が以下です。

Dockerネットワークを確認

$ docker network ls
NETWORK ID     NAME                      DRIVER    SCOPE
544b56bd1d88   bridge                    bridge    local
49d918298f8e   host                      host      local
80ed5e43274f   laravel-project_default   bridge    local  <- 問題の発生しているコンテナ
3ed70dfabdfe   none                      null      local
dc77a3b014b7   test_default              bridge    local

対象のDockerネットワークを削除

docker network rm 80ed5e43274f
80ed5e43274f

コンテナを停止して起動する

一度停止してから再度起動することでネットワークが再構築されます。

$ docker-compose down
Removing laravel-project_web_1   ... done
Removing laravel-project_app_1   ... done
Removing laravel-project_mysql_1 ... done
Removing network laravel-project_default

$ docker-compose up -d
Creating network "laravel-project_default" with the default driver
Creating laravel-project_mysql_1 ... done
Creating laravel-project_app_1   ... done
Creating laravel-project_web_1   ... done

これでブラウザからのアクセスもMySQLも無事接続できるようになりました。

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

【PHP】PHP_CodeSnifferを使う(コーディングルールのカスタマイズ)