今更だけどDockerでWordPress環境を用意してみたら超簡単だった

# はじめに
今回はだいぶ今更感のあるDockerについて備忘録。
仮想環境はVirtualBox＋Vagrant一択かと思っていましたが、Docker軽くて良い！

違いとかは詳しく書いてる記事が他にあります。

- [VagrantとDockerについて名前しか知らなかったので試した](https://qiita.com/hidekuro/items/fc12344d36d996198e96)

## 0. Dockerを使い始めた経緯
個人で作成している検証環境を用意するほどでもないWordPressサイトを
ローカルで動作確認したかったので、Dockerで用意することにしました。


# Dockerのインストール
## 1. 環境に応じてDockerをインストール

### ＊ Windowsの場合
**Windows 10 Professional／Enterprise 64-bit**：[Docker CE for Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows)

**それ以外**：[Docker Toolbox](https://docs.docker.com/toolbox/overview/#whats-in-the-box)


### ＊ Mac OSの場合

**OS X Yosemite 10.10.3 以降**：[Docker CE for Mac](https://store.docker.com/editions/community/docker-ce-desktop-mac)

**それ以前**：[Docker Toolbox](https://docs.docker.com/toolbox/overview/#whats-in-the-box)


<img width="1270" alt="スクリーンショット 2018-03-18 23.55.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/dc0f2bd5-5bda-d062-9fa5-805caf7b1701.png">


自分はMac OS 10.12.6 だったのでDocker CE for Macを使用です。

弊家のショボいネット環境でダウンロードに3,4分くらいかかりました。336MBでした。

インストール後は指示に従ってアプリケーションフォルダに移動した後、ダブルクリックで一度開きます。

ログインを求められるので、アカウントがあればログイン、なければ新規登録します。

<img width="720" alt="スクリーンショット 2018-03-19 0.07.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/656b8532-6c9f-f99c-2237-4ae1f65b52bc.png">

<img width="714" alt="スクリーンショット 2018-03-19 0.09.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/50a03c6d-6abd-d2dc-c865-1ab410be57a4.png">


## 2. 動作確認
インストールが成功しているかターミナルを開いて確認します。

```console
$ docker ps
CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
```

`docker ps` でコンテナリストを表示します。
インストールしただけであれば、上記のとおり、ヘッダーのみが表示されるはず。


# WordPress環境構築

## 3. イメージファイル準備
すでに、アプリケーションのインストールまで設定されているイメージファイルがあるみたいだったので
今回はそれをそのまま利用する方法で構築します。

ちなみにWordPressを動かすためにMySQLも必要です。


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

どちらもpullコマンドで簡単ダウンロード。
何も指定しなければ最新版が落とされます。

```console
$ 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

Using default tag: latest
latest: Pulling from library/wordpress
2a72cbf407d6: Pull complete 
273cd543cb15: Pull complete 
ec5ac8875de7: Pull complete 
9106e19b56c1: Pull complete 
ee2f70ac7c7d: Pull complete 
7257ad6985e8: Pull complete 
18f5c2055da2: Pull complete 
85293a6fdd80: Pull complete 
9e797eeb0c14: Pull complete 
09b55b88e646: Pull complete 
2cd18314711e: Pull complete 
2cdde1a28323: Pull complete 
fc3ee0d04adb: Pull complete 
b7e1265473a6: Pull complete 
f607995e3490: Pull complete 
40b3f428704d: Pull complete 
0ab6b2d829e0: Pull complete 
741ca917912d: Pull complete 
28cd545f2968: Pull complete 
Digest: sha256:9b785c740dd17e58436c00ac14d0f683d39f0e25c0ea63e71d44107f06eee5be
Status: Downloaded newer image for wordpress:latest
```


## 4. コンテナ起動
実際にイメージファイルを起動してみます。

```console
$ docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=test-pw -d mysql

$ docker run --name test-wordpress --link test-mysql:mysql -d -p 8080:80 wordpress
```

一行目はmysqlのイメージファイルに「test-mysql」と明示的なコンテナ名をつけて、パスワードに「test-pw」を設定しています。
二行目では、wordpressのイメージファイルに「test-wordpress」と名付けて、mysqlに「test-mysql」をリンクさせ、ポートをローカルの8080:80に指定。

ここまで実行すると、`docker ps` コマンドで、test-mysqlとtest-wordpressが起動中であることを確認できます。

そしてブラウザにアクセスすると・・・[http://localhost:8080/](http://localhost:8080/)

<img width="563" alt="スクリーンショット 2018-03-19 1.15.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/9c7c7314-63b4-10d4-7c96-f4f1efb83bb0.png">


初期設定の画面が出力されるので、必要事項を選択・入力します。

<img width="1046" alt="スクリーンショット 2018-03-19 1.17.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/9607fc8f-12c9-f7a7-8452-24b785c9f326.png">


すると、あっという間にこの通り、WordPressをローカルで触れる環境のできあがり！

<img width="1420" alt="スクリーンショット 2018-03-19 1.19.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/173732/cc769c56-02c7-6213-69d5-de33c59d7f6b.png">



## 5. コンテナにアクセス

起動中のコンテナにアクセスするには`exec`コマンドを使います。
これでWordPressがインストールされているディレクトリにアクセスします。

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

オプションコマンドについては以下記事を参考に。

- [Dockerコンテナ内で操作 attachとexecの違い](https://qiita.com/RyoMa_0923/items/9b5d2c4a97205692a560)

上記方法でコンテナにアクセスすれば、対話的にLinuxコマンドが使えるので
WordPress内のテーマファイルの書き換えや権限変更なども可能です。

```console
[root@040e6ea385dc:/var/www/html# ls -la

total 204
drwxr-xr-x  5 www-data www-data  4096 Mar 18 16:06 .
drwxr-xr-x  1 root     root      4096 Mar 14 13:58 ..
-rw-r--r--  1 www-data www-data    35 Mar 18 16:18 .htaccess
-rw-r--r--  1 www-data www-data   418 Sep 25  2013 index.php
-rw-r--r--  1 www-data www-data 19935 Jan  6 19:32 license.txt
-rw-r--r--  1 www-data www-data  7413 Dec 12  2016 readme.html
-rw-r--r--  1 www-data www-data  5434 Sep 23 12:21 wp-activate.php
drwxr-xr-x  9 www-data www-data  4096 Feb  6 15:49 wp-admin
-rw-r--r--  1 www-data www-data   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 www-data www-data  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--  1 www-data www-data  2764 Mar 18 16:06 wp-config-sample.php
-rw-r--r--  1 www-data www-data  3145 Mar 18 16:06 wp-config.php
drwxr-xr-x  6 www-data www-data  4096 Mar 18 16:15 wp-content
-rw-r--r--  1 www-data www-data  3669 Aug 20  2017 wp-cron.php
drwxr-xr-x 18 www-data www-data 12288 Feb  6 15:49 wp-includes
-rw-r--r--  1 www-data www-data  2422 Nov 21  2016 wp-links-opml.php
-rw-r--r--  1 www-data www-data  3306 Aug 22  2017 wp-load.php
-rw-r--r--  1 www-data www-data 36583 Oct 13 02:10 wp-login.php
-rw-r--r--  1 www-data www-data  8048 Jan 11  2017 wp-mail.php
-rw-r--r--  1 www-data www-data 16246 Oct  4 00:20 wp-settings.php
-rw-r--r--  1 www-data www-data 30071 Oct 18 17:36 wp-signup.php
-rw-r--r--  1 www-data www-data  4620 Oct 23 22:12 wp-trackback.php
-rw-r--r--  1 www-data www-data  3065 Aug 31  2016 xmlrpc.php
```

# コンテナの起動と停止

最後に、コンテナの起動・停止コマンドを念のため。

```console
-- 起動
$ docker start ＜コンテナ名 or コンテナID＞

-- 停止
$ docker stop ＜コンテナ名 or コンテナID＞
```

`start`と`stop`だなんて。めっちゃ簡単です。

今回の場合は「test-wordpress」と「test-mysql」を両方停止しておきます。
停止しただけなら、削除ではないのでまたstartした時に前回の続きから使えるわけですね。

ちなみに、`run`と`start`って何が違うんだ？と疑問に思ったので調べたら記事ありました。

- [docker-compose "up" " run" "start" コマンド 違い](https://qiita.com/mom0tomo/items/f536e6759d3f42d58ffc)
- [Dockerにおけるコンテナのライフサイクル](http://enakai00.hatenablog.com/entry/20140628/1403933390)



# おわりに
超サクっとローカル環境を用意することができました。
本番サーバーへの公開もラクチンになりそうな予感。（まだちゃんと調べてない）

### ＊ お願い
間違えている情報やリンク切れがありましたらどうぞご指摘ください。

### ＊ 参考サイト
- [Docker入門（第一回）～Dockerとは何か、何が良いのか～](https://knowledge.sakura.ad.jp/13265/)
- [さわって理解するDocker入門](https://www.ogis-ri.co.jp/otc/hiroba/technical/docker/part1.html)