Docker Compose入門|複数コンテナでWordPress環境を構築するハンズオン

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Docker > Docker Compose入門|複数コンテナでWordPress環境を構築するハンズオン
「docker runは使えるけど、WordPressとMySQLを毎回手で起動するのが大変すぎる」
そう感じているなら、Docker Composeを使うタイミングが来ています。

Docker Composeは複数のコンテナをyamlファイル1本で定義・管理できるツールです。
この記事では、docker-compose.ymlの書き方からWordPressとMySQLコンテナの連携・起動まで、実際のサーバー出力例を交えてハンズオン形式で解説します。

動作確認環境: Rocky Linux 9.4 / Ubuntu 24.04 LTS(Docker Engine 26.x・Docker Compose Plugin v2.27)

この記事のポイント

・docker compose up -d 1コマンドでWordPress+MySQLを同時起動できる
・docker-compose.ymlでサービス間の依存・ネットワーク・ボリュームを一元管理する
・コンテナが起動しない時はdocker compose logsで原因を即座に特定できる
・docker compose down でコンテナ・ネットワークをまとめてクリーンアップできる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

Docker Composeとは?複数コンテナを一括管理する仕組み

DockerでWordPressを動かすには、WordPressコンテナとMySQLコンテナの2つが必要です。
docker runでそれぞれ起動することもできますが、毎回長いオプションを打つのは現実的ではありません。

Docker Composeはその問題を解決するツールです。
docker-compose.yml(またはcompose.yml)というyamlファイルに「どのコンテナを、どのネットワークで、どのボリュームにマウントして起動するか」をすべて記述します。
あとは docker compose up の1コマンドで全コンテナが一斉に起動します。

Docker Composeが解決する3つの課題

長い起動コマンドの繰り返し:yamlに一度書けば、以降は docker compose up だけで済む
コンテナ間のネットワーク設定:Composeが自動で専用ネットワークを作成し、サービス名でIPなしに通信できる
ボリューム管理:データ永続化のボリュームをyamlで宣言し、docker compose down してもデータが残る

Docker Compose v1とv2の違い

古い情報では docker-compose(ハイフンあり)と書いているものがあります。
現在の主流はDocker Engine同梱の Docker Compose Plugin(v2) で、コマンドは docker compose(スペース区切り)です。
本記事はv2を前提にしています。

# v2の確認方法 $ docker compose version Docker Compose version v2.27.1

事前準備|Docker ComposeをLinuxにインストールする

Rocky Linux 9やUbuntu 24.04では、Docker Engine導入時にComposeプラグインが同梱されています。
以下の手順でDocker Engineを入れれば、docker composeコマンドがそのまま使えます。

1. Rocky Linux 9にDockerをインストールする

# Docker公式リポジトリを追加 $ sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo # Docker Engine・Compose Pluginを一括インストール $ sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # サービスを起動・自動起動設定 $ sudo systemctl enable --now docker # 動作確認 $ docker compose version Docker Compose version v2.27.1

2. Ubuntu 24.04にDockerをインストールする

# 依存パッケージを追加 $ sudo apt-get install -y ca-certificates curl # Docker GPGキーを追加 $ sudo install -m 0755 -d /etc/apt/keyrings $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc # リポジトリを追加してapt updateを実行 $ sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 動作確認 $ docker compose version Docker Compose version v2.27.1

3. 一般ユーザーでdockerを実行できるようにする

sudoなしでdockerコマンドを使うには、自分のユーザーをdockerグループに追加します。

# dockerグループへの追加(user_nameを自分のユーザー名に変更) $ sudo usermod -aG docker user_name # 設定反映(再ログインまたはnewgrp) $ newgrp docker # 確認 $ docker info | grep -i server Server Version: 26.1.4

docker-compose.ymlを作成する|WordPress+MySQLの設定

作業用ディレクトリを作成し、docker-compose.ymlを配置します。
このファイル1本がWordPressとMySQLの構成をすべて定義します。

1. 作業ディレクトリを作成する

$ mkdir ~/wordpress-compose && cd ~/wordpress-compose

2. docker-compose.ymlを作成する

以下の内容でdocker-compose.ymlを作成してください。

services: db: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: wordpress MYSQL_USER: wpuser MYSQL_PASSWORD: wppassword volumes: - db_data:/var/lib/mysql wordpress: image: wordpress:6.5-php8.3-apache restart: always depends_on: - db ports: - "8080:80" environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wpuser WORDPRESS_DB_PASSWORD: wppassword WORDPRESS_DB_NAME: wordpress volumes: - wp_data:/var/www/html volumes: db_data: wp_data:

各設定のポイントを解説します。
services.db:MySQLコンテナの定義。MySQL 8.0イメージを使用する
services.wordpress:WordPressコンテナの定義。PHP 8.3+Apacheのイメージを使用する
depends_on: - db:dbサービスが起動してからwordpressを起動する順序制御
WORDPRESS_DB_HOST: db:3306:Composeが自動作成した内部ネットワーク上でサービス名「db」で通信できる
ports: "8080:80":ホストの8080番ポートをコンテナの80番にマッピングする
volumes(末尾):db_dataとwp_dataという名前付きボリュームを宣言。コンテナを停止してもデータは保持される

3. .envファイルでパスワードを分離する(推奨)

パスワードをyamlに直書きするのは開発環境では構いませんが、Gitで管理する場合は .env ファイルに分離することを推奨します。
.envファイルを作成してから .gitignore に追加し、Gitにパスワードが混入しないようにしましょう。

# .envファイルを作成 $ cat > .env << 'EOF' MYSQL_ROOT_PASSWORD=rootpassword MYSQL_DATABASE=wordpress MYSQL_USER=wpuser MYSQL_PASSWORD=wppassword EOF # .gitignoreに追加してGitに含めない(要注意: 本番パスワードの流出防止) $ echo ".env" > .gitignore

コンテナを起動してWordPressにアクセスする

1. docker compose upでコンテナを起動する

docker-compose.ymlがあるディレクトリで以下を実行します。

# バックグラウンドで起動(-d = detachedモード) $ docker compose up -d # 実際の出力例 [+] Running 4/4 ✔ Network wordpress-compose_default Created 0.1s ✔ Volume "wordpress-compose_db_data" Created 0.0s ✔ Volume "wordpress-compose_wp_data" Created 0.0s ✔ Container wordpress-compose-db-1 Started 0.4s ✔ Container wordpress-compose-wp-1 Started 0.8s

上記の出力を見てください。
Composeが自動でネットワーク(wordpress-compose_default)と2つのボリュームを作成し、dbコンテナが先に起動してからwordpressコンテナが起動しています。

2. コンテナの状態を確認する

$ docker compose ps NAME IMAGE STATUS PORTS wordpress-compose-db-1 mysql:8.0 Up 3306/tcp, 33060/tcp wordpress-compose-wp-1 wordpress:6.5-php8.3-apache Up 0.0.0.0:8080->80/tcp

STATUSが「Up」になっていれば正常です。

3. WordPressの初期設定を行う

ブラウザで http://localhost:8080 にアクセスします。
WordPressの「ようこそ」画面が表示されたら成功です。
言語選択 → サイト名・管理者アカウント設定 → 「WordPressをインストール」で完了します。

よく使うDocker Composeコマンド一覧

やりたいこと コマンド
コンテナをバックグラウンドで起動 docker compose up -d
コンテナの状態確認 docker compose ps
ログをリアルタイム表示 docker compose logs -f
特定サービスのログを表示 docker compose logs -f wordpress
コンテナを停止(削除しない) docker compose stop
停止したコンテナを再起動 docker compose start
コンテナを停止して削除 docker compose down
コンテナ・ボリュームも含めて完全削除 docker compose down -v
yamlを変更後にコンテナを再作成 docker compose up -d --force-recreate
コンテナ内でシェルを実行 docker compose exec wordpress bash

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、Docker ComposeをはじめとするDockerの実践スキルを体系的に学べる講座を用意しています。
Dockerマスター講座の詳細はこちら

トラブルシューティング|よくあるエラーと解決策

1. 「Error response from daemon: Ports are not available」

ホストの8080番ポートがすでに使われている場合に発生します。
Linux ポート確認の全コマンドで紹介しているss/lsofコマンドを使って、現在の実際のポート使用状況を確認しましょう。

# 使用中のポートを確認 $ ss -tlnp | grep 8080 # 別のポートに変更する(例: 8081) # docker-compose.yml の ports セクションを変更 ports: - "8081:80"

2. WordPressが「データベース接続の確立エラー」を表示する

MySQLコンテナの起動がWordPressより遅い場合に発生することがあります。
depends_onはコンテナの起動順序は制御しますが、MySQL内部の初期化完了は保証しません。

# ログでMySQLの初期化状況を確認 $ docker compose logs db | tail -20 # 「ready for connections」が表示されるまで待ってからWordPressにアクセスする 2024-06-26T10:23:45.123456Z 1 [System] [MY-011011] [Server] ready for connections. Version: '8.0.37'

繰り返し発生する場合は、wordpress サービスに restart: always が設定されているため、MySQLの準備完了後に自動で再接続されます。

3. docker compose up が「yaml: line X: did not find expected key」で失敗する

docker-compose.ymlのインデントが崩れている場合に発生します。
YAMLはインデントにスペースのみ使用します(タブ文字は禁止)。

# yamlの構文チェック(注意: エラーがなければ展開済みの設定が出力される) $ docker compose config name: wordpress-compose services: db: ...

4. 「permission denied while trying to connect to the Docker daemon socket」

一般ユーザーでdockerグループに属していない場合に発生します。

# 自分のユーザーをdockerグループに追加 $ sudo usermod -aG docker $USER # 再ログインまたはグループを即時反映 $ newgrp docker # 確認 $ groups | grep docker user_name docker

また、mount コマンドの使い方も合わせて読んでおくと、ボリュームマウントの概念理解が深まります。
Linux DNS 設定の基本を理解しておくと、本番環境でのドメイン設定や名前解決の仕組みが分かり、Dockerコンテナのネットワーク設計にも応用できます。

まとめ

この記事で解説したDocker ComposeによるWordPress環境構築の手順をまとめます。
手順 操作内容
インストール確認 docker compose version でv2を確認する
作業ディレクトリ作成 mkdir ~/wordpress-compose を作成してcdで移動する
yaml作成 docker-compose.ymlにdb・wordpressサービスとボリュームを定義する
起動 docker compose up -d でバックグラウンド起動する
状態確認 docker compose ps でSTATUS=Upを確認してブラウザでアクセスする
停止・削除 docker compose down でコンテナとネットワークを削除する
Docker Composeを使えば、複雑な複数コンテナ環境をyaml1本で再現できます。
WordPressのような「Webサーバー+DB」の組み合わせはComposeが最も力を発揮する典型的なユースケースです。
まずは今回の構成を手元で動かし、yamlを少しずつ変えながら理解を深めていきましょう。

現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したDocker Composeの構築手順を、さらに深く学べる講座を用意しています。
Dockerマスター講座の詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。