DockerでDBのコンテナが機能しない

背景

DockerでWordpressとMySQLのコンテナを作り、ネットワークでつないで、localhostにアクセスしたい。

環境は以下の通り。

ホストOS : Windows 11
Docker : version 20.10.20
ターミナル環境 : Git bash

そして、実行したコマンドは以下の通り。

まず、ネットワークを作る。

docker notwork create wordpress_demo

次に、MySQLのコンテナを作る。

docker run --name mysql -dit --net=wordpress_demo -e MYSQL_ROOT_PASSWORD=myrootpassword -e MYSQL_DATABASE=wordpwessdb -e MYSQL_USER=me -e MYSQL_PASSWORD=mypassword mysql:8.1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql-plugin=mysql_native_password

最後に、Wordpressのコンテナを作る。

docker run --name wordpress -dit --net=wordpress_demo -p 8085:80 -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_NAME=wordpressdb -e WORDPRESS_DB_USER=me -e WORDPRESS_DB_PASSWORD=mypassword wordpress

問題

しかし、localhostにアクセスしてみると、

あれ?

そこでさらにMySQLのログを見ると

Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?.

と表示される。

はて、これはいったい何だろう??

原因

とりあえず、以下の方法で解決策を探る。

  • bing/ググる

  • ChatGPT

  • 公式ドキュメント

  • Github

そして、以下の原因を検証した。

1. Docker Daemonは起動してる?

エラー文で聞かれていることそのままですが、明らかにDocker Daemonは起動してますね。

Dockerfileから作ったwordpressコンテナはきちんと動いているようですし。

Dockerfileで作ったコンテナは動いてる。
Wordpressもちゃんと見れるんだよな~

こうなるとDocker Daemonに問題があるのではなく、コンテナの作り方に問題があるかもしれません。

2.DaemonがTCPでリッスンするように設定する

ChatGPT先生が教えてくれました。

提示された解決策としてはdaemon.jsonのhostを

{
    "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
}

に変えるとのことです。

とりあえず、自分のDockerには、windows-daemon-option.jsonlinux-daemon-option.jsonの二つがあったので、変えてみました。。。。

ダメですね。

3. TCPポート2375を予約する

Githubにこんなイシューがありました。

そこでGithubにある通り、

netsh int ipv4 add excludedportrange protocol=tcp startport=2375 numberofports=1

を実行。少し解説をすると、

netsh: ネットワーク設定を変更するためのコマンド。
int ipv4: "int"は"interface"の略でIPv4設定を対象とすることを指定。
add excludedportrange: 予約ポート範囲を追加することを指定。
protocol=tcp: TCPプロトコルを使用するポートを予約することを指定。
startport=2375: 予約を開始するポート番号(2375番ポート)を指定。
numberofports=1: 予約するポートの数を指定(1つのポート)。


しかし、これが表示される。

The process cannot access the file because it is being used by another process.

え、誰か先客おる?調べてみよう。

netstat -nao

いた、2375。
プロセス番号は25740。タスクマネージャーで調べるか。

いや、お前かい。バリバリLISTENINGしてるやん。

コンテナのつくり方違うのでは?

こうなると、いよいよコンテナに問題があるのではと思ってしまう。

そこでもう一度コードを見直すと….なんと誤字があった。

MySQLのコンテナ作成のコードは正しくは

docker run --name mysql -dit --net=wordpress_demo -e MYSQL_ROOT_PASSWORD=myrootpassword -e MYSQL_DATABASE=wordpressdb -e MYSQL_USER=me -e MYSQL_PASSWORD=mypassword mysql:8.1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql-plugin=mysql_native_password

でした。


以上。

この記事が気に入ったらサポートをしてみませんか?