DockerでWordPress環境を構築

# はじめに
本ページでは、
Dockerを用いてブログサイト作成用のOSS製品である<b>WordPress</b> の実行環境を構築するハンズオンを通して、
Dockerの基本的な操作 と Dockerの利便性を学んでいただきます。

# 前提条件
- ホストOS：CentOS 7  
- Dockerインストール済み  
※未インストールの場合は、   [こちら](https://qiita.com/n-yamanaka/items/ddb18943f5e43ca5ac2e) を参考にインストールしてください。

# 参考
[こちら](https://qiita.com/Kokufuda-326/items/075adbfe4f32f3d54406) に よく使うDockerコマンドについてまとめていますので、ご参考ください。
 
---
# それでは、WordPress環境を構築してみましょう
### 1. イメージファイルの準備
DockerHubからイメージファイルを取得します。
WordPress環境を構築するには、WordPressのDockerイメージに加えて、
DB用にMySQLのDockerイメージも必要です。

以下２つのDockerイメージを使用します。

- [WordPress](https://hub.docker.com/_/wordpress/)
- [MySQL](https://hub.docker.com/_/mysql/)

はじめに `docker search` コマンドで、Dockerイメージを検索してみましょう。

```
$ docker search wordpress

NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
wordpress                               The WordPress rich content management system…   2940                [OK]                
bitnami/wordpress                       Bitnami Docker Image for WordPress              107                                     [OK]
appcontainers/wordpress                 Centos/Debian Based Customizable Wordpress C…   34                                      [OK]
etopian/alpine-php-wordpress            Alpine WordPress Nginx PHP-FPM WP-CLI           20                                      [OK]
centurylink/wordpress                   Wordpress image with MySQL removed.             14                                      [OK]
・・・
```
検索結果が表示されました。
今回は OFFICIAL イメージである、`wordpress`という名前のDockerイメージを使用します。

同じく MySQL も検索してみましょう。

```
$ docker search mysql

NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                                   MySQL is a widely used, open-source relation…   8086                [OK]                
mariadb                                 MariaDB is a community-developed fork of MyS…   2740                [OK]                
mysql/mysql-server                      Optimized MySQL Server Docker images. Create…   604                                     [OK]
zabbix/zabbix-server-mysql              Zabbix Server with MySQL database support       188                                     [OK]
hypriot/rpi-mysql                       RPi-compatible Docker Image with Mysql          113                                     
・・・
```
こちらも検索結果が表示されました。
同じく OFFICIAL イメージである、`mysql`という名前のDockerイメージを使用します。

それでは、この２つのDockerイメージを取得（Pull）していきます。
ここでは wordpress は `5.4.2`　をtag指定します。
mysql は wordpress との連携確認済みの `5.7.21` をtag指定します。

```
$ docker pull mysql:5.7.21

5.7.21: Pulling from library/mysql
2a72cbf407d6: Pull complete 
38680a9b47a8: Pull complete 
4c732aa0eb1b: Pull complete 
c5317a34eddd: Pull complete 
f92be680366c: Pull complete 
e8ecd8bec5ab: Pull complete 
2a650284a6a8: Pull complete 
5b5108d08c6d: Pull complete 
beaff1261757: Pull complete 
c1a55c6375b5: Pull complete 
8181cde51c65: Pull complete 
Digest: sha256:691c55aabb3c4e3b89b953dd2f022f7ea845e5443954767d321d5f5fa394e28c
Status: Downloaded newer image for mysql:5.7.21


$ docker pull wordpress:5.4.2

5.4.2: Pulling from library/wordpress
27833a3ba0a5: Pull complete 
2d79f6773a3c: Pull complete 
f5dd9a448b82: Pull complete 
95719e57e42b: Pull complete 
cc75e951030f: Pull complete 
78873f480bce: Pull complete 
1b14116a29a2: Pull complete 
887fc426d9b4: Pull complete 
e8a2a7e68e47: Pull complete 
44116bd4b499: Pull complete 
5a7ed133cf7c: Pull complete 
a0cc2e7ce3b9: Pull complete 
3ea943f2a6e6: Pull complete 
b7cbb4ae8469: Pull complete 
f1ee59d1627e: Pull complete 
480e816f1b42: Pull complete 
9803a14680f4: Pull complete 
a9d5149d7240: Pull complete 
7a162cc00537: Pull complete 
Digest: sha256:eb7fb32d7098153b586cb6c0c8c7fb3b9684c66ccff803734b0895e49210fe08
Status: Downloaded newer image for wordpress:5.4.2
```

取得したDockerイメージを `docker images` コマンドで確認してみましょう。

```
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           5.4.2               837092bc87de        3 weeks ago         421MB
mysql               5.7.21              5195076672a7        13 months ago       371MB
```
Dockerイメージが取得できていることが確認できました。

### 2. Dockerコンテナの起動
イメージファイルから、コンテナを起動していきます。
まずは、MySQLコンテナを起動します。

```
$ docker run -d -it --name test-mysql -e MYSQL_ROOT_PASSWORD=password mysql:5.7.21
```
`-d` ：コンテナをバックグラウンドでの実行するためのオプション
`-it`：コンテナに標準入力とTTY（端末デバイス）を提供するオプション
　　　 →このオプションをつけると、コンテナにログインできるようになります。
`--name`：コンテナにユーザ指定の名前を付与するオプション。
　　　　　 →ここでは、test-mysql という名前を付与しています。
`-e`：環境変数を定義するオプション
　　　→MySQLのパスワードとして 「password」を設定しています。

つづいて、WordPressコンテナを起動します。

```
$ docker run -d -it --name test-wordpress --link test-mysql:mysql -p 8080:80 wordpress:5.4.2
```
`--link`：複数のコンテナを連携するためのオプション
　　　　　→WordPressコンテナに、先ほど起動した test-mysql コンテナを紐づけています。
`-p`：ホストのIPをコンテナのIPとマッピングするためのオプション
　　　→コンテナのポート 80（HTTP）を、ホストのポート 8080 にマッピングしています。

起動したコンテナを `docker ps` コマンドで確認してみましょう。
`-a` オプションをつけることで、停止中のコンテナを含めてすべて表示します。

```
$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
0482597eb65c        wordpress:5.4.2     "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   test-wordpress
b3fe0d703916        mysql:5.7.21        "docker-entrypoint.s…"   12 minutes ago      Up About a minute   3306/tcp                test-mysql
```
wordpressコンテナと、mysqlコンテナが起動していることが確認できました。

### 3. WordPressコンテナに接続
ブラウザを起動して、http://<ホストのIPアドレス>:8080 にアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/3ef28d9b-2ebc-b258-e16e-8d2a19649c1e.png)
WordPress の初期画面が表示されました。
ここでは 日本語 を選択して、「続ける」 を押下してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/7e5e118c-6bae-fb18-814f-5f401dee1ac4.png)
つづいて、必要情報の入力を求められます。
サイトのタイトル、ユーザー名、パスワード、メールアドレス を入力してください。
※メールアドレスは、実在しないものでも構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/aa8b5080-8c50-a6aa-5850-b309155e87ec.png)
初期設定が完了しました。「ログイン」を押下してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/652b4585-da53-dc80-efe3-015d21e3fcd3.png)
先ほど設定した、ユーザー名、パスワードを入力して「ログイン」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/d6e94d4b-fb8d-3a58-65de-64a8c78a471e.png)
WordPressが使用できるようになりました。
せっかくですので適当に触ってみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/3f5d4bf3-52b3-3589-1da9-8ab932ce9d2c.png)
WordPressでは、このようなブログサイトを簡単に作成することができます。

### 4. コンテナ操作
起動中のコンテナにログインするには、 `docker exec` コマンドを使用します。

`docker exec` は、コンテナ内で指定したコマンドを実行します。
ここでは、`/bin/bash`コマンドを起動することで bash ターミナルを起動し、
bashターミナルからコンテナ内の操作を行うことができるようになります。

```
$ docker exec -it test-wordpress /bin/bash

root@0482597eb65c:/var/www/html# ls -la

total 208
drwxrwxrwx.  5 www-data www-data  4096 May  2 13:54 .
drwxr-xr-x.  1 root     root        18 Mar 27 01:00 ..
-rw-r--r--.  1 www-data www-data   235 May  2 14:03 .htaccess
-rw-r--r--.  1 www-data www-data   420 Nov 30  2017 index.php
-rw-r--r--.  1 www-data www-data 19935 Jan  1 20:37 license.txt
-rw-r--r--.  1 www-data www-data  7425 Jan  9 02:56 readme.html
-rw-r--r--.  1 www-data www-data  6919 Jan 12 06:41 wp-activate.php
drwxr-xr-x.  9 www-data www-data  4096 Mar 13 00:18 wp-admin
-rw-r--r--.  1 www-data www-data   369 Nov 30  2017 wp-blog-header.php
-rw-r--r--.  1 www-data www-data  2283 Jan 21 01:34 wp-comments-post.php
-rw-r--r--.  1 www-data www-data  2808 May  2 13:54 wp-config-sample.php
-rw-r--r--.  1 www-data www-data  3176 May  2 13:54 wp-config.php
drwxr-xr-x.  7 www-data www-data    99 May  2 14:07 wp-content
-rw-r--r--.  1 www-data www-data  3847 Jan  9 08:37 wp-cron.php
drwxr-xr-x. 19 www-data www-data  8192 Mar 13 00:18 wp-includes
-rw-r--r--.  1 www-data www-data  2502 Jan 16 05:29 wp-links-opml.php
-rw-r--r--.  1 www-data www-data  3306 Nov 30  2017 wp-load.php
-rw-r--r--.  1 www-data www-data 38883 Jan 12 06:41 wp-login.php
-rw-r--r--.  1 www-data www-data  8403 Nov 30  2017 wp-mail.php
-rw-r--r--.  1 www-data www-data 17947 Jan 30 11:01 wp-settings.php
-rw-r--r--.  1 www-data www-data 31085 Jan 16 16:51 wp-signup.php
-rw-r--r--.  1 www-data www-data  4764 Nov 30  2017 wp-trackback.php
-rw-r--r--.  1 www-data www-data  3068 Aug 17  2018 xmlrpc.php

root@0482597eb65c:/var/www/html# cat index.php

<?php
/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define( 'WP_USE_THEMES', true );

/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
```
コンテナからログアウトするには `exit` を入力します。

```
root@0482597eb65c:/var/www/html# exit
exit
```

コンテナを停止するには、`docker stop` コマンドを使用します。

```
$ docker stop test-wordpress
```

`docker ps -a` コマンドで、コンテナの状態を確認してみましょう。

```
$ docker ps -a
CONTAINER ID        IMAGE            COMMAND                  CREATED             STATUS                     PORTS                   NAMES
0482597eb65c        wordpress:5.4.2  "docker-entrypoint.s…"   33 minutes ago      Exited (0) 6 seconds ago                           test-wordpress
b3fe0d703916        mysql:5.7.21     "docker-entrypoint.s…"   45 minutes ago      Up 34 minutes              3306/tcp                test-mysql
```
test-wordpress コンテナが 停止（Exited(0)）となっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/595c1f20-6ac0-81e1-d0ec-56527ffd3959.png)
ブラウザをリロードしてみると、
WordPressにアクセスできなくなっていることがわかります。

コンテナを再度起動するには、`docker start` コマンドを使用します。

```
$ docker start test-wordpress
```

`docker ps -a` コマンドで、コンテナの状態を確認してみましょう。

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
0482597eb65c        wordpress:5.4.2     "docker-entrypoint.s…"   38 minutes ago      Up 4 seconds        0.0.0.0:8080->80/tcp   test-wordpress
b3fe0d703916        mysql:5.7.21        "docker-entrypoint.s…"   About an hour ago   Up 39 minutes       3306/tcp                test-mysql
```
test-wordpress コンテナが 起動（UP）していることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393955/6ab1e1dd-ca7b-a9f1-65d0-0665ae265e36.png)
ブラウザをリロードしてみると、
再びWordPressにアクセスできるようになっていることがわかります。

### 5. 後片付け
起動したコンテナ、取得（Pull）したDockerイメージを削除しましょう。

まずは、コンテナを削除します。
コンテナを削除するには、`docker stop` コマンドでコンテナを停止したのち、
`docker rm` コマンドで、コンテナを削除します。

```
$ docker stop test-wordpress
$ docker stop test-mysql

$ docker rm test-wordpress
$ docker rm test-mysql
```

`docker ps -a` コマンドで、コンテナが削除されていることが確認できます。

```
$ docker ps -a
CONTAINER ID        IMAGE        COMMAND                  CREATE
```

つづいて、Docker イメージを削除します。
まずは`docker images` コマンドで、Docker イメージ一覧を確認します。

```
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           5.4.2               837092bc87de        3 weeks ago         421MB
mysql               5.7.21              5195076672a7        13 months ago       371MB
```

Docker イメージを削除するには、`docker rmi` コマンドを使用します。

```
$ docker rmi wordpress:5.4.2

Untagged: wordpress:5.4.2
Untagged: wordpress@sha256:eb7fb32d7098153b586cb6c0c8c7fb3b9684c66ccff803734b0895e49210fe08
Deleted: sha256:837092bc87def29cf6e40fbbe65dafee9715b5a64d32fc94aec7c73773805a29
Deleted: sha256:c76dd05c6fcb07bcda3b8d982978b7537f38f9b654649e69653c15fbfd1c20ee
Deleted: sha256:2c4f25a6cdd08288d1df7282f545b5e5b4530e5c236243a43ce593fd78f4bac4
Deleted: sha256:5df0a75e0c8651eaf6cb85dbb4c615b91792f9d26fe36c07fc014f267559bb0e
Deleted: sha256:d7db080c0d7ad12bb9d11917cad9d923c76a582766339099101c7925cbe30ef5
Deleted: sha256:cdd4986c7ffa5488603aef15a0d744c87ec7d3cef4071f9403a136df84f434a4
Deleted: sha256:de0022b247a256c3f5a2d6588bef354dadc81b08602763e94a000294ded1bc5d
Deleted: sha256:aa988a8f2b781c15509381977bc1f12df337537c83738bf67eae8bcc85d75827
Deleted: sha256:ba59a6f26aa22f6ef9f2a63bf5a51b3117fb22fb04f12c41bd952faf92c8b6e7
Deleted: sha256:47bdab2bb3d864d3a7a0962326932e38d927a7906dc6aacc57eb524f17ada731
Deleted: sha256:9ced8dd73fb478fb39612794f846211860dcb385902413affbd7919525db7e96
Deleted: sha256:18b2306bc0923de694a056448d2d2e33439f6d02b36b0c6a3d0ed7c323dd4418
Deleted: sha256:17e42b23df8e620e13fa4130fd9a04c43589b5b348480513518fbf6ce9694dfb
Deleted: sha256:dca11b225a640f6c1dac7264469049213078a7c63e99f764851f3a9167463757
Deleted: sha256:aa6e5d2a1c7485b528c7b47ac0aa15a158edc489ce09ae8393b2ed0f6219bd8e
Deleted: sha256:80537a100f0e62fa82ca4420923b120192d72471f1965e7309ffec811de4670b
Deleted: sha256:bad56acc3d625fc0cc379915485cb4f396730097ec1734205f828c7d43d02715
Deleted: sha256:4d0b85a183f5c00e734d5ad7b81c97e97dd8af3b55d5cf929125238faa0c8bf8
Deleted: sha256:ab76068f12a968afdfbabdad9a850102607c5095d3b34ed3b8e00a15ff72639a
Deleted: sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda


$ docker rmi mysql:5.7.21

Untagged: mysql:5.7.21
Untagged: mysql@sha256:691c55aabb3c4e3b89b953dd2f022f7ea845e5443954767d321d5f5fa394e28c
Deleted: sha256:5195076672a7e30525705a18f7d352c920bbd07a5ae72b30e374081fe660a011
Deleted: sha256:bc52f6d08bc65c22baab4384ae534d4c5ba8c988197de49975e0a0f78310dd89
Deleted: sha256:b2590548a0917767b420cf20d0cef3aae8912314de216f624c0840f3ad827aa7
Deleted: sha256:756d63a7d5896b52d445ea84ee392cb08a7c119322cfcdfed6303de1ed0d0eab
Deleted: sha256:8e4736576db75536185beba95c5877deeb3915740688cbbc17fe04aed3632282
Deleted: sha256:e6e6e1bb8a16eadbe6628770767615fbc8d67bf11dde69a902116efe847baa7e
Deleted: sha256:080b6c4ec1d55d91a7087e12ae3bd4df252148d94f9911209e0a83d50dc63784
Deleted: sha256:58b97da9f98f75af01ae59c3cb1fdd07a07297015459f3f9f88b140699b29147
Deleted: sha256:3918448e7fe95f36f67a55c938559bab787249b8fa5c7e9914afd46994d045b0
Deleted: sha256:fac8373d1ec4f5bb6c13f12170f558edc3cfbfe8215ae3d1c869940401bc14cf
Deleted: sha256:130f3e567e288fdbbc3ae7cd7aa6c8b3d952bebd3eae58f0a7da93acbb22a258
Deleted: sha256:3358360aedad76edf49d0022818228d959d20a4cccc55d01c32f8b62e226e2c2
```

再度`docker images` コマンドを入力すると、
Docker イメージが削除されていることが確認できます。

```
$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
```

# ハンズオンは以上です。 お疲れ様でした。