WordPress
docker
docker-compose

Docker Composerではコンテナ間通信はコンテナ名を指定する

まえがき

この記事は、"Dockerでコンテナ間で通信できない"というタイトルでしたが、
コメントなどのおかげで改善されたので記事を修正しました。
ありがとうございます。

docker-composeのコンテナ間は、デフォルトだとコンテナ名で接続できる

今回は、WordPress開発環境を作りたかったので以下のdocker-compose.ymlを用意した。

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で動くみたい。

wp-config.php
define('DB_HOST', 'db_mysql:3306');

その他、上のdocker-compose.ymlではDBパスワードなども設定しているので、まとめて設定する。

wp-config.php
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起動コマンド
docker-compose up

ブラウザのアドレスにlocalhostを入れることで確認できるはず。

その他知見

dockerのコンテナ内部では、個別にipを割り振れるようです。
おすすめではないですが、コンテナ間通信をipベースで行うこともできます。

以下のコマンドで、割り当てられているipを取得できます。
([contenaName]を各自のコンテナ名に書き換えてね)

cmd
docker exec -it [contenaName] hostname -I

返り値の値を、wp-config.phpのDB_HOSTの行を書き換えると動作しました。

wp-config.php書き換え例
define('DB_HOST', '172.18.0.2:3306');

コンテナ通信は調べると色々ある

コメントで教えてもらいましたが、コンテナにはいくつかの通信モードがあるみたいです。

コンテナ間通信をlocalhostで行ってみたいが、宿題。
教えてもらった、通信の仕組みが理解できれば使える様になる??