データの永続化 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 で永続化しているのは同じ。

Last updated