はじめに
Docker Composeの概要やインストール、そしてDocker Composeを使ってWordPressを構築するまでを記載します。
Docker Composeとは
複数のDockerコンテナ(例えば、WEBサーバ+DBサーバの組み合わせ)からなるシステムを簡単に作成・起動するツールです。
標準の「docker run」コマンドを使う場合、コンテナ1つ1つ作成・起動するに使用するポート番号やボリュームなど多数のオプション指定があり複雑です。
また、個別にネットワーク作成(docker networkコマンド)や、ボリューム作成(docker volumeコマンド)を事前に実施しておく必要があります。
Docker Composeを使うと、設定ファイル(YMLファイル)を用意しておけば、単純なコマンドでこれら一連の作成・起動処理を実行することができます。
Docker Composeのインストール
まずはDocker Composeをインストールします。
※事前にDocker本体をインストールしておくことが前提です。
(参考:Oracle CloudのVM上にDockerをインストールしてみた。)
公式ドキュメントを参考に、インストールします。
※今回は執筆時点の最新バージョン1.29.2をインストールしました。
[root@testserver ~]# curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 633 100 633 0 0 1571 0 --:--:-- --:--:-- --:--:-- 1574
100 12.1M 100 12.1M 0 0 5875k 0 0:00:02 0:00:02 --:--:-- 5657k
[root@testserver ~]#
実行権限を付与します。
[root@testserver ~]# ll /usr/local/bin/docker-compose
-rw-r--r--. 1 root root 12737304 Jul 23 23:42 /usr/local/bin/docker-compose
[root@testserver ~]# chmod +x /usr/local/bin/docker-compose
[root@testserver ~]# ll /usr/local/bin/docker-compose
-rwxr-xr-x. 1 root root 12737304 Jul 23 23:42 /usr/local/bin/docker-compose
[root@testserver ~]#
インストールできました!
[root@testserver ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
[root@testserver ~]#
Docker Composeを使ってWordPressを構築
では、Docker Composeを使ってWordPressを構築してみます。
今回構築する環境は下図です。
設定ファイル「docker-compose.yml」の作成
任意のディレクトリに、設定ファイル「docker-compose.yml」を作成します。
[root@testserver ~]# mkdir -p ~/dockertest/wordpress
[root@testserver ~]# cd ~/dockertest/wordpress
[root@testserver wordpress]# vi docker-compose.yml
version: '3'
services:
wp-db:
image: mysql:8.0.26
networks:
- wp-network
volumes:
- ./wp-data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wp-root-pass
MYSQL_DATABASE: wp-data
MYSQL_USER: wp-user
MYSQL_PASSWORD: wp-pass
wp-webapp:
depends_on:
- wp-db
image: wordpress:5.8.0-php7.4-apache
networks:
- wp-network
volumes:
- ./wp-htdocs:/var/www/html
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: wp-db
WORDPRESS_DB_NAME: wp-data
WORDPRESS_DB_USER: wp-user
WORDPRESS_DB_PASSWORD: wp-pass
networks:
wp-network:
[root@testserver wordpress]#
設定の解説です。
- version
「docker-compose.yml」のフォーマットバージョンを定義します。
ComposeとDockerの互換性マトリックスもご参照ください。 - services
作成するコンテナを定義します。
今回WordPressを構築するため、「wp-db」と「wp-webapp」の2つのコンテナを設定しました。 - image
コンテナの作成元となるDockerイメージとそのバージョンを指定します。
ここで指定したイメージをDocker Hubからpullされます。 - networks
作成するコンテナ間を結ぶネットワークを定義します。 - volumes
コンテナ内のファイルを永続的に保管するボリュームを定義します。
ボリューム定義の種類はいくつか存在しますが、今回はその中でbind mounts方式(Dockerホストのディレクトリをコンテナでマウント)にしました。
MySQLのデータベースファイル(/var/lib/mysql)や、WordPressのコンテンツデータ(/var/www/html)をDockerホストから確認できるようになっています。
「<Dockerホストのディレクトリ>:<コンテナのマウントポイント>」となっています。 - restart
何らかの障害でコンテナが停止した際の挙動を定義します。
今回は「always」を指定したので、明示的に停止する以外でコンテナが停止した場合、自動で再起動されます。 - environment
環境変数を設定します。
今回はMySQLデータベースのユーザ/パスワードなどを設定しました。 - depends_on
他のコンテナとの依存関係を定義します。
ここで指定したコンテナが先に起動/停止する順序になります。 - ports
ポートマッピングを定義します。
「<Dockerホストのポート番号>:<コンテナのポート番号>」となっています。
また、volumesで指定したディレクトリを作成しておきます。
[root@testserver wordpress]# mkdir -p ./wp-data
[root@testserver wordpress]# mkdir -p ./wp-htdocs
「docker-compose up」コマンドで作成・起動
作成した設定ファイル「docker-compose.yml」のディレクトリに移動し、「docker-compose up」コマンドでWordPress環境を作成・コンテナを起動します。
[root@testserver wordpress]# docker-compose up -d
Creating network "wordpress_wp-network" with the default driver
Pulling wp-db (mysql:8.0.26)...
Trying to pull repository docker.io/library/mysql ...
8.0.26: Pulling from docker.io/library/mysql
33847f680f63: Pull complete
5cb67864e624: Pull complete
1a2b594783f5: Pull complete
b30e406dd925: Pull complete
48901e306e4c: Pull complete
603d2b7147fd: Pull complete
802aa684c1c4: Pull complete
715d3c143a06: Pull complete
6978e1b7a511: Pull complete
f0d78b0ac1be: Pull complete
35a94d251ed1: Pull complete
36f75719b1a9: Pull complete
Digest: sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd
Status: Downloaded newer image for mysql:8.0.26
Pulling wp-webapp (wordpress:5.8.0-php7.4-apache)...
Trying to pull repository docker.io/library/wordpress ...
5.8.0-php7.4-apache: Pulling from docker.io/library/wordpress
33847f680f63: Already exists
ba03c99d34ed: Pull complete
5f637ed06e1a: Pull complete
ecfd84713df3: Pull complete
75835d9b84b3: Pull complete
8514983ec064: Pull complete
ec742b42e20a: Pull complete
87e4502f1c5f: Pull complete
9acd2f346ce4: Pull complete
e731089e158e: Pull complete
968b8c54362f: Pull complete
bb1e68da18ad: Pull complete
0075936788b5: Pull complete
c19ec64049d7: Pull complete
11f9c7b15750: Pull complete
141c3a66d84d: Pull complete
9cca4c551350: Pull complete
03eedc21602c: Pull complete
86f52f45a1a0: Pull complete
e0fceeb1625b: Pull complete
c4fc93c7c6ab: Pull complete
Digest: sha256:c252b341cd1f2daa876b2c90ba08dba9ea87a7cd85d439f1b10794d8e80b771c
Status: Downloaded newer image for wordpress:5.8.0-php7.4-apache
Creating wordpress_wp-db_1 ... done
Creating wordpress_wp-webapp_1 ... done
[root@testserver wordpress]#
作成・起動後の確認
作成・起動したWordPress環境の状態を確認してみます。
コンテナ
「wp-db」と「wp-webapp」が作成され、起動(State=Up)できています。
[root@testserver wordpress]# docker-compose ps -a
Name Command State Ports
-------------------------------------------------------------------------------------
wordpress_wp-db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wp-webapp_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
[root@testserver wordpress]#
Network
「wp-network(★部)」が作成されています。
[root@testserver wordpress]# docker network ls
NETWORK ID NAME DRIVER SCOPE
7535d534366c bridge bridge local
2f5209f19850 host host local
1d109924e0af none null local
d4b6fe6ec9e8 wordpress_wp-network bridge local ★
[root@testserver wordpress]#
Volume
今回はbind mounts方式でVolumeを作成したので、Dockerホストでlsコマンドを実行し確認します。
WordPressのhtmlファイルやphpファイル、MySQLのデータベースファイルが作成されています。
[root@testserver wordpress]# ls ./wp-htdocs/
index.php wp-activate.php wp-comments-post.php wp-config-sample.php wp-includes wp-login.php wp-signup.php
license.txt wp-admin wp-config-docker.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
readme.html wp-blog-header.php wp-config.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
[root@testserver wordpress]#
[root@testserver wordpress]# ls ./wp-data/
auto.cnf binlog.000004 client-cert.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem wp@002ddata
binlog.000001 binlog.index client-key.pem ibdata1 #innodb_temp private_key.pem sys
binlog.000002 ca-key.pem #ib_16384_0.dblwr ib_logfile0 mysql public_key.pem undo_001
binlog.000003 ca.pem #ib_16384_1.dblwr ib_logfile1 mysql.ibd server-cert.pem undo_002
[root@testserver wordpress]#
WordPressページにWEBアクセス
設定ファイル「docker-compose.yml」の中で、「wp-webapp」のポート番号を8080に設定しました。
そのため、「http://<ホストのIPアドレス>:8080/」にWEBアクセスします。
無事にアクセスできました!!
「docker-compose stop」コマンドで停止
「docker-compose stop」コマンドでコンテナを停止します。
[root@testserver wordpress]# docker-compose ps -a
Name Command State Ports
-------------------------------------------------------------------------------------
wordpress_wp-db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wp-webapp_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
[root@testserver wordpress]#
[root@testserver wordpress]# docker-compose stop
Stopping wordpress_wp-webapp_1 ... done
Stopping wordpress_wp-db_1 ... done
[root@testserver wordpress]# docker-compose ps -a
Name Command State Ports
-----------------------------------------------------------------------
wordpress_wp-db_1 docker-entrypoint.sh mysqld Exit 0
wordpress_wp-webapp_1 docker-entrypoint.sh apach ... Exit 0
[root@testserver wordpress]#
【注意】「docker-compose」コマンドの「down」と「stop」の違い
「down」を実行した場合、コンテナ停止と同時に「docker-compose」コマンドで作成した環境全体(コンテナ、ネットワーク、ボリュームなど)が削除されます。再び起動する予定があるのであれば、停止時は「stop」を使いましょう。(「up」ではなく「start」でも起動できます。)
ちなみに「down」を実行すると以下のようになります。
[root@testserver wordpress]# docker-compose ps -a
Name Command State Ports
-------------------------------------------------------------------------------------
wordpress_wp-db_1 docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
wordpress_wp-webapp_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8080->80/tcp
[root@testserver wordpress]#
[root@testserver wordpress]# docker-compose down
Stopping wordpress_wp-webapp_1 ... done
Stopping wordpress_wp-db_1 ... done
Removing wordpress_wp-webapp_1 ... done
Removing wordpress_wp-db_1 ... done
Removing network wordpress_wp-network
[root@testserver wordpress]#
[root@testserver wordpress]# docker-compose ps -a
Name Command State Ports
------------------------------
[root@testserver wordpress]#
「Stopping・・・」と後に「Removing・・・」と表示されており、削除されているのが分かります。
今回のまとめ
- Docker Composeにより、環境構成情報を設定ファイルに定義できる。
- 起動オプションがシンプルになる。
- 停止時は「stop」オプションを利用すること。