EC2にDockerをインストールし、WordPressを構築 (DBはRDS)

#はじめに
表題の通りです。DBをRDSにした場合のやり方になります。

#前提条件
・DBは、RDSのMySQLを使用します。

#EC2にDockerをインストール

こちらの記事↓と全く同じコマンドで、dockerでWordPressが構築できます。
[AWS EC2 docker + wordpress インストール](https://qiita.com/HyunwookPark/items/92d10899cd19f2f06f91)
ただし、`docker-compose.yml`ファイルは以下のコードをコピペしてください。
`Dockerfile`も同じディレクトリ内に入れておいてください。

```Dockerfile
FROM wordpress:5.8.0-php7.4-apache

RUN set -ex; \
    apt-get update && apt-get install -y \
        wget \
        unzip \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# テーマのダウンロード
WORKDIR /tmp/wp-themes
RUN wget https://wp-cocoon.com/download/791/cocoon-master-2.1.9.1.zip

# テーマを配置
RUN unzip './*.zip' -d /usr/src/wordpress/wp-content/themes

# 不要ファイル削除
RUN apt-get clean
RUN rm -rf /tmp/*

WORKDIR /usr/src/wp-plugins

RUN set -ex; \
    wget -q -O amazon-s3-and-cloudfront.zip https://downloads.wordpress.org/plugin/amazon-s3-and-cloudfront.1.4.3.zip \
    && unzip -q -o '*.zip' -d /usr/src/wordpress/wp-content/plugins \
    && chown -R www-data:www-data /usr/src/wordpress/wp-content/plugins \
    && rm -f '*.zip'

# 所有者の変更
RUN chown -R www-data:www-data /usr/src/wordpress/wp-content/themes

WORKDIR /var/www/html
```

```docker-compose.yml
version: '3'
services:
  wordpress:
    build: . # カレントディレクトリのDockerfileでイメージをビルド
    image: wordpress
    ports:
      - '80:80' # ローカルのport80でコンテナのport80にアクセスできるようにする
    environment:
      WORDPRESS_DB_HOST: xxxxxxx.ap-northeast-1.rds.amazonaws.com # rdsのエンドポイント
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_pass
    volumes:
      - .:/var/www/html
    restart: always
```
以下の3点は、EC2にSSH接続後、RDSに接続し、RDS内に作成していきます。
・WORDPRESS_DB_NAME: `wordpress`
・WORDPRESS_DB_USER: `wp_user`
・WORDPRESS_DB_PASSWORD: `wp_pass`

#RDSに接続し、DB名等を作成
EC2を作成し、ssh接続後、RDSにwordpressのDBを作成しますので、下記のコマンドを入力します。
DB名とユーザー名とパスワードを作成します。

```
$ sudo yum update
$ sudo yum install -y mysql
$ mysql -h [RDSエンドポイント] -u RDS作成時のユーザー名 -p
Enter password: RDS作成時のパスワード

> create database wordpress;

Query OK, 1 row affected (0.01 sec)

> create user wp_user@'%' identified by 'wp_pass';


> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'wp_user'@'%' WITH GRANT OPTION;

Query OK, 0 rows affected (0.01 sec)

> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+

>exit

#wp_userでログインできることを確認します。

$ mysql -h [RDSエンドポイント] -u wp_user -p
```

`EC2のパプリックIP`にアクセスすると、WordPressの画面が表示されました！


<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/2bc38114-01b8-038d-2a09-44380bdd4f5a.png">





#Dockerの自動起動設定
EC2が再起動した際、Dockerが自動で起動するよう設定します。

```
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
```
`service; disabled`と表示され、自動起動設定されていませんので、設定しましょう。

```
$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
```
`enabled`と表示されていますので、自動起動設定されていることがわかります。

ちなみに自動起動設定をOFFもできます。

```
$ sudo systemctl disable docker
Removed symlink /etc/systemd/system/multi-user.target.wants/docker.service.
```

#Docker起動中に、EC2を停止させた場合
Docker起動中に、EC2を停止させ、再度起動させた状態で、docker-composeコマンドを使用すると以下のエラー文がでます。

```
$ docker-compose up -d
Traceback (most recent call last):
  File "urllib3/connectionpool.py", line 677, in urlopen
  File "urllib3/connectionpool.py", line 392, in _make_request
  File "http/client.py", line 1277, in request
  File "http/client.py", line 1323, in _send_request
  File "http/client.py", line 1272, in endheaders
  File "http/client.py", line 1032, in _send_output
  File "http/client.py", line 972, in send
  File "docker/transport/unixconn.py", line 43, in connect
FileNotFoundError: [Errno 2] No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "requests/adapters.py", line 449, in send
  File "urllib3/connectionpool.py", line 727, in urlopen
  File "urllib3/util/retry.py", line 410, in increment
  File "urllib3/packages/six.py", line 734, in reraise
  File "urllib3/connectionpool.py", line 677, in urlopen
  File "urllib3/connectionpool.py", line 392, in _make_request
  File "http/client.py", line 1277, in request
  File "http/client.py", line 1323, in _send_request
  File "http/client.py", line 1272, in endheaders
  File "http/client.py", line 1032, in _send_output
  File "http/client.py", line 972, in send
  File "docker/transport/unixconn.py", line 43, in connect
urllib3.exceptions.ProtocolError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker/api/client.py", line 214, in _retrieve_server_version
  File "docker/api/daemon.py", line 181, in version
  File "docker/utils/decorators.py", line 46, in inner
  File "docker/api/client.py", line 237, in _get
  File "requests/sessions.py", line 543, in get
  File "requests/sessions.py", line 530, in request
  File "requests/sessions.py", line 643, in send
  File "requests/adapters.py", line 498, in send
requests.exceptions.ConnectionError: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "docker-compose", line 3, in <module>
  File "compose/cli/main.py", line 80, in main
  File "compose/cli/main.py", line 189, in perform_command
  File "compose/cli/command.py", line 70, in project_from_options
  File "compose/cli/command.py", line 153, in get_project
  File "compose/cli/docker_client.py", line 43, in get_client
  File "compose/cli/docker_client.py", line 170, in docker_client
  File "docker/api/client.py", line 197, in __init__
  File "docker/api/client.py", line 222, in _retrieve_server_version
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
[3185] Failed to execute script docker-compose
```
焦らず、`docker ps -a`コマンドをしてみましょう

```
$ docker ps -a
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
dockerが起動されていないことが原因です。

```
$ systemctl start docker
Failed to start docker.service: The name org.freedesktop.PolicyKit1 was not provided by any .service files
See system logs and 'systemctl status docker.service' for details.
```
だめですね。原因は、実行権限がないことです。`sudo`を足しましょう。

```
$ sudo systemctl start docker
[ec2-user@ip-10-0-1-94 wordpress]$ docker ps -a
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                               NAMES
xxxxxx   kyt-prod   "docker-entrypoi"   43 minutes ago   Up 31 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   wordpress_wordpress_1
```

コンテナが起動しました！！
WordPressが使用できます！！

#参考
[AWS EC2 docker + wordpress インストール](https://qiita.com/HyunwookPark/items/92d10899cd19f2f06f91)