Dockerを使ってWordPressとMySQLのローカル開発環境を構築する手順


## この記事の対象者
- Dockerに興味があるが、どのように使用すれば良いかわからない方
- WordPressのローカル開発環境を簡単に構築したい方
- コンテナ化された開発環境について学びたい方

## 参照サイト
[Docker公式ドキュメンテーション](https://docs.docker.jp/engine/reference/)
[WordPress Docker Image](https://hub.docker.com/_/wordpress)
[MySQL Docker Image](https://hub.docker.com/_/mysql)

## 開発環境
- Docker 20.10.7
- WordPress Ver 6.2.2
- MySQL Ver 8.0.33

## 基本的な環境構築方法
Dockerを使ってWordPressとMySQLのコンテナを作成し、ローカルでの開発環境を構築する方法をご紹介します。この方法を使えば、環境構築の手間を大幅に削減でき、さらに環境差異によるトラブルを防ぐことができます。

#### 1: まずは、Docker内で新しいネットワークを作成します。このネットワークは、後で作成するMySQLコンテナとWordPressコンテナが通信するためのものです。

```
docker network create wordpress000net1
```

#### 2: 次に、MySQLのDockerコンテナを作成し、起動します。ここでは、MySQLの設定を行うための環境変数を設定しています。

```
docker run --name mysql000ex11 -dit --net=wordpress000net1 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
```

#### このコマンドはMySQLのコンテナを作成し、起動します。それぞれのオプションは以下の通りです。

- `docker run`: Dockerコンテナを作成し、実行するコマンドです。
- `--name mysql000ex11`: コンテナにmysql000ex11という名前を付けます。
- `-dit`: -dはコンテナをバックグラウンドで実行（デタッチモード）、-iはインタラクティブモード、-tは仮想端末（tty）を割り当てるオプションです。
- `--net=wordpress000net1`: wordpress000net1という名前のネットワークに接続します。
- `-e MYSQL_ROOT_PASSWORD=myrootpass`: 環境変数としてMySQLのrootユーザーのパスワードを設定します。
- `-e MYSQL_DATABASE=wordpress000db`: 環境変数として作成するデータベースの名前を設定します。
- `-e MYSQL_USER=wordpress000kun`: 環境変数として作成するMySQLのユーザー名を設定します。
- `-e MYSQL_PASSWORD=wkunpass`: 環境変数として上記ユーザーのパスワードを設定します。
- `mysql`: 使用するイメージ名を指定します。
- `--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password`: MySQLの設定を指定します。文字セット、照合順序、認証プラグインを設定しています。

#### 使用するMySQLのオプション

| 項目 | オプション | 値 |
| --- | --- | --- |
| ネットワーク名 | `--net` | `wordpress000net1` |
| MySQLのコンテナ名 | `--name` | `mysql000ex11` |
| 実行オプション | `-dit` | N/A |
| MySQLのルートパスワード | `-e MYSQL_ROOT_PASSWORD` | `myrootpass` |
| MySQLのデータベース名 | `-e MYSQL_DATABASE` | `wordpress000db` |
| MySQLのユーザー名 | `-e MYSQL_USER` | `wordpress000kun` |
| MySQLのパスワード | `-e MYSQL_PASSWORD` | `wkunpass` |



#### 3: 次に、WordPressのDockerコンテナを作成し、起動します。ここでは、WordPressがMySQLデータベースに接続するための情報を提供する環境変数を設定しています。

```
docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
```

#### このコマンドはWordPressのコンテナを作成し、起動します。それぞれのオプションは以下の通りです。

- `docker run`: Dockerコンテナを作成し、実行するコマンドです。
- `--name wordpress000ex12`: コンテナにwordpress000ex12という名前を付けます。
- `-dit`: -dはコンテナをバックグラウンドで実行（デタッチモード）、-iはインタラクティブモード、-tは仮想端末（tty）を割り当てるオプションです。
- `--net=wordpress000net1`: wordpress000net1という名前のネットワークに接続します。
- `-p 8085:80`: ホストの8085ポートをコンテナの80ポートにマッピングします。これにより、ホストマシンの8085ポートでアクセスすると、コンテナの80ポート（WordPressが動作しているポート）にアクセスできます。
- `-e WORDPRESS_DB_HOST=mysql000ex11`: 環境変数としてWordPressが接続するデータベースのホスト名（ここではMySQLコンテナの名前）を設定します。
- `-e WORDPRESS_DB_NAME=wordpress000db`: 環境変数としてWordPressが使用するデータベースの名前を設定します。
- `-e WORDPRESS_DB_USER=wordpress000kun`: 環境変数としてデータベースのユーザー名を設定します。
- `-e WORDPRESS_DB_PASSWORD=wkunpass`: 環境変数として上記ユーザーのパスワードを設定します。
- `wordpress`: 使用するイメージ名を指定します。

#### 使用するWordPressのオプション

| 項目 | オプション | 値 |
| --- | --- | --- |
| ネットワーク名 | `--net` | `wordpress000net1` |
| WordPressのコンテナ名 | `--name` | `wordpress000ex12` |
| 実行オプション | `-dit` | N/A |
| ポート番号を指定 | `-p` | `8085:80` |
| データベースのコンテナ名 | `-e WORDPRESS_DB_HOST` | `mysql000ex11` |
| データベース領域名 | `-e WORDPRESS_DB_NAME` | `wordpress000db` |
| データベースのユーザー名 | `-e WORDPRESS_DB_USER` | `wordpress000kun` |
| データベースのパスワード | `-e WORDPRESS_DB_PASSWORD` | `wkunpass` |



これで、WordPressとMySQLのコンテナが作成され、起動しました。docker psコマンドを使って、コンテナが正しく起動していることを確認しましょう。

```
docker ps 
```

#### 4: 最後に、ブラウザで`http://localhost:8085`にアクセスし、WordPressが正しく動作していることを確認します。

#### 5: MySQLとWordPressのVersionの確認方法

##### MySQLのバージョンを確認するには、MySQLのコンテナに入り、以下のコマンドを実行します。
```
docker exec -it mysql000ex11 mysql -V
```
このコマンドはMySQLのバージョン情報を表示します。出力の中に "Ver x.x.x" のような形式でバージョン番号が表示されます。

##### WordPressのバージョンを確認するには、以下の手順を実行します。

WordPressが動作しているコンテナに入ります。以下のコマンドを実行します。
```
docker exec -it wordpress000ex12 bash
```
コンテナ内部に入ったら、wp-includes/version.php ファイルを開きます。このファイルにはWordPressのバージョン情報が含まれています。以下のコマンドを実行します。
```
cat /var/www/html/wp-includes/version.php
```
コマンドを実行すると、ファイルの内容が表示されます。その中に `$wp_version = 'x.x.x';` のような行があります。ここに書かれている `'x.x.x'` がWordPressのバージョンです。

#### 6: 開発が終わったら、以下のコマンドでコンテナを停止し、削除します。これにより、Docker環境をクリーンな状態に戻すことができます。

```
docker stop wordpress000ex12
docker stop mysql000ex11
docker rm wordpress000ex12
docker rm mysql000ex11
docker image rm wordpress
docker image rm mysql
docker network rm wordpress000net1
```

## Docker-Composeを使用した開発環境の構築

Docker Composeを使用すると、複数のコンテナを一度に管理することができます。それでは、Docker Composeを使ってWordPressとMySQLのローカル開発環境を構築する方法をご紹介します。

1: まず、以下の内容でdocker-compose.ymlファイルを作成します。このファイルは、WordPressとMySQLのコンテナを定義し、それぞれの設定を行います。

```
version: '3.8'
services:
  db:
    image: mysql:latest
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: myrootpass
      MYSQL_DATABASE: wordpress000db
      MYSQL_USER: wordpress000kun
      MYSQL_PASSWORD: wkunpass
    command: '--default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci'
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8085:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress000kun
      WORDPRESS_DB_PASSWORD: wkunpass
      WORDPRESS_DB_NAME: wordpress000db
volumes:
  db_data: {}
```

2: 次に、以下のコマンドを実行して、Docker Composeを使ってコンテナを作成し、起動します。

```
docker-compose up -d
```
これで、WordPressとMySQLのコンテナが作成され、起動しました。ブラウザで`http://localhost:8085`にアクセスし、WordPressが正しく動作していることを確認します。

開発が終わったら、以下のコマンドでコンテナを停止し、削除します。これにより、Docker環境をクリーンな状態に戻すことができます。

```
docker-compose down --volumes
```

以上で、Docker Composeを使ってWordPressとMySQLのローカル開発環境を構築する方法の説明を終わります。この方法を使えば、複数のコンテナを一度に管理し、環境構築の手間をさらに削減することができます。ぜひ試してみてください。