Docker Composeとは、複数コンテナをまとめて管理するための仕組みです。ここでは、Wordpress環境の構築をDocker Composeを利用した方法で行い、その仕組みを解説します。
docker-compose.ymlの作成
複数コンテナの設定を docker-compose.yml
に記述します。
フォルダ構成
フォルダ構成を以下のようにします。
.
├── .env
└── docker-compose.yml
- .env
- 環境変数を記述します。
docker-compose.yml
で利用します。
- docker-compose.yml
- 複数コンテナの設定を記述します。
- YAML形式で記述します。
docker-compose.ymlの書き方
version: '3'
services:
### WordPress ###########################################
wordpress:
image: wordpress:latest
depends_on:
- mysql
ports:
- "10080:80"
env_file: .env
### MySQL ###############################################
mysql:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
env_file: .env
wordpress
とmysql
のコンテナを設定しています。
imageキー
には、利用するDockerイメージを指定します。ここでは、wordpressとmysqlのDockerイメージを利用しています。
コンテナの起動順序を指定したい場合、 depends_onキー
を利用します。ここでは、mysql
が起動した後に、 wordpress
が起動するように設定しています。
ホストからアクセスできるようにしたい場合、portsキー
を利用します。 <ホスト側ポート番号>:<コンテナ側ポート番号>
と指定します。ここでは、http://localhost:10080
とアクセスすると、wordpressの画面が表示されるように設定しています。
ホストディレクトリ
をコンテナ内のディレクトリ
にマウントしたい場合、volumesキー
を利用します。
ここでは、コンテナが終了しても、DB情報を永続化させるために利用しています。
env_fileキー
には、環境変数設定をするためのファイルを指定します。ここでは、.envファイル
を指定しています。内容は以下の通りです。
### WordPress ###########################################
WORDPRESS_DB_HOST=mysql:3306
WORDPRESS_DB_PASSWORD=wordpress
### MySQL ###############################################
MYSQL_ROOT_PASSWORD=wordpress
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
MYSQL_PASSWORD=wordpress
WORDPRESS_DB_HOST=mysql:3306
と設定しています。 なぜ、 mysql
というサービス名でホストを指定できるかというと、 docker-compose.yml
に記述した全サービス間で自動的にリンクを貼ってくれるためです。
( docker-compose.yml
のversion1
ですとlinksキー
をわざわざ設定する必要がありました。)
例えば、DBはコンテナではなく、ホストで起動しているDBを利用したいケースがあるとします。コンテナ内からホスト上のサービスへアクセスする必要がありますが、host.docker.internal
というDNS名でホスト上のサービスにアクセスできます。
https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
複数コンテナをまとめて操作
docker-composeコマンド
を利用します。docker-compose.yml
の設定を読み込み、まとめてコンテナを起動してくれます。
まず、コマンドがインストールされているか確認します。
$ docker-compose -v
docker-compose version 1.22.0, build f46880f
インストールされていない場合、以下リンクを参考にしてインストールを済ませてください。
https://docs.docker.com/compose/install/
起動
さっそく、起動してみます。
$ docker-compose up -d
Pulling mysql (mysql:5.7)...
5.7: Pulling from library/mysql
(省略)
Status: Downloaded newer image for mysql:5.7
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
(省略)
Status: Downloaded newer image for wordpress:latest
Creating wordpress_mysql_1 ... done
Creating wordpress_wordpress_1 ... done
mysqlとwordpressのイメージが読み込まれ、コンテナが作成されました。
コンテナ確認
2つのコンテナが起動されていることを確認できます。
$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------
wordpress_mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:10080->80/tcp
自動リンクの確認
wordpressコンテナ内で、 mysql
に対して自動リンクができていることを確認します。
wordpressコンテナ内に接続して、 ping
をインストール後、 ping mysql
を実行します。
$ docker-compose exec wordpress bash
root@58aec4e9b6b8:/var/www/html#
root@58aec4e9b6b8:/var/www/html# apt-get update
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Ign:1 http://cdn-fastly.deb.debian.org/debian stretch InRelease
Get:4 http://security.debian.org/debian-security buster/updates InRelease [38.3 kB]
Get:3 http://cdn-fastly.deb.debian.org/debian stretch-updates InRelease [91.0 kB]
(省略)
root@58aec4e9b6b8:/var/www/html# apt-get -y install iputils-ping
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
(省略)
root@58aec4e9b6b8:/var/www/html# ping mysql
PING mysql (172.21.0.2) 56(84) bytes of data.
64 bytes from wordpress_mysql_1.wordpress_default (172.21.0.2): icmp_seq=1 ttl=64 time=0.077 ms
64 bytes from wordpress_mysql_1.wordpress_default (172.21.0.2): icmp_seq=2 ttl=64 time=0.123 ms
^C
--- mysql ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1004ms
rtt min/avg/max/mdev = 0.077/0.100/0.123/0.023 ms
自動リンクにより ping mysql
が成功していることを確認できました。
永続データの確認
ホストマシン上に、 ./.data/db/
フォルダが作成されて、コンテナ内と共有されていることを確認できます。
$ ls ./.data/db/
auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem wordpress
ホストからアクセスできるか確認
ホストのブラウザから http://localhost:10080
にアクセスしてWordpress画面が表示されることを確認できます。