最近Docker(2021年時点。現在は完全Docker User)を使う機会が増え、自分でも構築する機会が増えました。以前はVagrantユーザーだったのですが、インストール後の立ち上げの速さは Vagrant から乗り換えました。今回は Docker で WordPress 環境を構築する方法をまとめます。
Dockerは、アプリケーションをコンテナと呼ばれる軽量な仮想環境で実行するためのプラットフォームです。これにより、開発環境と本番環境の違いを最小限に抑え、一貫した動作を保証することができます。
Dockerの基本要素
- Dockerエンジン: コンテナの作成、管理、実行するコア部分。
- Dockerイメージ: アプリケーションとその必要なすべてのファイル、設定、および依存関係を含むテンプレートのようなもの。
- Dockerコンテナ: Dockerイメージから作成される軽量な実行環境。
- DockerHub: Dockerイメージを共有するためのリポジトリ。
Dockerのメリット
- 一貫性: 開発環境と本番環境の違いを最小限に抑え、一貫した動作を保証。
- 効率性: 軽量なコンテナを使用することで、リソースの消費を抑える。
- 移植性: Dockerイメージを使用することで、異なる環境間での移植が容易。
この記事の対象者です。
- Dockerを触ってみたい
- WordPressの環境を気軽に試してみたい
- Dockerの構築を順を追ってやってみたい

神守 由理子/フロントエンドエンジニア
こちらの記事では主に基本操作までを紹介しています。
もっと詳しくカスタマイズしたDockerを作成したい人は、こちらの記事も参考にしてください。
Dockerインストール
Dockerをインストールしていない人は、Docker公式サイトよりアカウントを作成し、インストールします。

Docker Desktop をインストールします。

Docker Desktop のメニュー About Docker Disctop からでも、以下コマンドでバージョンも確認できます。

docker -v
インストールする環境を作成
インストールしたい場所にフォルダを作ります。
/myproject
├-- docker-compose.yml
└-- .env
ここでは仮にWordPressをインストールしたいディレクトリ名をmywordpress
とします。
docker-compose.yml で MySQL と WordPress のコンテナ作成
docker-compose.yml
を作成します。
ファイル名は docker-compose.yml
でも compose.yml
でもどちらでもかまいません。
services:
myproject_wp:
image: wordpress:latest
container_name: myproject_wop #あとでたたくコマンドで必要になる
ports:
- "3000:80" # ポート番号
depends_on:
- mysql # mysqlを立ち上げた後にWordpressを立ち上げる
env_file: .env
volumes:
- ./public:/var/www/html/ # マウントするディレクトリ
# wp-contentやthemesだけでいいのであれば適宜書き換える
# 例:
# - ./wp-content:/var/www/html/wp-content
# - ./themes:/var/www/html/wp-content/themes
networks:
- myproject_network
myproject_db:
image: mysql:8.0
env_file: .env
myproject_db #あとで叩くコマンドで必要になる
command: --default-authentication-plugin=mysql_native_password
ports:
- "3306:3306" #ポート番号の設定
networks:
- myproject_network
# Dockerのネットワークを明示的に追加
networks:
myproject_network:
volumes:
db_data:

Dockerのネットワークを明示的に追加することでサービス間の通信をより制御しやすくなります。
マウントするディレクトリはwp-content
やthemes
だけでいいのであれば適宜書き換えてください。
それぞれのコンテナに container_name
を明示的に付与しておくと、後々コマンドを叩くときに困りません。私はプロジェクト名、サービス名にすることが多いです。

マウントとは、外部のストレージやディレクトリをシステム内の特定の場所に接続し、データを読み書きできる状態にすることです!
サービス名に気をつける
docker-composeファイルで定義されたサービス名が他のプロジェクトのサービス名と重複しないようにすることが重要。これにより、他のコンテナが不意に立ち上がることを防ぐことができます。
例)project名_php
Dockerイメージ「wordpress」
wordpressイメージはWordPress本体(最新)、PHP、サーバー、WordPressに必要なPHP拡張機能が梱包されています。latestを指定すると最新で汎用的なものがコンテナに格納されます。
古いWordPressをインストールしたい場合。
services:
wordpress:
image: wordpress:5.8 #イメージを指定
...
本番環境と合わせたPHPをインストールしたい場合は、DockerHub から wordpress のDockerイメージを探してみてください。
たとえば、php8.1のイメージを使いたい場合。
services:
wordpress:
image: wordpress:php8.1 #イメージを指定
...
DockerHubに必要なイメージがない場合は、Dockerfile
で独自カスタマイズする必要があります。
詳しいやり方を知りたいかたはDocker で本番環境に忠実な開発環境を作る(nginx、PHP-FPM、MariaDB)をご確認ください。
# ベースイメージとしてWordPress 5.8を使用
FROM wordpress:5.8
# 必要なPHPバージョンをインストール
RUN apt-get update && apt-get install -y php8.1 php8.1-mysqli
# 必要なPHPバージョンに切り替える
RUN update-alternatives --set php /usr/bin/php8.1 \ #各必要なモジュールインストール
Dockerイメージ「mysql」
mysqlイメージはMySQLサーバー、MySQLの操作に必要なツール、デフォルトの設定ファイル、ySQLの動作に必要なライブラリや依存関係が含まれています。
Dockerイメージ「mysql:8.0」でデータベースの接続ができなくなる場合
Dockerイメージ mysql:8.0を試そうとしたところ、データベースが接続できなくなりました。
MySQL 8.0以降ではデフォルトの認証プラグインが caching_sha2_password
に変更されました。これが古いクライアントやライブラリとの互換性の問題を引き起こすことがあります。
その場合はMySQLの認証方式を設定するためのオプション、default-authentication-plugin
の設定を変え、使用する認証プラグインを指定することで回避します。
...
mysql:
image: mysql:8.0
container_name: myproject_db
# 以下追記
command: --default-authentication-plugin=mysql_native_password
env_file: .env
ports:
- "3306:3306" #ポート番号の設定
.envファイルを作成
.env
ファイルに定数を定義します。このファイルは、Docker Composeの docker-compose.yml
で設定したenv_file
オプションによって、WordPressとMySQLのコンテナに読み込まれます。
WORDPRESS_DB_NAME=wordpress
WORDPRESS_DB_USER=wp_user
WORDPRESS_DB_PASSWORD=hogehoge
MYSQL_ROOT_PASSWORD=rootpass
MYSQL_DATABASE=wordpress
MYSQL_USER=wp_user
MYSQL_PASSWORD=password
.envファイルの役割
.envファイルは環境変数を定義するためのファイルです。これにより、設定値をコードから分離し、セキュリティとメンテナンス性を向上させることができます。環境変数はコンテナ内で使用され、データベース名、ユーザー名、パスワードなどの機密情報を設定するために使われます。
Dockerイメージによって環境変数がすでに設定されているので、これを活用します。
WordPress のイメージの環境変数
環境変数 | 説明 |
---|---|
WORDPRESS_DB_NAME | WordPressが使用するデータベースの名前。 |
WORDPRESS_DB_USER | WordPressがデータベースに接続するためのユーザー名。 |
WORDPRESS_DB_PASSWORD | WordPressがデータベースに接続するためのパスワード。 |
MySQL のイメージの環境変数
環境変数 | 説明 |
---|---|
WORDPRESS_DB_NAME | WordPressが使用するデータベースの名前。 |
WORDPRESS_DB_USER | WordPressがデータベースに接続するためのユーザー名。 |
WORDPRESS_DB_PASSWORD | WordPressがデータベースに接続するためのパスワード。 |
MYSQL_RANDOM_ROOT_PASSWORD | yesに設定すると、MySQLのrootパスワードがランダムに生成。 |
MYSQL_DATABASE | MySQLに作成されるデータベースの名前。 |
MYSQL_USER | MySQLに作成されるユーザー名。 |
MYSQL_PASSWORD | MySQLユーザーのパスワード。 |
Docker を立ちあげる
docker を立ちあげます。
docker-compose up -d
以下はdocker-compose up
のオプションです。
オプション | 説明 |
---|---|
-d | デタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示--abort-on-container-exit と同時に使えない |
—no-color | 白黒で画面に表示 |
—no-deps | リンクしたサービスを起動しない |
—force-recreate | 設定やイメージに変更がなくても、コンテナを再作成する--no-recreate と同時に使えません |
—no-recreate | コンテナが既に存在していれば、再作成しない--force-recreate と同時に使えない |
—no-build | イメージが見つからなくても構築しない |
—build | コンテナを開始前にイメージを構築する |
—abort-on-container-exit | コンテナが1つでも停止したら全てのコンテナを停止-d と同時に使えない |
-t, —timeout TIMEOUT | アタッチしている、あるいは既に実行中のコンテナを停止する時のタイムアウト秒数を指定 (デフォルト:10) |
—remove-orphans | Compose ファイルで定義されていないサービス用のコンテナを削除 |
—exit-code-from SERVICE | 指定されたサービスコンテナの終了コードを返す--abort-on-container-exit の指定を暗に含む |
—scale SERVICE=NUM | SERVICE のインスタンス数を指定する |
—follow-log | 指定されたサービスのログをフォローし続ける |
-p, —project-name NAME | プロジェクト名を指定する デフォルトはディレクトリ名 |
—profile PROFILE | 指定されたプロファイルを使用してサービスを起動する |
-f, —file FILE | Docker Compose ファイルを指定する 複数のファイルを使用する場合に便利 |
無事に起動したら、アクセスしてみましょう。
http://localhost:3000
フォルダ構成は次のようになっています。
/myproject
├-- docker-compose.yml
├-- public ←新規追加
└-- .env
dockerを終了
docker-compose down
オプションなしで docker-compose down
を実行すると、docker-compose up
で作成したコンテナとネットワークが削除されます。
ボリュームも削除したい場合は、-v
オプションをつけます。
オプション | 説明 |
---|---|
-d | デタッチド・モード: バックグラウンドでコンテナを実行し、新しいコンテナ名を表示--abort-on-container-exit と同時に使えない |
—no-color | 白黒で画面に表示 |
—no-deps | リンクしたサービスを起動しない |
—force-recreate | 設定やイメージに変更がなくても、コンテナを再作成する--no-recreate と同時に使えません |
—no-recreate | コンテナが既に存在していれば、再作成しない--force-recreate と同時に使えない |
—no-build | イメージが見つからなくても構築しない |
—build | コンテナを開始前にイメージを構築する |
—abort-on-container-exit | コンテナが1つでも停止したら全てのコンテナを停止-d と同時に使えない |
-t, —timeout TIMEOUT | アタッチしている、あるいは既に実行中のコンテナを停止する時のタイムアウト秒数を指定 (デフォルト:10) |
—remove-orphans | Compose ファイルで定義されていないサービス用のコンテナを削除 |
—exit-code-from SERVICE | 指定されたサービスコンテナの終了コードを返す--abort-on-container-exit の指定を暗に含む |
—scale SERVICE=NUM | SERVICE のインスタンス数を指定する |
—follow-log | 指定されたサービスのログをフォローし続ける |
-p, —project-name NAME | プロジェクト名を指定する デフォルトはディレクトリ名 |
—profile PROFILE | 指定されたプロファイルを使用してサービスを起動する |
-f, —file FILE | Docker Compose ファイルを指定する 複数のファイルを使用する場合に便利 |
—rmi type | イメージの削除。type は次のいずれか: ‘all’: あらゆるサービスで使う全イメージを削除 ‘local’: image フィールドにカスタム・タグのないイメージだけ削除 |
-v, —volumes | Compose ファイルの volumes セクションの名前付きボリュームを削除また、コンテナがアタッチしたアノニマス・ボリュームも削除 |
オプションを駆使してdockerを完全に削除もあります!
ダンプしてきたデータベースをエントリポイントにおく
ダンプしてきた(サーバーからダウンロード)MySQLなどのファイルを用意します。

エントリポイントとは、プログラムやアプリケーションが実行される際に最初に実行される場所や関数のことです。Dockerでは、コンテナが起動する際に実行されるコマンドやスクリプトを指します!
/myproject
├-- docker-compose.yml
├-- public
├-- mysql/
| └-- data/ (エントリポイント)
| └-- xx.sql
└-- .env
mysql:
image: mysql:8.0
...
volumes:
- ./mysql/data:/docker-entrypoint-initdb.d #./mysql/dataをエントリポイントとして実行
ダンプしてきたMySQLファイルのURLをDocker環境に合わせて http://localhost:3000
に変えておきます。
その他、データベースの接頭辞(通常は wp_
)等環境に応じて適宜変更しておきましょう。
-- Host: localhost Database: wordpress
データベースのリストア・ダンプ
今回は実にシンプルな方法をご紹介します。
手動でリストア(取り込み)するケースもあります。
- エントリポイントで、MySQLデータのリストア失敗
- MySQLデータのリストアやり直したい
データのダンプ(MySQLコンテナからダウンロード)するケースももちろん発生します。
ここでは、個々のコンテナに接続するため、Docker
コマンドを使ってアプローチします。
exec
でコンテナにコマンドを実行(executeは英語で実行という意味)してデータベースの操作をします。
Docker exec コマンドのオプション
オプション | 説明 |
---|---|
-d, —detach=false | デタッチド・モード: コマンドをバックグラウンドで実行 |
—detach-keys | デタッチド・コンテナに特定のエスケープ・キー・シーケンスを設定 |
—help=false | 使い方の表示 |
-i, —interactive=false | アタッチしていなくても STDIN をオープンにし続ける |
—privileged=false | コマンドに拡張 Linux ケーパビリティの追加 |
-t, —tty=false | 疑似ターミナル (pseudo-TTY) の割り当て |
-u, —user= | ユーザ名か UID (書式: <名前 |
データベースのリストア
本番などからダンプしてきたデータベースをリストアする方法です。
前述したように、URLなど適宜書き換えてください。今回はSQLファイルをルートディレクトリに直置きします。
/myproject
├-- docker-compose.yml
├-- public
├-- dump.sql
└-- .env
dump.sql
というファイルをリストアしたい場合、次のようなコマンドを叩きます。
docker exec -i 【コンテナ名】 sh -c 'mysql 【データベース名】 -u root -p【ルートパスワード】' < xxx.sql
# うまく行かない場合はRootで実行
docker exec -i 【コンテナ名】 sh -c 'mysql 【データベース名】 -u 【sqlユーザー名】 -p【sqlパスワード】' < xxx.sql
.env
で設定した環境変数をはめるとこんな感じです。
環境変数で実行。
docker exec -i myproject_db sh -c 'mysql $MYSQL_DATABASE -u $MYSQL_USER -p$MYSQL_PASSWORD' < dump.sql
# うまく行かない場合はRootで実行
docker exec -i myproject_db sh -c 'mysql $MYSQL_DATABASE -u root -p$MYSQL_ROOT_PASSWORD' < dump.sql
直打ちでもOK。
docker exec -i myproject_db sh -c 'mysql wordpress -u wp_user -ppassword' < dump.sql
# うまく行かない場合はRootで実行
docker exec -i myproject_db sh -c 'mysql wordpress -u root -prootpass' < dump.sql
データベースのダンプ
ダンプ方法です。
docker exec -i 【コンテナ名】 sh -c 'mysqldump 【データベース名】 -u 【sqlユーザー名】 -p【sqlパスワード】'> latest.sql
# うまく行かない場合はRootで実行
docker exec -i 【コンテナ名】 sh -c 'mysqldump 【データベース名】 -u root -p【ルートパスワード】'> latest.sql
.env で設定した環境変数をはめるとこんな感じです。
環境変数で実行。
docker exec -i myproject_db sh -c "mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE" < dump.sql
# うまく行かない場合はRootで実行
docker exec -i myproject_db sh -c "mysql -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE" < dump.sql
docker exec -i myproject_db sh -c "mysql -u wp_user -ppassword wordpress" < dump.sql
# うまく行かない場合はRootで実行
docker exec -i myproject_db sh -c "mysql -u root -pprootpass wordpress" < dump.sql
ルート直下にlatest.sqlというDBファイルが追加されます。
/myproject
├-- docker-compose.yml
├-- public
├-- latest.sql ←これ
└-- .env
データベースの確認や削除
Dockerからデータベースの確認をします。
docker exec -it 【コンテナ名】 mysql -u【ユーザー名】 -p
実際のコマンドはこんな感じ。パスワードを聞かれたら入力します。
docker exec -it myproject_db mysql -u $MYSQL_USER -p
データベースを確認します。

mysql> show databases;
mysql> use wordpress;
テーブルを確認します。

mysql> show tables;
データベース削除したい場合はデータベース名を指定して drop
。
mysql> drop wordpress;
テーブルだけ削除したい場合は削除したい場合はテーブル名を,(カンマ)で区切って drop
。
mysql> drop wp_users, wp_posts,....;
sqlの終了。
mysql> exit;
コンテナ内に入る
Web用のサーバー用に立ち上げたコンテナ内に入って、あれこれ調べたり、設定ファイルを確認したいときがあります。
そんな時は以下コマンドで侵入します。
sudo docker exec -it [コンテナID] /bin/bash
dockerを完全に削除
オプションの意味はdockerを終了を参考にしてください。
docker-compose down --rmi all --volumes --remove-orphans
これで気軽に破壊したりできます。
まとめ・Dockerやってみたらカンタンだった
イメージも用意されていて docker-compose.yml
にカンタンなコードを書くだけなのでDockerでWordPressを構築するのは楽勝でした。

個人的には管理もメンテナンスもVagrantよりカンタンです
私の場合、どうしても古い php と WordPress で環境を作る必要があり、今回めちゃ重宝しました。
この記事がみなさんのコーディングライフの一助となれば幸いです。
最後までお読みいただきありがとうございました。
おまけ・よく使うコマンド
すべてのコンテナを強制終了。
docker-compose kill
ネットワーク一覧を取得。
docker network list
現在起動中のコンテナの一覧を表示 。
docker ps
特定のコンテナに接続してコマンドを実行。
docker exec -it CONTAINER_NAME bash
特定のコンテナのログを表示。
docker logs CONTAINER_NAME
実行中のコンテナのリソース使用状況(CPU、メモリなど)をリアルタイムで表示。
docker stats
ローカルに保存されているDockerイメージの一覧を表示。
docker images
ローカルに保存されているDockerイメージの一覧を表示 。
docker volume ls
指定したネットワークを削除。
docker network rm ID