やっとDocker for Macで開発用データベースの運用をはじめた

「Docker通り越して次の楽技術こないかなー」と思っていたのですが、やはり当分こなそうなので重い腰を上げてDockerを使いはじめました。

遅すぎですね。

前提

自分は「主にPHPer」ですが、PHPなプロジェクトは大抵がごく普通のLAMPやLAPPなので(環境依存が少ない)、開発時はVagrantでもDockerでもなんでも良いです。

ただ、個人的にPHPはビルトインサーバブームがきているので、「アプリケーション側はホスト上のビルトインサーバ」「データベース側をDocker」にする形で構築することにしました。

「Dockerは永続的データが不得意?」というのは遥か昔の話だったようで、MySQLPostgreSQLもデータ領域は(公式Dockerイメージでは)デフォルトでホスト側にマウント( VOLUME )するようになっていました。これは便利だった。

使い方

Docker for Mac上で、MySQLの公式Dockerイメージを docker pull して docker run するだけ。

$ docker pull mysql:5.6
$ docker run --name mysql56 -e MYSQL_ROOT_PASSWORD=XxxxxXxXx -d -p 13306:3306 mysql:5.6

PostgreSQLも同じような感じで。

$ docker pull postgres:9.6
$ docker run --name postgres96 -e POSTGRES_PASSWORD=XxxxxXxXx -e POSTGRES_INITDB_ARGS="--no-locale --encoding=UTF8" -d -p 15432:5432 postgres:9.6

Data Volumeの再マウント

間違って docker rm をしたときに大変なことにならないようにホスト側に残ったData Volumeの再マウントのテストもしておきます。

まずは、コンテナのマウントの状況を確認

$ docker inspect mysql56 | jq '.[0].Mounts'
[
  {
    "Type": "volume",
    "Name": "f9e1649566faf22d123456789094c12e4af3e04494807f060a2ff561d0f2e",
    "Source": "/var/lib/docker/volumes/"f9e1649566faf22d123456789094c12e4af3e04494807f060a2ff561d0f2e/_data",
    "Destination": "/var/lib/mysql",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]

docker volume ls でも同じData Volumeがあることも確認

$ docker volume ls
DRIVER              VOLUME NAME
local               e7248a4a516b4071c286afbfd78deabcdefghijklmn012342881a3c017b1f
local               f9e1649566faf22d123456789094c12e4af3e04494807f060a2ff561d0f2e

MySQLに接続してCREATE DATABASE などしたあとにおもむろに docker rm

$ docker rm mysql56

それでもData Volumeは残っているのを確認

$ docker volume ls
DRIVER              VOLUME NAME
local               e7248a4a516b4071c286afbfd78deabcdefghijklmn012342881a3c017b1f
local               f9e1649566faf22d123456789094c12e4af3e04494807f060a2ff561d0f2e

Data Volumeを指定して docker run

$ docker run --name mysql56-re -v f9e1649566faf22d123456789094c12e4af3e04494807f060a2ff561d0f2e:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=XxxxxXxXx -d -p 33306:3306 mysql:5.6

MySQLに接続して、作成したデータベースが残っていることを確認。

感想

簡単でした。

この程度のライトな使い方だとVagrantでデータベースサーバたてるのとあまり変わらないですが、すぐ手が届くところでDockerを使い続けることで、そのうち興味や理解も深まるはず。

慣れって重要だと思います。