まえがき
この記事は、"Dockerでコンテナ間で通信できない"というタイトルでしたが、
コメントなどのおかげで改善されたので記事を修正しました。
ありがとうございます。
docker-composeのコンテナ間は、デフォルトだとコンテナ名で接続できる
今回は、WordPress開発環境を作りたかったので以下のdocker-compose.yml
を用意した。
version: '3.4'
services:
mysql: #<-コンテナとしてこちらの"mysql"も指定できる
image: mysql:5.7
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
environment:
MYSQL_ROOT_PASSWORD: root_dumy
MYSQL_DATABASE: wordpress
MYSQL_USER: user
MYSQL_PASSWORD: password_dumy
ports:
- 3306:3306
container_name: db_mysql #<-コンテナ名は"db_mysql"
web:
build: wordpress
volumes:
- ./html:/var/www/html
ports:
- 80:80
depends_on:
- mysql
container_name: wordpress_web
その他、環境は以下の通り
- windows10 pro(April 2018 Update)
- docker 18.03.1-ce
docker-compose.yml
のあるフォルダに、html
フォルダを作成しwordpress関連のファイル一式を配置する。
wordpressからDB(コンテナ)へ接続するための、DB設定ファイルwp-config.php
の接続先をコンテナ名に書き換える。
コンテナ名は、上の設定だとmysql
or db_mysql
で動くみたい。
define('DB_HOST', 'db_mysql:3306');
その他、上のdocker-compose.yml
ではDBパスワードなども設定しているので、まとめて設定する。
define('DB_NAME', 'wordpress');
/** MySQL データベースのユーザー名 */
define('DB_USER', 'user');
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'password_dumy');
/** MySQL のホスト名 */
define('DB_HOST', 'db_mysql:3306');
/** データベースのテーブルを作成する際のデータベースの文字セット */
define('DB_CHARSET', 'utf8mb4');
実行は、docker-compose.yml
のあるフォルダで
docker-compose up
ブラウザのアドレスにlocalhostを入れることで確認できるはず。
その他知見
dockerのコンテナ内部では、個別にipを割り振れるようです。
おすすめではないですが、コンテナ間通信をipベースで行うこともできます。
以下のコマンドで、割り当てられているipを取得できます。
([contenaName]
を各自のコンテナ名に書き換えてね)
docker exec -it [contenaName] hostname -I
返り値の値を、wp-config.php
のDB_HOSTの行を書き換えると動作しました。
define('DB_HOST', '172.18.0.2:3306');
コンテナ通信は調べると色々ある
コメントで教えてもらいましたが、コンテナにはいくつかの通信モードがあるみたいです。
コンテナ間通信をlocalhostで行ってみたいが、宿題。
教えてもらった、通信の仕組みが理解できれば使える様になる??