はじめに
複数のコンテナを使う場合に、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について解説している記事がありますのでご覧ください。
 
 
 
 









コメント