[Docker]WordPress+MySQL環境を構築してみた。

# はじめに

何番目か煎じだとは思いますが、備忘録です。
dockerの勉強として、wordpress、mysqlのコンテナを1つずつ作成し、ネットワークで接続してみました。
ApachとPHPは、wordpressのイメージに始めから入っているため、別途作成はしません。

なお、当記事の内容はこちらの書籍のアウトプット学習となっています。

https://www.amazon.co.jp/dp/B08T961HKP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1


**実行環境**
・windows10
・Docker Desktop for Windows(WSL2)
・コマンドプロンプトで実行

上述の環境で実行していますが、実行内容にwindows固有のものはありません。

# 参考書籍

https://www.amazon.co.jp/dp/B08T961HKP/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

docker入門の定番書です。大変分かり易く内容もするするっと入ってきます。
寝落ちもしない！（当社比）

冒頭にも書きましたが、この記事は上述の書籍のChapter5を実際にハンズオンしてみた内容となっています。
当記事では省いたdockerのインストール方法など、初歩の初歩からkubernetesまでとっても分かり易く説明されています。
気になる方は是非！　

# 手順

手順は以下となります。

|順番|内容|
|:---|:--|
|1.|ネットワークの作成|
|2.|MySQLコンテナの作成|
|3.|WordPressコンテナの作成|
|4.|ブラウザにアクセスして確認|
|5.|作成した環境の削除|

任意の文字列なので、リソース名はご自由に設定して下さい。

|リソース|リソース名|
|:---|:--|
|ネットワーク|wordpress000net1|
|MySQLコンテナ|mysql000ex1|
|wordpressコンテナ|wordpress000ex1|

前置きが長くなりましたが、それでは実際に作成してみます。

# 1. ネットワークの作成

コンテナをただ作成しただけでは、コンテナ同士でやり取りを行うことができません。
そのため、wordpressコンテナとmysqlコンテナを接続する、仮想のネットワークを作成します。
ネットワークの作成には、`network`系コマンドを使用します。

http://docs.docker.jp/v1.11/engine/userguide/networking/dockernetworks.html

というわけで、`wordpress000net1`という名前のネットワークを作成します。

```
# wordpress000net1という名前のネットワークを作成。
$ docker network create wordpress000net1 

# 上手く作成できたのか、ネットワーク一覧の表示で確認。
$ docker network ls

# こんな感じの結果が返ってくる（上の3つはデフォルトネットワーク）。
NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host
23b2bf8c8a01        wordpress000net1    bridge    
```

これでネットワークの作成は完了です。

# 2. MySQLコンテナの作成

dockerhubのイメージから、mysqlコンテナを作成します。

https://hub.docker.com/_/mysql

以下の結構な長さの`run`コマンドを入力します。

```
docker run --name mysql000ex1 -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
```

9つのオプションと3つのmysqlコンテナ固有の引数で構成されています。

**オプション**

|項目|内容|入力した値|
|:--|:--|:--|
|--name|作成するコンテナ名|mysql000ex1|
|-dit|d,i,tオプションの集合。dはバックグラウンドで実行。iはコンテナに操作端末（キーボード）をつなぐ。tは特殊キーを使用可能にする。|なし|
|--net|使用するネットワークの選択。|wordpress000net1|
|-e MYSQL_ROOT_PASSWORD|mysqlのルートパスワード|myrootpass|
|-e MYSQL_DATABASE|作成するデータベースの実物名|wordpress000db|
|-e MYSQL_USER|mysqlのユーザー名|wordpress000kun|
|-e MYSQL_PASSWORD|mysqlのパスワード|wkunpass|

**引数**

|項目|内容|入力した値|
|:--|:--|:--|
|--character-set-server|文字コードの変更。この場合はUTF8。|utf8mb4|
|--collation-server|照合順序の変更。この場合はUTF8。|utf8mb4_unicode_ci|
|--default-authentication-plugin|認証方式の変更。|mysql_native_password|

上2つは、mysqlで日本語を使えるようにする設定です。
「照合順序とはなんぞや？」という向きはこちらの記事などが参考になります。

>参考
[照合順序（SQL Server](https://www.dbsheetclient.jp/blog/?p=1765)
[【MySQL】照合順序とは？](https://qiita.com/kazu56/items/6af85ffcf8d3954455ad)

残る1つの引数はwordpressからmysqlへ接続する認証方式を古いものに変更しています。
mysql8.0からの認証方式である`caching_sha2_password`に、wordpressは対応していません。
そのため、mysql5.7のデフォルト認証プラグインである、`mysql_native_password`に変更します。

これでmysqlコンテナの作成は完了です。
ちゃんと作成されているのか確認してみます。

```
# 起動中のコンテナの一覧表示。
$ docker ps

# 結果
CONTAINER ID   IMAGE   COMMAND 
d020c741fba2   mysql   "docker-entrypoint.s…"
```

# 3. WordPressコンテナの作成

mysql同様、dockerhubのイメージからwordpressコンテナを作成します。
apachとphpもこのイメージに含まれていますが、それらを弄るといったことはしません。

https://hub.docker.com/_/wordpress

これまた結構な長さの`run`コマンドで作成します。

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

10個のオプションから構成されています。なお、引数は使用していません。
`-e`が頭につくオプションでは、連携するmysqlの値を入力しています。
先程作成したmysqlコンテナのことですね。

**オプション**

|項目|内容|入力した値|
|:--|:--|:--|
|--name|作成するコンテナ名|wordpress000ex1|
|-dit|d,i,tオプションの集合。dはバックグラウンドで実行。iはコンテナに操作端末（キーボード）をつなぐ。tは特殊キーを使用可能にする。|なし|
|--net|使用するネットワークの選択。|wordpress000net1|
|-p|ポート番号の指定。左辺が物理的マシンのポート番号、右辺がコンテナのポート番号。コンテナ側で外部の通信を許可していても、マシン側で許可していなければ外部から接続することができない。そのため両者を結びつける必要がある。コンテナのポート番号は固定だが、マシン側は任意の数字。|8085:80|
|-e WORDPRESS_DB_HOST|連携するデータベースのコンテナ名。|mysql000ex1|
|-e WORDPRESS_DB_NAME|連携するデータベースの実物名。|wordpress000db|
|-e WORDPRESS_DB_USER|連携するデータベースのユーザー名。|wordpress000kun|
|-e WORDPRESS_DB_PASSWORD|連携するデータベースのパスワード。|wkunpass|

これでwordpressコンテナの作成は完了です。

```
# 起動中のコンテナの一覧表示。
$ docker ps

# 結果
CONTAINER ID   IMAGE       COMMAND
52e8cecffa13   wordpress   "docker-entrypoint.s…"
d020c741fba2   mysql       "docker-entrypoint.s…"
```



作成するものは全て作成しました。
動くのか実際に確認してみます。

# 5. ブラウザにアクセスして確認

chromeなどのブラウザで`http://localhost:8085/`にアクセスします。
80番ポートなので`http`です。うっかり`https`にしないよう気をつけます。

成功すれば、以下のwordpressの初期画面が表示されます。
ログインすればwordpressを使うこともできます。すごい。

![wordpress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2338398/feca437e-7727-1152-04d3-27c1fabf7c59.png)

# 6. 作成した環境の削除

「コンテナいらないよ」という場合はさっさと作った環境を削除します。
削除するのにも順番があります。
コンテナは、一旦停止させてからでないと、削除することができません。
イメージは、当該イメージから作成したコンテナが存在する場合は削除することができません。
ネットワークは、連携したコンテナが存在する場合は削除することができません。

```
# コンテナの停止
$ docker stop wordpress000ex1
$ docker stop mysql000ex1

# コンテナの削除
$ docker rm wordpress000ex1
$ docker rm mysql000ex1

# イメージの削除
$ docker image rm wordpress
$ docker image rm mysql

# ネットワークの削除 
$ docker network rm wordpress000net1  
```

作成した環境は綺麗さっぱり消えました！
当記事の内容はこれでおしまいです。
ここまでお疲れさまでした。

# おわりに

ほんと今更だけど、docker便利。