DockerでサクッとWordpress環境を作る

ローカル環境を汚さず好きなだけ WordPress の環境を用意する方法をまとめました。
はじめて WordPress を使う人でもわかりやすいように記述しました。

----

# 準備

Dockerは以下を参考にインストールしておいてください。

Windowsのインストール手順
http://docs.docker.jp/docker-for-windows/step_one.html

> Windows10 Professonal 64bit用ダウンロードページ
> https://hub.docker.com/editions/community/docker-ce-desktop-windows/

> 上記以外のWindows用ダウンロードページ
> https://github.com/docker/toolbox/releases

Macのインストール手順
http://docs.docker.jp/docker-for-mac/step_one.html

この記事を書いた際の環境は下記のとおりです。

- MacOS Catalina 10.15.3
- Docker 19.03.5
- docker-compose 1.25.4

----

# 作業用ディレクトリを作る
※作成場所はどこでも構いません。フォルダ内で環境が管理できるので、複数環境を作りたい場合は複数フォルダを作ればOKです。

```shell
mkdir wordpress1
```

----

# DBサーバとAPサーバの定義を用意する

テキストエディタで以下の内容のファイルを作り、作成したフォルダ内に docker-compose.yml という名前で保存します。(文字コードはUTF-8 BOMなし)

```yml
version: "3.7" # docker-composeの書式のバージョン
services: # 以下にサーバ情報を記載
  db: # データベースサーバ（MySql）名（任意の名前を指定可）
    image: mysql:5.6 # 使用するデータベースのイメージ名とバージョン(https://hub.docker.com/_/mysql)
    restart: always # PC再起動時などDocker自体が起動したときにこのサーバも自動で起動するよう設定
    environment: # 環境変数
      MYSQL_ROOT_PASSWORD: root # rootユーザのパスワード（任意に指定可）
      MYSQL_DATABASE: wordpress_db # WordPress用データベース名（任意に指定可）
      MYSQL_USER: wordpress_user # WordPress用接続ユーザ名（任意に指定可）
      MYSQL_PASSWORD: wordpress_pass # WordPress用パスワード（任意に指定可）
  ap: # アプリケーションサーバ（PHP,WordPress）名（任意の名前を指定可）
    image: wordpress:latest # 使用するWordPressのイメージ名とバージョン(latestは最新を表す https://hub.docker.com/_/wordpress)
    restart: always # PC再起動時などDocker自体が起動したときにこのサーバも自動で起動するよう設定
    depends_on: # 先に起動させるサーバを指定
     - db
    ports:
     - "10080:80" # アプリケーションサーバの80番ポートをローカルの10080番ポートにつなげる（http://localhost:10080 でアクセスできるようになる）
    environment:
      WORDPRESS_DB_HOST: db:3306 # データベースサーバ名：ポート番号
      WORDPRESS_DB_USER: wordpress_user # WordPress用接続ユーザ名(dbの内容に合わせる)
      WORDPRESS_DB_PASSWORD: wordpress_pass # WordPress用パスワード(dbの内容に合わせる)
      WORDPRESS_DB_NAME: wordpress_db # WordPress用データベース名(dbの内容に合わせる)
```

これで、db、apの2つのサーバが作成されます。
※複数環境を用意するときは ports: の 10080 がかぶらないように 10081,10082という感じで設定します。それ以外は同じで問題ありません。

----

# サーバの起動

wordpress1 ディレクトリ内で下記コマンドを実行します。

```shell
docker-compose up -d
```

実行完了までしばらく待ちます。

----

# 起動確認

下記コマンドで各サーバの状態を確認できます。

```shell
docker-compose ps
```

下記のように表示されます。State が Up となっていれば起動しています。

```
     Name                   Command               State           Ports        
-------------------------------------------------------------------------------
wordpress_ap_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:10080->80/tcp
wordpress_db_1   docker-entrypoint.sh mysqld      Up      3306/tcp             
```

----

# Wordpress 初期設定

ブラウザで http://localhost:10080 にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/e6f9ca40-8ed1-e145-b089-89981bf2c217.png)

言語選択画面が表示されるので、日本語を選び「続ける」ボタンを押します。

----

# 必要情報入力

サイトのタイトル、ユーザ名、パスワード、メールアドレスを入力し「WordPressをインストール」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3ae1329a-1f9d-2fb3-9e4a-45cd4c18a205.png)

----

# ログイン

「ログイン」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/3be6d914-5521-2af6-c443-be5b1e6129de.png)

設定したユーザ名、パスワードを入力し、「ログイン」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/786a50b3-6383-fc9b-2103-63da953b6f69.png)

管理画面に入れました。これでインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/a8ee290d-3c68-d0c1-6063-82abbff0078e.png)

----

# DBサーバに入り、テーブル情報を見てみる

wordpress1 ディレクトリ内で以下のコマンドを実行します。

```
docker-compose exec db mysql -uwordpress_user -p wordpress_db
```

```
Enter password: 
```

パスワードを聞かれるので wordpress_pass を入力します。

```
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.6.47 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

mysql クライアントが起動しました。

----

## データベース一覧

下記コマンドでデータベースの一覧を確認できます。

```sql
show databases;
```

docker-compose.yml で指定した wordpress_db が作成されています。

```
+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress_db       |
+--------------------+
2 rows in set (0.00 sec)
```

----

## テーブル一覧

下記コマンドでテーブル一覧を確認できます。

```sql
show tables;
```

WordPress で使用するテーブルが作成されています。

```
+------------------------+
| Tables_in_wordpress_db |
+------------------------+
| wp_commentmeta         |
| wp_comments            |
| wp_links               |
| wp_options             |
| wp_postmeta            |
| wp_posts               |
| wp_term_relationships  |
| wp_term_taxonomy       |
| wp_termmeta            |
| wp_terms               |
| wp_usermeta            |
| wp_users               |
+------------------------+
12 rows in set (0.00 sec)
```

----

## テーブルの内容

下記コマンドでテーブルの中身を確認できます。

```sql
select * from wp_users;
```

```
+----+------------+------------------------------------+---------------+------------------+----------+---------------------+---------------------+-------------+--------------+
| ID | user_login | user_pass                          | user_nicename | user_email       | user_url | user_registered     | user_activation_key | user_status | display_name |
+----+------------+------------------------------------+---------------+------------------+----------+---------------------+---------------------+-------------+--------------+
|  1 | user       | $P$B6hIB70MCnEgXDjdLvlU12ORlbDyL4. | user          | info@example.com |          | 2020-02-21 16:16:10 |                     |           0 | user         |
+----+------------+------------------------------------+---------------+------------------+----------+---------------------+---------------------+-------------+--------------+
1 row in set (0.00 sec)
```

----

## DBサーバから抜ける

exit を実行します。

```
exit
```

----

# APサーバに入る

さきほどDBサーバに入ったように docker-compose exec サーバ名 実行コマンド で入れます。

以下のコマンドで APサーバに入ります。

```
docker-compose exec ap sh
```

入ると以下が表示されるはずです。

```
#
```

----

## カレントディレクトリをみる

pwd コマンドで現在いるディレクトリを確認できます。

```
pwd
```

```
/var/www/html
```

----

## ファイル一覧を見る

ls コマンドでファイル/ディレクトリ一覧を確認できます。

```
ls
```

```
index.php    readme.html      wp-admin            wp-comments-post.php  wp-config.php  wp-cron.php  wp-links-opml.php  wp-login.php  wp-settings.php  wp-trackback.php
license.txt  wp-activate.php  wp-blog-header.php  wp-config-sample.php  wp-content     wp-includes  wp-load.php        wp-mail.php   wp-signup.php    xmlrpc.php
```

----

## ファイルの内容を見る

cat コマンドでファイルの内容を確認できます。

```
cat wp-config.php
```

データベースの接続設定等が確認できます。

```
<?php
/**
 * The base configuration for WordPress
 *
 * The wp-config.php creation script uses this file during the
 * installation. You don't have to use the web site, you can
 * copy this file to "wp-config.php" and fill in the values.
 *
 * This file contains the following configurations:
 *
 * * MySQL settings
 * * Secret keys
 * * Database table prefix
 * * ABSPATH
 *
 * @link https://codex.wordpress.org/Editing_wp-config.php
 *
 * @package WordPress
 */

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress_db');

/** MySQL database username */
define( 'DB_USER', 'wordpress_user');

/** MySQL database password */
define( 'DB_PASSWORD', 'wordpress_pass');

/** MySQL hostname */
define( 'DB_HOST', 'db:3306');

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '');

/**#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define( 'AUTH_KEY',         'cbaae291c44c536f6b94cbb071ac6c66cf068300');
define( 'SECURE_AUTH_KEY',  '759e4f7c08b219ef6276aab82a342091c6cf0618');
define( 'LOGGED_IN_KEY',    'a50c09c57d2aed6d2ecbd3560dc239e42c9e06ed');
define( 'NONCE_KEY',        '580347a26116c13cbb5883d91ec8a7d56587a82a');
define( 'AUTH_SALT',        '03e501a4860d9993968f79eb029f4646ff865bcf');
define( 'SECURE_AUTH_SALT', '28108878c043111feacf6cfb174743b9d353bde4');
define( 'LOGGED_IN_SALT',   '5ed8b34550fb494f125531bfd209ea8e66468401');
define( 'NONCE_SALT',       '41c843fd2b0183f7ee4c70215d6d5f62f29dfabd');

/**#@-*/

/**
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each
 * a unique prefix. Only numbers, letters, and underscores please!
 */
$table_prefix = 'wp_';

/**
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 *
 * For information on other constants that can be used for debugging,
 * visit the Codex.
 *
 * @link https://codex.wordpress.org/Debugging_in_WordPress
 */
define( 'WP_DEBUG', false );

// If we're behind a proxy server and using HTTPS, we need to alert WordPress of that fact
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
}

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
        define( 'ABSPATH', dirname( __FILE__ ) . '/' );
}

/** Sets up WordPress vars and included files. */
require_once( ABSPATH . 'wp-settings.php' );
```

---

## APサーバから抜ける

exit コマンドでシェルを終了すれば抜けます。

```
exit
```

----

# ファイルをサーバからローカルにコピーする

サーバに入っていない状態で、 docker cp (コンテナ名):(コピー元パス) (コピー先パス) コマンドを実行します。
※コンテナ名とは docker-compose ps で表示される name になります。(docker-compose cp はない)
※パスはフルパスで指定します。

```
     Name                   Command               State           Ports        
-------------------------------------------------------------------------------
wordpress_ap_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:10080->80/tcp
wordpress_db_1   docker-entrypoint.sh mysqld      Up      3306/tcp             
```

以下のコマンドでAPサーバの wp-config.php をローカルの /tmp にコピーできます。

```shell
docker cp wordpress_ap_1:/var/www/html/wp-config.php /tmp
```

----

# ファイルをローカルからサーバにコピーする

さっきと逆で docker cp (コピー元パス) (コンテナ名):(コピー先パス) とするとできます。

ローカルで設定ファイルを書き換えてサーバに反映させたいときには以下のようにします。

```shell
docker cp /tmp wordpress_ap_1:/var/www/html/wp-config.php
```

----

サーバ上のファイルをエディタで直接変更したい場合は VSCode の Remote Development プラグインを使うとできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/ed748fe6-9bbe-3fb9-1168-4258d1769f72.png)

プラグインをインストールして、画面左のディスプレイアイコンを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4c1a16f8-476a-29cc-1fd4-70905396739a.png)

Other Containerというところに、 wordpress_ap_1, wordpress_db_1 が表示されるので、選択して右側の![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/0e25534d-a46a-ec77-a45f-fc59a75546be.png)をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/d6322a12-cf61-5f5b-05f6-05a0bf95d2cf.png)

サーバ内のファイルを編集できるウインドウが立ち上がります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/5baa1ab3-3c2d-ae6e-5476-c23a930a4957.png)

「Open Folder」 ボタンを押して、 /var/www/html を入力し、「OK」ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/2a49f1a9-b70f-3b58-6087-6af19f49c2fd.png)

APサーバ内のファイルが一覧表示され、自由に編集できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/54e12fdc-2afc-3d5d-22bb-786218bdef6f.png)

----

# 初期状態に戻す方法

色々編集していて環境がおかしくなったときなどで、最初の状態に戻したい場合は docker-compose down でキャッシュを消して docker-compose up で再度起動すると言語選択画面からまたやり直すことができます。データベースも初期状態になるので注意してください。
※ 環境が要らなくなった場合は docker-compose down のあと wordpress1 フォルダを消せばOKです。

```
docker-compose down
Stopping wordpress_ap_1 ... done
Stopping wordpress_db_1 ... done
Removing wordpress_ap_1 ... done
Removing wordpress_db_1 ... done
Removing network wordpress_default
```

このあたりを知っておけば好きなように環境を作ったり消したりできるかと思います。

----

# Windows環境でブラウザにエラーが表示される場合

![21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/019df3e8-c076-e538-533b-c81a0662fe3a.png)

Windowsで同様に環境構築しているとサーバ起動後にブラウザでうまく表示されなかったので、対応方法を追記します。

環境は

- Windows10Home 64bit
- DockerToolbox-19.03.1.exe をインストール
- docker-compose version 1.24.1
- Docker version 19.03.1
- 
です。

調べるとDockerToolboxは裏でVirtualBoxという仮想マシンを動かしている関係で
その設定が必要なようです。

VirtualBoxのポートフォワーディングの設定が必要です。設定手順は次の通りです。

----

## VirtualBoxのポートフォワーディングの設定

![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/37d5c74f-4c85-242f-0c18-a8322e33ed33.png)

デスクトップのOracle VM VirtualBox を起動します。

![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/4e5d8b0d-92f7-a6ca-146d-841d06c3b25a.png)

設定ボタンを押して、「ネットワーク」タブの「高度」を開いた中にある「ポートフォワーディング」ボタンを押します。

![17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/7d06b48a-816f-ab2e-b7d6-252ca6090986.png)

右側の追加ボタン![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/ac61c2b8-c293-0563-3909-0551147fa23a.png)を押して、名前は任意（ここでは wordpress）、ホストポート10080、ゲストポート80を入力し「OK」ボタンを2回押します。

![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/00952a4b-706b-6cc2-96cc-cd838ea2a472.png)

下記画面が表示された場合は「アクセスを許可する」ボタンを押してください。

![19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/09b27f70-1c65-b490-c8e0-255e1b640e11.png)

※これでいけるはずなのですが、なぜかホストポートも80にしないと私の環境ではうまく動作しませんでした。ホストポート10080だとうまくいかない場合は80に設定し、docker-compose.yml のports: も 80:80 に書き換えて
docker-compose down
docker-compose up -d
とし、 http://localhost を開けばうまくいくはずです。

![203.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/f4e63c56-c8d9-e5da-d674-ceef9896b3f7.png)

これで下記画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82535/eb62ecf4-afe2-1c5c-e436-e77be4a567e3.png)