「Docker通り越して次の楽技術こないかなー」と思っていたのですが、やはり当分こなそうなので重い腰を上げてDockerを使いはじめました。
遅すぎですね。
前提
自分は「主にPHPer」ですが、PHPなプロジェクトは大抵がごく普通のLAMPやLAPPなので(環境依存が少ない)、開発時はVagrantでもDockerでもなんでも良いです。
ただ、個人的にPHPはビルドインサーバブームがきているので、「アプリケーション側はホスト上のビルドインサーバ」「データベース側をDocker」にする形で構築することにしました。
「Dockerは永続的データが不得意?」というのは遥か昔の話だったようで、MySQLもPostgreSQLもデータ領域は(公式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を使い続けることで、そのうち興味や理解も深まるはず。
慣れって重要だと思います。