DockerでWordPressサーバのイメージを作る

##やること
CentOS7+php7+nginx+php-fpmからなるWordPressサーバのイメージを作る。  
作り方は色々あるが、centOSのイメージから構築していく。  

##開発環境
* Docker(1.13.1)
* CentOS7  

##1. 事前準備

とりあえず自分の環境がDocker Hubにあるので持ってくる

```
$ sudo docker pull shinch13/env-centos7
```

pullできてるか確認する

```
$ sudo docker images
  REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
  shinch13/env-centos7               latest              82582712e551        9 days ago          545 MB
```

特権モードで実行する。(これをしないと、systemctlコマンドが使えなかった)
また、ホスト側のポートの8080番をコンテナ側の80番にリダイレクトされるようにする。

```
$ sudo docker run --privileged -d -p 8080:80 shinch13/env-centos7 /sbin/init
825
$ sudo docker ps
  CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS              PORTS                  NAMES
  f7a17614fadd        shinch13/env-centos7   　　　　　　　"/sbin/init 280"    48 minutes ago      Up 48 minutes       0.0.0.0:8080->80/tcp   keen_snyder
```

execでコンテナ内へ

```
$ sudo docker exec -it f7a /bin/zsh
```

epelリポジトリの追加

```
$ yum -y install epel-release
$ vim /etc/yum.repos.d/epel.repo
  [epel]部分の「enabled=1」を「enabled=0」に変更する
```

remiリポジトリの追加

```
$ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
$ rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```

epelはエンタープライズ向けで信頼性が高く、remiは最新バージョンのパッケージが豊富らしい。。。

##2. nginx,WordPressの設定

epelリポジトリを使用して、nginxをインストールする

```
$ yum install --enablerepo=epel nginx
```

wordpressをインストールするディレクトリを作成

```
$ mkdir -p /usr/share/nginx/wordpress
```

nginxの権限でこのファイルにアクセスできるように所有者を設定  
chown (ユーザ):(グループ)

```
$ chown nginx:nginx /usr/share/nginx/wordpress
```

WordPressをダウンロードする

```
$ cd /usr/share/nginx/wordpress
$ wget https://ja.wordpress.org/latest-ja.tar.gz
$ tar xzfv latest-ja.tar.gz
```

解凍したファイルの所有者を同様に変更

```
$ chown -R nginx:nginx wordpress
```

バーチャルホストとしてwordpressを動作させるために、nginxの設定ファイルを編集

```
$ cd /etc/nginx/conf.d
$ vim wordpress.conf
```

```wordpress.conf
server {
  listen 80;
  root /usr/share/nginx/wordpress;
  index index.php;
 
  charset utf-8;
 
  # wordpress パーマリンク設定
  try_files $uri $uri/ /index.php?q=$uri&$args;
 
  # wp-config.phpへのアクセス拒否設定
  location ~* /wp-config.php {
    deny all;
  }
 
  # php-fpm用設定
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_script_name;
    include fastcgi_params;
  }
}
```

設定ファイルが正しい構文かをチェックする

```
$ nginx -t
```

nginxを起動する

```
$ systemctl start nginx
``` 

nginxをデーモン化(常駐起動)する

```
$ systemctl enable nginx
```


##3. php7,php-fpmの設定

php7はCentOSの公式リポジトリにないので、remiリポジトリを使用してインストール  
ついでに、php-fpmなどもインストール

```
$ yum install --enablerepo=epel,remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-mysql
```

php7の確認

```
$ php -v
  PHP 7.0.2 ----
```

php-fpmの実行ユーザは初期設定ではapacheになっているので、nginxに設定する

```
$ cd /etc/php-fpm.d/
$ cp -p www.conf www.conf_yyyymmdd    ← バックアップ
$ vim www.conf
```

```www.conf
---省略---
user = nginx
group = nginx
```

php-fpmを起動する

```
$ systemctl start php-fpm
``` 

php-fpmをデーモン化(常駐起動)する

```
$ systemctl enable php-fpm
```

##4.MariaDBの設定 

MariaDBインストール

```
$ yum install mariadb mariadb-server
```

MariaDBを起動する

```
$ systemctl start mariadb
```

mariaDBをデーモン化(常駐起動)する

```
$ systemctl enable mariadb
```

WordPressで使用するためのデータベース設定


```
$ mysql -uroot

# rootユーザのパスワード(password)を設定する
> set password for root@localhost=password('password');
Query OK, 0 rows affected (0.00 sec) 

# wordpress用のDB(wordpress)を作成する
> create database wordpress character set utf8;
Query OK, 1 row affected (0.00 sec)

# 作成したDBに接続するユーザ(ユーザ名：wpuser,パスワード：wppassword)を作成する
> grant all privileges on wordpress.* to wpuser@localhost identified by 'wppassword';
Query OK, 0 rows affected (0.00 sec)

#　設定を反映させる
> flush privileges;
Query OK, 0 rows affected (0.00 sec)

# 終了
> quit
Bye
```

WordPressとMariaDBの接続設定  
データベースの情報とをwp-configに記述する  
また、[https://api.wordpress.org/secret-key/1.1/salt/](https://api.wordpress.org/secret-key/1.1/salt/)から秘密鍵を自動生成できるので、それを記述して認証用のユニークキーを設定する

```
$ cd /usr/share/nginx/wordpress/
$ cp wp-config-sample.php wp-config.php  
$ vim wp-config.php  #設定を変更する
```
```
---省略---
/** WordPress のためのデータベース名 */
define('DB_NAME', 'wordpress');
 
/** MySQL データベースのユーザー名 */
define('DB_USER', 'wpuser');
 
/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'wppassword');
 
/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

---省略---
define('AUTH_KEY',         'L xv>t<S$6|a+OHwxq5`C8S.!2;z|P^T:&u^blaa|*uY5 a}x:Y>pWJVN!M$_wZ@');
define('SECURE_AUTH_KEY',  '4B!l[$Aiz zEGu(|=h6dYIDJR;eNeUgCaGoIy4i(.N@YO6A=P;^EIh|T!sCS9x1X');
define('LOGGED_IN_KEY',    ' z/1j8<l wE1eBZ(@+0`yr(BK0&&zPp8$3pyJn.-{W^qoj)Z+GG-0 r%^C65m8iY');
define('NONCE_KEY',        '*4-:5wjE9VL4JK=3GG/Dw:/VEl-vdnmHn[kJe{@X3AujV}rqXYjoIrVs-},|;_z|');
define('AUTH_SALT',        'Gh_YZrAIa<, +2P7jTVEisx4(@2#5pIw~X5+FiO^/q8=<4^%*wLkYBT#%l0b/y{g');
define('SECURE_AUTH_SALT', 'm$V1,lNWo<z] lAAm1mj6k*^P`;q^WVc76<I{E`WXlGgD8>Edo%d#qK9%8DxTzp[');
define('LOGGED_IN_SALT',   '-JS@,8_u0Qt}}+PZ1-v4]% [7(9|(2Mpw*{6)>BlQ+]|GOf8PwRxTJ)/P~R3u?Ve');
define('NONCE_SALT',       '+%*z+YyLHVQd!)Hg?^QL90|B?5c|Yx_dD~OwxZH!cg0OF[-NA4~rm) XPn+!{y^Y');

```

##5.動作確認

192.168.33.17:8080/wp-admin  
にアクセスする

<img width="942" alt="スクリーンショット 2017-03-02 1.34.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/161771/f03600d5-edbf-f102-c2eb-5ee6af83f73b.png">



これが表示されればOK！！  
必要情報を設定すると、wordpressのログイン画面が表示されます。

##6.コンテナをcommit,イメージをpushする

コンテナから抜ける

```
$ exit
```

プロセスを切る

```
$ sudo docker ps
  CONTAINER ID        IMAGE                              COMMAND             CREATED             STATUS              PORTS                  NAMES
  f7a17614fadd        shinch13/nginx-wordpress-centos7   "/sbin/init 280"    About an hour ago   Up About an hour    0.0.0.0:8080->80/tcp   keen_snyder

$ sudo docker kill f7a
``` 

コンテナをcommitする

```
$ sudo docker ps -a -n 1
  CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS                       PORTS               NAMES
  f7a17614fadd        shinch13/nginx-wordpress-centos7   "/sbin/init 280"         About an hour ago   Exited (137) 8 seconds ago                       keen_snyder
  
$ sudo docker commit f7a shinch13/nginx-wordpress-centos7
```

Docker hubにpushする

```
$ sudo docker images
  REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
  shinch13/nginx-wordpress-centos7   latest              2e5ced91e74d        7 seconds ago       955 MB

$ sudo docker push shinch13/nginx-wordpress-centos7
```

## 7.まとめ

これで必要な時に

```
$ sudo docker pull shinch13/nginx-wordpress-centos7
```

をすればwordpressサーバを立てられる!!

## 参考サイト
[http://www.server-memo.net/memo/wordpress/nginx-install.html](http://www.server-memo.net/memo/wordpress/nginx-install.html)
[http://blog.higty.xyz/archives/231/#起動設定](http://blog.higty.xyz/archives/231/#起動設定)