Update 2014-07-13
: Dockerでデータ分析環境 - Part4: Tomcat7とPostgreSQL Studio
データベースもインフラから分離して自由にアタッチできるDBaaS環境を探しています。
さらにデータ自体もデータベースコンテナから分離できたり、Dockerの世界は奥が深いです。
Data-Only-Containerの使い方は、How to port data-only volumes from one host to another?や、オフィシャルのManaging Data in Containersを読みながら勉強していこうと思います。
tsuruのMySQLはまだうまく使えず、今回の要件はデータ分析の学習環境なので簡単なところから始めます。
DBを起動するコンテナとDockerホストへのボリュームのマップを行います。
paintedfox/postgresql
Dockerファイルはpaintedfox/postgresqlを使います。GitHubはPainted-Fox/docker-postgresqlです。
Dockerfile
Dockerfileのbaseimageは、いつもお世話になっているphusion/baseimageなのでわかりやすいです。
ロケールがen_US.UTF-8
だったり、SSH接続を無効にしているので、確認ができたら修正して使おうと思います。
runit
ruintを使っている人はあまりいないようで、PostgreSQLのrunitの書き方を探していて、
このDockerfileをみつけたのがきっかけです。データベースの場合、起動スクリプトの書き方が複雑になります。
使い方
READMEに使い方が書いてあるので参考にしながらオプションを確認します。
Dockerホスト上にコンテナにマップするディレクトリを作ります。
$ sudo mkdir -p /opt/docker_vols/postgresql |
Dockerコンテナを起動します。中身を確認したいので、仮想端末に接続してbashを起動します。
$ docker run --rm -i -t --name="postgresql" \ |
psqlコマンドでデータベースへの接続を確認します。
# psql -U masato -d spike_db -h localhost |
postgresql.confをみると、data_directory
は/data
を指定しています。
コンテナの起動時の-v
オプションで、Dockerホストのディレクトリへマップしています。
data_directory = '/data' |
Dockerホストのマップされたディレクトリ
Dockerコンテナからマップしたディレクトリです。
PostgreSQLのコンテナを破棄するとpostmaster.pid
も消去されます。
$ sudo ls -al /opt/docker_vols/postgresql/ |
課題
disposableなコンテナからDockerホストにdata_directory
をもってきたのはよいですが、
全く同じオプションで、新しいコンテナを起動しようとすると、runitの起動スクリプトはユーザーは再作成し、
データベースも作成しようとします。
ユースケースとして、新しいコンテナはdata_directory
のアタッチだけしたいとか考えると、
runitの起動スクリプトは修正しないとちょっと怖いです。
まとめ
docker run
の実行時に引数としてデータベース名やユーザー名を渡せて、
コンテナの起動後はすぐにデータベースが使える状態になっているのはうれしいです。
あとはSouthやSequel、Rialsのマイグレートでスキーマを作成して初期データを投入するだけです。
簡単なUIを用意してdocker-pyなどと組み合わせれば、開発用のDBaaSとして十分な気がしてきました。
docker-dbaasというもあります。
次はこのPostgreSQLに接続するWebの管理ツール用のコンテナを準備しようと思います。