Docker環境でのWordPress構築(Bedrock利用)

# はじめに

[bedrock](https://roots.io/bedrock/) を利用して、dockerコンテナにてWordPress環境を構築するノウハウです。

https://roots.io/bedrock/

# 環境
以下で動作確認を行っております。

- M2 Macbook Air
- MacOS Sonoma(14.1.1)
- Docker Desktop 4.17.0

# 構築されるwordpress環境

2023/11/20時点、以下のバージョンでインストールされます。

- Wordpress6.4.1
- PHP8.2
- Nginx1.25
- MySQL8.0.34

# 構築手順

以下リポジトリを、git clone します。

https://github.com/koda-h/docker-wordpress

```
$ git clone github.com:koda-h/docker-wordpress
```

.envファイルを作成します。
```
$ make create-env
```

コンテナイメージをbuildします。
[build時ログサンプル](https://gist.github.com/koda-h/340945485f68979f344d83c67d2db8ba)

```
make build
```

コンテナを起動します。
[docker-composer up時ログサンプル](https://gist.github.com/koda-h/e113a404b3eafdae9c4c88e09067bcd9)

```
make up
```

http://localhost:8831 を開いて、言語選択画面が表示されればインストール成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867400/d6038385-c0e6-f661-1a7d-ada4e0759f5f.png)

インストール後はWordPressのプラグイン設定から該当のプラグインの「有効化」が必要です。


# 解説

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867400/3246bb6c-8ade-876e-fd36-e0e5fef40557.png)

docker周りの設定は etc/docker 配下にあります。

今回構築したサンプルは、「sample」というサイト名として構築しています。
これは.envに環境変数　SITE=sampleとして設定しています。
このサイト名と、各設定ファイルが連動しています。

サイト名を任意の名称にする場合、この環境変数と各設定ファイル名をサイト名と同じにする必要があります。(下記参照)

例: サイト名を hoge にする場合

```
vi .env
SITE=hoge
```

以下のディレクトリ・ファイルを作成

```
etc/site/hoge ※ 配下の composer.json, composer.lock もコピー等で作成する
etc/docker/app/file/hoge
etc/docker/app/plugin/hoge
etc/docker/app/theme/hoge
```

サイトを増やしたい場合は、上記のようにディレクトリ・ファイルを追加してください。
この1リポジトリで複数のWordPress管理ができます。(後述)

## wordpressインストール
appコンテナ起動時、 [docker-entrypoint.sh](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/docker-entrypoint.sh) にて以下を行います。

- DB起動を待機します。
    - DBが起動していることをdockerizeを利用してDB接続チェックします。
- [composer.json, composer.lock のシンボリックリンクを作成](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/docker-entrypoint.sh#L13-L14)
- [WordPress を composer にてインストール](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/docker-entrypoint.sh#L16-L16)
- [bedrockのプロジェクト作成](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/bin/setup_bedrock.sh#L15-L15)
- [プラグインのインストール](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/bin/plugin_install.sh#L18-L18)
    - [etc/docker/app/plugin 配下のファイルの内容](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/plugin/sample#L1-L5)を元にプラグインをインストールします。
- [テーマのインストール](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/bin/theme_install.sh#L20-L20)
    - [サイトのテーマのファイル](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/theme/sample)を元に、[テーマディレクトリ](https://github.com/koda-h/docker-wordpress/tree/main/data/themes)配下のテーマを配置します。
- ファイルのインストール
    - [etc/docker/app/file 配下のファイルの内容](https://github.com/koda-h/docker-wordpress/blob/main/etc/docker/app/file/sample#L1-L1)を元に[WordPressのアップロードディレクトリ](https://github.com/koda-h/docker-wordpress/tree/main/web/app/uploads)に配置します。
- コンテナ起動時に上記を毎回行うと起動時に間がかかるため tmp/installed_wordpress というファイルを作成し、このファイルが有る場合は次回起動時に上記インストールをスキップします。
    - ※ 再度インストールを実施したい場合は、 tmp/installed_wordpress を削除するか、 make force-up を実行してください。


## dbについて
etc/docker/db/data にMySQLのファイルを格納しています。DBを再度構築する場合は、この配下のファイルを削除してください。

```
$ ls -1 etc/docker/db/data
#ib_16384_0.dblwr
#ib_16384_1.dblwr
#innodb_redo
#innodb_temp
auto.cnf
binlog.000001
binlog.000002
binlog.index
.
.
.
```

## WordPressのバージョンアップについて
composerで管理しているため、composer update でバージョンアップ可能です。

```
## コンテナにログイン
$ docker-compose exec app bash

## composer update実施
root@7a04f6d09ea9:/var/www/html# composer update
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 18 updates, 0 removals
.
.
.
  - Upgrading roots/wordpress (6.3.2 => 6.4.1)
  - Upgrading roots/wordpress-no-content (6.3.2 => 6.4.1)
.
.
.
```

実行後、更新された composer.lock をcommit, push してリポジトリに反映してください。

## 複数サイトの管理について
以下のディレクトリ・ファイルを追加することによって、複数サイトの管理が可能です。
※別ディレクトリでgit clone して管理する必要があります。

例: hoge2 のサイトを追加する場合

```
etc/site/hoge2 ※ 配下の composer.json, composer.lock もコピー等で作成する
etc/docker/app/file/hoge2
etc/docker/app/plugin/hoge2
etc/docker/app/theme/hoge2
```

追加したサイトを起動する場合は、 上記の例では、環境変数 SITE=hoge2 としてください。

また、複数サイト同時にローカル上で起動する場合は.envの以下の環境変数のポート番号も変更する必要があります。


```
WEB_PORT=8832

WP_HOME='http://localhost:8832'
WP_SITEURL='http://localhost:8832'

DB_PORT=33312
```

WEB_PORT は [nginx の config設定](https://github.com/koda-h/docker-wordpress/blob/8f11660ed5f525c0bcd1e170a861528e4390e449/etc/docker/web/conf.d/local.conf#L33-L37)にも関連しています。　[Dockerfileでbuild時にconfig内容の変更を行っています。](https://github.com/koda-h/docker-wordpress/blob/8f11660ed5f525c0bcd1e170a861528e4390e449/etc/docker/web/Dockerfile#L32-L35)