はじめに
複数のコンテナを使う場合に、Docker Composeを使うと便利です。
複数のコンテナの定義をymlファイルに記載し利用できます。
今回はdockerでWordpressを構築する例をもとに、Docker Composeについてまとめました。
他にも私のブログで、WordPressについて解説している記事がありますのでご覧ください。
環境
Dockerの用意
Macの場合はDockerのみですが、Windowsの場合はDocker(WSL2がバックエンド)が必要です。
Dockerのインストール方法は、以下の記事をご覧ください。
Docker Composeの確認
これ以降は、Windowsの場合はPowerShellで、Macの場合はターミナルで作業を行います。
以下のコマンドでDocker Composeを確認します。
(WindowsとMacでバージョンが違いました)
$ docker-compose --version
Windows:
docker-compose version 1.29.2, build 5becea4c
Mac:
Docker Compose version v2.4.1
Docker Composeを使わない場合
まずはDocker Composeを使わずに構築してみます。
個別にイメージをpullします。
$ docker pull mysql:5.7
$ docker pull wordpress:latest
M1 Macの場合は、以下のエラーが表示されます。
% docker pull mysql:5.7
5.7: Pulling from library/mysql
no matching manifest for linux/arm64/v8 in the manifest list entries
M1 Macの場合は、プラットフォームを指定してプルします。
% docker pull mysql:5.7 --platform linux/x86_64
MySQLとWordPressのコンテナを作成します。
以下のように2つのコマンドを実行します。
$ docker run --name mysql_db -e MYSQL_ROOT_PASSWORD=passwd -e MYSQL_DATABASE=wordpress -d mysql:5.7
$ docker run --name wp_site --link mysql_db:mysql -p 8000:80 -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=passwd -d wordpress
dockerの引数は以下です。
引数 | 備考 |
---|---|
–name | コンテナ名 |
-e | コンテナの環境変数 |
-d | バッググラウンドで起動 |
–link | 他のコンテナへのリンク |
-p | ポート転送(ホストのポート:コンテナのポート) |
ブラウザで以下のURLにアクセスします。
http://localhost:8000/
WordPressの画面が表示されました。
ついでにインストールしてみましょう。
日本語を選択して「続ける」をクリックします。
データベース名などを入力する画面は表示されませんでした。
なぜなのか気になったので、WordPressの設定を見てみることにします。
WordPressのコンテナに入るには、execを使用します。
docker exec -it wp_site /bin/bash
ドキュメントルートの中に入りました。
root@502c87cbdf9d:/var/www/html# ls
index.php wp-admin wp-config-sample.php wp-includes wp-mail.php xmlrpc.php
license.txt wp-blog-header.php wp-config.php wp-links-opml.php wp-settings.php
readme.html wp-comments-post.php wp-content wp-load.php wp-signup.php
wp-activate.php wp-config-docker.php wp-cron.php wp-login.php wp-trackback.php
catコマンドで、wp-config.phpを見てみます。
以下のように、docker用の設定から読み込んでいるのが分かります。
// ** Database settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', getenv_docker('WORDPRESS_DB_NAME', 'wordpress') );
/** Database username */
define( 'DB_USER', getenv_docker('WORDPRESS_DB_USER', 'example username') );
/** Database password */
define( 'DB_PASSWORD', getenv_docker('WORDPRESS_DB_PASSWORD', 'example password') );
getenv_docker
という関数で設定値を取得しているのが分かります。
これはコンテナ作成時に引数で指定した環境変数から取得しています。
if (!function_exists('getenv_docker')) {
// https://github.com/docker-library/wordpress/issues/588 (WP-CLI will load this file 2x)
function getenv_docker($env, $default) {
if ($fileEnv = getenv($env . '_FILE')) {
return rtrim(file_get_contents($fileEnv), "\r\n");
}
else if (($val = getenv($env)) !== false) {
return $val;
}
else {
return $default;
}
}
}
インストールに戻って、サイトの情報などを入力します。
これだけでWordpressが使えるようになりました。
Docker Composeを使ってみる
このように複数のコンテナを起動したり停止したりするのが面倒です。
そこでDocker Composeを使ってみましょう。
先程まで使用したdockerコンテナやイメージは削除しておきましょう。
任意の場所にフォルダを作成します。
Windows例:
\\wsl.localhost\Ubuntu\home\xxx\docker\wordpress
Mac例:
/Users/xxx/Documents/wordpress
先程のフォルダの直下にdocker-compose.ymlファイルを作成します。
中身は以下のようにしました。
内容はdocker runと同じ感じですね。
version: '2'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: passwd
MYSQL_DATABASE: wordpress
wordpress:
depends_on:
- mysql
image: wordpress:latest
ports:
- "8000:80"
volumes:
- "./html/:/var/www/html/"
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: passwd
M1 Macの場合、mysqlの定義にプラットフォームを指定します。
version: '2'
services:
mysql:
image: mysql:5.7
platform: linux/x86_64
environment:
MYSQL_ROOT_PASSWORD: passwd
MYSQL_DATABASE: wordpress
wordpress:
depends_on:
- mysql
image: wordpress:latest
ports:
- "8000:80"
volumes:
- "./html/:/var/www/html/"
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: passwd
versionはComposeファイルのフォーマットです。
バージョンによって書き方が異なります。
WordPressコンテナは、公開ディレクトリのフォルダをホスト側と共有しました。
docker-compose.ymlと同階層に移動し、以下のコマンドを実行します。
docker-compose up -d
初回時はイメージの構築から行われます。
しばらくすると各コンテナが起動します。
dockerコンテナを確認しましょう。
2つとも起動していますね。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c7f195471baf wordpress:latest "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 0.0.0.0:8000->80/tcp wordpress-wordpress-1
ede6e693c840 mysql:5.7 "docker-entrypoint.s…" 13 seconds ago Up 12 seconds 3306/tcp, 33060/tcp wordpress-mysql-1
ブラウザで以下のURLにアクセスします。
http://localhost:8000/
WordPressの画面が表示されました。
ホスト(WindowsやMac)の方でもWordpressのファイルが見えることを確認します。
先程同様に、Wordpressがインストールできることを確認してください。
Docker Composeコマンド
docker-compose.ymlと同じ階層で、それぞれのコマンドが使用できます。
コンテナの起動
-dはバッググラウンドで起動。
docker-compose up -d
コンテナの確認
docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
wordpress-mysql-1 "docker-entrypoint.s…" mysql running 33060/tcp
wordpress-wordpress-1 "docker-entrypoint.s…" wordpress running 0.0.0.0:8000->80/tcp
コンテナの停止
docker-compose stop
Stopping wordpress_wordpress_1 ... done
Stopping wordpress_mysql_1 ... done
コンテナの削除
docker-compose rm
Going to remove wordpress_wordpress_1, wordpress_mysql_1
Are you sure? [yN] y
Removing wordpress_wordpress_1 ... done
Removing wordpress_mysql_1 ... done
コンテナの停止、削除、ネットワーク削除、イメージ削除
docker-compose down --rmi all
Removing network wordpress_default
Removing image mysql:5.7
Removing image wordpress:latest
さいごに
今回はDocker Composeについてまとめました😊
他にも私のブログで、WordPressについて解説している記事がありますのでご覧ください。
コメント