データの永続化 docker volume 周り

Wordpress においては MySQL が扱かうデータがサービス、見た目に大きく影響を与える

当然のことだが、Wordpress は MySQL をデータベース管理システムとして使用している。これによって管理されるデータには、記事の情報やそれに伴う画像等のコンテンツ、さらにはプラグインの設定や、サイトのパスワードといった情報も含まれる。

そのため、MySQL, Wordpress(NGINX + PHP + Wordpress ) という二つのコンテナを作り、それぞれを例えば docker-compose で連携させる場合、「MySQL 側のデータが重要」になってくる。特に、プラグインの情報が含まれるということが大きい。プラグインによって Wordpress のサービスは大きく変わってくる。見た目すらも大きく変わる。

普通に立てた MySQL 用 Docker コンテナ内のデータベースは、container を停止すると、消える

しかし Docker Container を停止すると、データベースのデータは消える。これでは Wordpress の開発に問題がある。なぜなら、DB の内容も、Wordpress の開発に影響してくるからだ。

一つの方法としての volume を使った永続化

まず volume を作る。これはホスト上に実際に作られる。(Docker for Mac の場合、仮想システムにできるようなので、直接 cd 等でアクセスできるわけではない模様。)

docker volume create --name testdatavol
docker volume create --name volume名

できたかどうか調べる。

docker volume ls | grep testdatavol # grep でフィルタリングしてみた

VOLUME NAME に対象の名前をもった Volume ができていれば OK。次にその volume の詳細を調べてみる。

docker volume inspect testdatavol
docker volume inspect vol名
[
{
"CreatedAt": "2018-06-06T10:43:05Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/testvolume/_data", # ただし仮想環境の path
"Name": "testvolume", # マウントさせるとき等に指定する名前
"Options": {},
"Scope": "local"
}
]

できている。

Volume をマウントして run してみる

docker run -it -v testvolume:/test_volume ubuntu:latest /bin/bash
docker run -it -v volume名:コンテナ内のどこに配置するか イメージ名 /bin/bash

これで ubuntu にログインした後に ls すると、/test_volume ができていることがわかる。

さらにここにファイルを作ってみる。

cd test_volume && touch test

exit # container から抜ける

でもう一回 volume を乗っけて実行すると

docker run -it -v testvolume:/test_volume ubuntu:latest /bin/bash

/test_volume/test がある。

けど volume をマウントしないと

docker run -it ubuntu:latest /bin/bash

/test_volume/test がない。

変更がしっかり永続化できている。

Docker Compose の場合の一例

version: '3.3'
services:
db:
image: mysql:5.7
volumes: # 上の階層で指定した db_data を使いますよ
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
volumes:
- ./public_html/:/var/www/html/
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data: # まずこの名前で volume を作る

compose の場合は少し特殊。だが、volume で永続化しているのは同じ。