そう感じているなら、Docker Composeを使うタイミングが来ています。
Docker Composeは複数のコンテナをyamlファイル1本で定義・管理できるツールです。
この記事では、docker-compose.ymlの書き方からWordPressとMySQLコンテナの連携・起動まで、実際のサーバー出力例を交えてハンズオン形式で解説します。
なお、Docker Composeを使う前提としてDockerが動いていることが必要です。Linuxへのインストール手順は後述しますが、WindowsのWSL2上で試したい場合は別記事も参照してください。
動作確認環境: 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 でコンテナ・ネットワークをまとめてクリーンアップできる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Docker Composeとは?複数コンテナを一括管理する仕組み
まず、Dockerそのものを簡単に整理しておきます。Dockerはアプリケーションと、その動作に必要なファイル・設定を「コンテナ」という軽量な仮想環境にまとめて動かすツールです。
仮想マシン(VirtualBox等)と比べると、OSをまるごと持たないぶん起動が速くディスク消費も少ないのが特徴です。
| 比較項目 | コンテナ(Docker) | 仮想マシン(VirtualBox等) |
|---|---|---|
| 起動時間 | 数秒 | 数十秒~数分 |
| ディスク容量 | 数MB~数百MB | 数GB |
| OSカーネル | ホストOSのカーネルを共有 | OSを丸ごと持つ |
| 主な用途 | アプリ開発・動作確認・本番デプロイ | OS丸ごと検証・デスクトップ環境 |
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
4. Dockerデーモンの起動確認
docker composeを実行する前に、Dockerデーモンが起動していることを確認しましょう。「Cannot connect to the Docker daemon」エラーが出る場合は、デーモンが停止しています。
# Dockerデーモンの状態を確認する $ sudo systemctl status docker # 停止していれば起動する $ sudo systemctl start docker
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 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-prootpassword"] interval: 10s timeout: 5s retries: 5 wordpress: image: wordpress:6.5-php8.3-apache restart: always depends_on: db: condition: service_healthy 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のイメージを使用する
・healthcheck:MySQLの初期化が完了したかどうかをmysqladmin pingで定期的に確認する設定。これがあることでWordPressは「MySQLが本当に準備できた状態」を待って起動する
・depends_on: condition: service_healthy:dbサービスのhealthcheckが「healthy」になってからwordpressを起動する。単純な depends_on: - db より確実
・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
# docker-compose.yml の db セクション(抜粋) db: environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE} MYSQL_USER: ${MYSQL_USER} MYSQL_PASSWORD: ${MYSQL_PASSWORD} # wordpress セクション(抜粋) wordpress: environment: WORDPRESS_DB_USER: ${MYSQL_USER} WORDPRESS_DB_PASSWORD: ${MYSQL_PASSWORD} WORDPRESS_DB_NAME: ${MYSQL_DATABASE}
コンテナを起動して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
healthcheckを設定している場合、Statusには「Up (healthy)」と表示されます。
「Up (health: starting)」は初期化中のため、「healthy」になるまで数十秒待ってください。
3. WordPressの初期設定を行う
ブラウザで http://localhost:8080 にアクセスします。WordPressの「ようこそ」画面が表示されたら成功です。
言語選択 → サイト名・管理者アカウント設定 → 「WordPressをインストール」で完了します。
リモートの検証サーバーで動かしている場合は、localhostをサーバーのIPアドレスに置き換えてアクセスしてください(例: http://192.168.1.100:8080)。
よく使う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 |
| 設定ファイルの構文チェック | docker compose config |
| イメージの再ビルドを含めて起動 | docker compose up -d --build |
現場で通用する安全な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が「データベース接続の確立エラー」を表示する
depends_onだけではMySQLの内部初期化完了まで保証されません。本記事の構成ではhealthcheckで対策済みですが、healthcheckなしのyamlを使っている場合に発生することがあります。
# ログで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'
それでも解消しない場合は、healthcheckを追加してdepends_onの条件をservice_healthyに変更してください。
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
5. 「Cannot connect to the Docker daemon」でcomposeが起動しない
Dockerデーモン自体が停止している場合に発生します。Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
# デーモンの状態を確認する $ sudo systemctl status docker # 停止していれば起動する $ sudo systemctl start docker # 自動起動が無効になっていれば有効化する $ sudo systemctl enable docker
Linux DNS 設定の基本を理解しておくと、本番環境でのドメイン設定や名前解決の仕組みが分かり、Dockerコンテナのネットワーク設計にも応用できます。
まとめ
この記事で解説したDocker ComposeによるWordPress環境構築の手順をまとめます。| 手順 | 操作内容 |
|---|---|
| インストール確認 | docker compose version でv2を確認する |
| 作業ディレクトリ作成 | mkdir ~/wordpress-compose を作成してcdで移動する |
| yaml作成 | docker-compose.ymlにdb・wordpressサービスとボリュームを定義する |
| healthcheck追加(推奨) | MySQLサービスにhealthcheckを設定し、depends_onをservice_healthyにする |
| 起動 | docker compose up -d でバックグラウンド起動する |
| 状態確認 | docker compose ps でSTATUS=Up (healthy)を確認してブラウザでアクセスする |
| 停止・削除 | docker compose down でコンテナとネットワークを削除する |
WordPressのような「Webサーバー+DB」の組み合わせはComposeが最も力を発揮する典型的なユースケースです。
まずは今回の構成を手元で動かし、yamlを少しずつ変えながら理解を深めていきましょう。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、本記事で紹介したDocker Composeの構築手順を、さらに深く学べる講座を用意しています。
→ Dockerマスター講座の詳細はこちら
次に読む記事
Docker・Linuxの理解をさらに深めたい方に、以下の記事もおすすめです。【コンテナ基礎】
・Linuxでdockerを使う入門|コンテナ技術の基礎を初心者向けに解説
【ネットワーク診断】
・Linuxのポート状況を確認するコマンド|ss・lsof・netstatの使い方
【ストレージ・マウント】
・mountコマンドの使い方|デバイスをマウント・アンマウントする方法
【DNS・名前解決】
・LinuxのDNS設定の基本|resolv.confと名前解決の仕組みを解説
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Dockerfileの書き方入門|自分のアプリをイメージ化する基礎と注意点
- 前のページへ:LinuxにNginxをインストールして使う入門・Ubuntu・WSL2でウェブサーバーを構築して初めてのHTMLページを表示する方法
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます