Docker composeでWordpressマルチサイトの開発環境構築する備忘録

個人的な備忘録

# Wordpressマルチサイト
1つのWordPressで複数のサイトを運用可能にすることで、共通のテンプレートやプラグインが利用できる機能
対応していないプラグインもあるが、全体で共通で利用するだけでなく、サイトごとに個別で有効化することもできる
機能として以下の3種類がある

## サブディレクトリ型 マルチサイト
- kamihork.com/site1
- kamihork.com/site2

## サブドメイン型 マルチサイト
- site1.kamihork.com
- site2.kamihork.com

## 複数ドメイン型 マルチサイト 
- site1-kamihork.com
- site2-kmaihork.com

# Wordpressマルチサイトでの、サブドメイン形式での構築手順
**サブドメイン形式を選択する場合、予約済みドメイン（localhost）だとそれを実現できない**
なので、これを実現するのに、**lvh.meというループバックドメインを利用**する
※ 参考 : https://techracho.bpsinc.jp/ebi/2020_04_23/91311

## lvh.me
2020/5/14時点での、有効期限は1年間ぐらいある

```
$ whois lvh.me | grep Expiry
Registry Expiry Date: 2021-06-02T00:35:34Z
```

# 手順

## Dockerを確認

```
$ docker -v
Docker version 18.09.2, build 6247962

$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01
```

## docker-compose.ymlを作成

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

services:
  db:
    image: mysql:5.7
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - 3306:3306
    networks:
      - wpnet
    environment:
      - MYSQL_DATABASE=kamihork-db
      - MYSQL_USER=kamihork
      - MYSQL_PASSWORD=pass
      - MYSQL_ROOT_PASSWORD=root

  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    volumes:
      - ./html:/var/www/html
      - ./wp-install.sh:/tmp/wp-install.sh
    ports:
      - 80:80
    depends_on:
      - db
    networks:
      - wpnet

  cli:
    image: wordpress:cli-2.3.0-php7.1
    volumes_from:
      - app:rw
    networks:
      - wpnet

networks:
  wpnet:
```

## Dockerファイルを作成

```Dockerfile
FROM php:7.1-apache

RUN \
  { apt-get update; \
    apt-get install -y zlib1g-dev libzip-dev; \
    docker-php-ext-install zip; \
    docker-php-ext-install mysqli; \
    docker-php-ext-configure zip; \
    docker-php-ext-configure mysqli ; \
  }
```

## wordpress cliを利用してもろもろ初期設定をするshellを作成
プラグインのインストールは、[wp plugin install](https://developer.wordpress.org/cli/commands/plugin/install/) で可能
マルチサイトのインストールは、 [wp core multisite-install](https://developer.wordpress.org/cli/commands/core/multisite-install/) で可能

```wp-install.sh
#!/bin/bash

set -ex;
INSTALLDIR=/var/www/html

wp core download \
    --locale=ja --version=5.2.2 --path=${INSTALLDIR}

wp config create \
    --dbname=kamihork-db --dbuser=kamihork --dbpass=pass --dbhost=db:3306 \
    --force --path=${INSTALLDIR}

wp core multisite-install \
    --url=www.lvh.me --subdomains --title='kamihorkのマルチサイト' \
    --admin_user=kamihork --admin_password=pass --admin_email=hoge@fuga.com --allow-root

wp site create \
    --slug=sub --title='kamihorkのマルチサイト @サブ' --allow-root
```

## コンテナを起動
```
$ docker-compose up -d --build
```

## 用意したシェルを実行
```
# ログイン
$ docker-compose run --rm cli bash

# 権限変える
$ chmod +x /tmp/wp-install.sh

# 実行
$ /tmp/wp-install.sh
```

### コンテナを削除終了
```
$ docker-compose down --volumes
```

### プロセス確認
```
$ docker ps
```

### image確認
```
$ docker images
```

## サイトの確認
### 本体サイト

```
http://lvh.me/
http://lvh.me/wp-admin/index.php
```

### サブドメインサイト

```
http://sub.lvh.me/
http://sub.lvh.me/wp-admin/index.php
```

# 参考記事など
## Docker選定に関する記事
[Dockerとは](https://kitsune.blog/docker-summary#Docker%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88)
[迷える子羊に捧げるコンテナ環境徹底比較](https://dev.classmethod.jp/articles/cmdevio2019-container/#toc-4)
[Docker導入するべき？するべきではない？](https://qiita.com/taishin/items/e1e7153cecb3ffd44a54)

## マルチサイトについて
[WordPressマルチサイトとは？メリットデメリット丸わかり](https://www.sejuku.net/blog/83193)
[複数のWordPressでサブドメインを運用する5つのポイント](https://celtislab.net/archives/20160826/wp-multisite-plugin-tutorial/)
[WordPressマルチサイト対応プラグインの作り方](https://celtislab.net/archives/20160826/wp-multisite-plugin-tutorial/)
[ループバックドメインの有効期限](https://www.geolocation.co.jp/learn/ip/09.html)

## AWS+Wordpressに関する記事
### Dockerの利用
[Dockerを利用したWordPressの開発環境をwp-cliを使ってさくっと構築する](https://qiita.com/izanari/items/73fef6571e7772acb2d7)
[Docker Composeを使ってWordPressが動作するローカル環境を作る](https://codeaid.jp/blog/docker-wp/)
[lvh.meドメインを使って、サブドメイン形式のWordPressマルチサイトのDocker開発環境構築](https://techracho.bpsinc.jp/ebi/2020_04_23/91311)
[docker-compose コマンドまとめ](https://qiita.com/wasanx25/items/d47caf37b79e855af95f)
[docker-compose.ymlの書き方について解説してみた](https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04)
[Dockerfileとは](https://qiita.com/mk0812/items/c77fec14ec3c281a47b4)

### AWS EC2 の利用
[WordPress を Amazon EC2 インスタンスにデプロイする](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-wordpress.html)
[WordPress ウェブサイトを構築する](https://aws.amazon.com/jp/getting-started/projects/build-wordpress-website/)
[小中規模向け低コストで可用性/拡張性の高いWordPress アーキテクチャ](https://blog.nijot.com/aws/wordpress-midarch-lowcost-ha/)
[AWS の WordPress High Availability by Bitnami](https://aws.amazon.com/jp/quickstart/architecture/wordpress-high-availability-bitnami/)
[AWS再入門2018 WordPress on AWS編](https://dev.classmethod.jp/articles/2018-aws-re-entering-wordpress-on-aws/#toc-awswordpress3)
[[和訳]WordPress ベストプラクティス on AWS](https://kahoo.blog/japanese-translation-wordpress-bestpractice-on-aws/)

### AWS ECS の利用
[Amazon ECSの主な機能と使い方](https://business.ntt-east.co.jp/content/cloudsolution/column-25.html)
[WordPressをAWSのDockerで公開](https://blog.codecamp.jp/wordpress-aws-docker-mac)
[Docker環境をAWS ECSでデプロイするまで](https://techblog.istyle.co.jp/archives/1652)
[AWS ECSでDockerコンテナ管理入門](https://qiita.com/uzresk/items/6acc90e80b0a79b961ce#%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%81%AE%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9)
[CodePipelineからECSにBlue/Greenデプロイする](https://dev.classmethod.jp/articles/codepipeline-ecs-codedeploy/)