AWSのEC2にDocker ComposeでWordPress環境を構築する手順

#はじめに
タイトルの通り、Docker ComposeでWordPress環境を構築する手順です。
WordPressの環境構築ってレンタルサーバ借りる系の記事が多いですけど、クラウドサーバに自分で構築しちゃうのも全然アリだと思います。
EC2もGCEも無料枠あるのでお得だし。
ネックは手順の複雑さだったけどそれもDocker使えばこんなに簡単に出来ちゃうし。

## EC2 インスタンスの作成

AMIは「Ubuntu Server 18.04 LTS」を選択。
インスタンスは無料枠ありなら t2.micro、ないなら t3.micro がおすすめです。
注意点としてはEC2 の nano のメモリ 0.5GB だとメモリ不足になります、、
なので最低でも 1GB は必要なので micro にすること。
あとセキュリティグループの編集＞ルールの追加httpとhttpsを追加しよう（ポートの開放）。

DBを操作したい場合はMySQLも。
ソースは「マイIP」などを選択してください。
※絶対に「0.0.0.0/0」にはしないでください！
誰でもアクセス可能になります！
僕は「0.0.0.0/0」にしていたら数日後にハッキングされて全データ消されました！w

## インスタンスにssh ログイン

111.222.333.444は自分のIPアドレスに書き換えましょう
IPアドレスはインスタンスのページの中の「IPv4 パブリック IP」の部分です
ec2_wordpress.pemも自分のpemファイルの名前に書き換えましょう

```bash
chmod 600 ~/.ssh/ec2_wordpress.pem
ssh ubuntu@111.222.333.444 -i ~/.ssh/ec2_wordpress.pem
```

最初だけ`Are you sure you want to continue connecting (yes/no)?`と聞かれるので`yes`と入力してEnter

## 初期設定用シェルスクリプト
参考：公式のクイックスタート（https://docs.docker.com/compose/wordpress/

以下の内容を `vi init_setting.sh` で作成して
`sh ./init_setting.sh 2>&1 | tee init_setting.log` で実行する
※別にシェルにせずに１行１行打ち込んでも出来ます。手間なのでシェル化してるだけです。
公式のバージョン（https://github.com/docker/compose/releases
※2.xはインストール方法が異なるので注意

```init_setting.sh
#!/bin/bash

# Docker install
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
 $(lsb_release -cs) \
 stable"
sudo apt-get install -y docker-ce
sudo docker version

## Docker Compose install
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo docker-compose --version

## Docker sudo 不要にする
sudo groupadd docker
sudo gpasswd -a $USER docker
sudo systemctl restart docker
```

２分くらいで終わります
有効化するために１度ログアウトして再ログインしてください（`exit`）
再ログイン後はdockerコマンドにsudoが不要になります。
→そのはずでしたが、今改めて確認するとそんなことないっぽいです。
　以下、全て`sudo su -`でrootユーザになった状態で実行してください。(2022/3/9追記）

## スワップ領域を増やす

そのままでも一応起動はできるのですが、t2.microインスタンスだとMySQLの容量がギリギリなのでたまにメモリ不足で落ちてしまうことがありました。
スワップ領域を増やすことで対応します。

```bash
free
dd if=/dev/zero of=/swapfile1 bs=1M count=512
chmod 600 /swapfile1
mkswap /swapfile1
swapon /swapfile1
free
```

参考：[WordPressのサーバがメモリ不足で落ちたので、SWAP領域を追加して応急処置](https://qiita.com/miyazawa214/items/069a0244bb040c910c68)

## Wordpress 作成

```bash
mkdir my_wordpress
cd my_wordpress/
```

### uploads.ini作成

以下の内容を`vi uploads.ini`で保存する
デフォルトだとテーマの新規登録のzipアップロードで2MB以上はエラーになるのでそれを回避するためです。

```ini
file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
```

参考：https://github.com/docker-library/wordpress/issues/10

### docker-compose.yml作成

以下の内容を`vi docker-compose.yml`で保存する
これは公式のクイックスタート(https://docs.docker.com/compose/wordpress) から以下３点を変更したものです。
1. restart: alwaysの行を削除
2. ポートを8000から80に修正
3. volumes追加
このままでも実行できますがパスワードなどは変えておきましょう

```docker-compose.yml
version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    ports:
      - "3306:3306"

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
    ports:
      - "80:80"
      - '443:443'
    volumes:
      - ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
volumes:
    db_data: {}
```

公式だと以下のコマンドはないですが、これがないとエラーになるので実行しましょう
`sudo rm -rf ~/dev/dbs-data/mysql/*`
(参考：https://github.com/docker-library/mysql/issues/275)

最後にdocker-composeを実行します。

````bash
docker-compose up -d
docker ps -a
````

あとは1分くらい待った後ブラウザから`http://111.222.333.444`にアクセスすればWordPressのトップページが開けるはずです。
※111.222.333.444は適時自分のIPアドレスに変えてください

もし何かエラー出たらコメントか編集リクエストください〜

ちなみにこの後固定IPアドレス取得とドメイン紐付けは以下の記事が分かりやすかったです。
ご参考まで
[Elastic IP アドレスの設定とRoute 53から独自ドメインの割り当て方法](https://knowledge.amimoto-ami.com/knowledge/self-custom-domain)

ではでは。

### 2020/11/20 追記

１年くらいしたらディスク容量がいっぱいになってしまいました
以下の記事の通りに対応したら解決しました

```bash
# 容量確認
sudo du -h -d 1 /usr/src/
# 不要ファイル削除
sudo apt autoremove -f
```

参考：[Ubuntuの古いカーネルがディスクを圧迫するときの対処法](https://qiita.com/kulikala/items/a3ce4f7f21a5c7a55d71)