👇こちらがよりベターなやり方をまとめた記事です。
ishikawa-pro.hatenablog.com
初めまして
情報系の学生をやってまして趣味で色々作って遊んでいます。
作業手順をよく忘れたり、色々試した結果どうしたらうまくできたのかをよく忘れる性格なので、どんどん書き留めていきたいと思います。
飽きっぽいので続かないかも笑
今回は、最近使い始めたDocker の話です。
Docker上のPostgreSQLのデータの永続化でかなりつまずいたのでその記録です。
今回は、Mac book proで試しています。
そもそもデータベースをちゃんと扱ったことがなくてSQL文すらあやふやな状態だったので、Dockerで悩んだと言うよりはPostgresの設定的な部分でかなり悩んだ。
今回は、DockerHub公式リポジトリのpostgresは使わずに、1から作ってデータの永続化までやってみました。
ちなみに、データの永続化はデータボリュームコンテナを作りました。
ネットでよく、
データボリュームコンテナを作成して/var/lib/postgresql/dataをホストにマウント
↓
PostgreSQLコンテナでデータボリュームコンテナをマウントして永続化完了
見たいな記事をよく見かけたけど全然うまくできなかった。
そもそもデータボリュームコンテナのDockerfileで
VOLUME /var/lib/postgresql/data
とだけ書いて、データボリュームコンテナのimage 作ってPostgreSQLコンテナでマウントしたらデータベースクラスタのディレクトリが空っぽになっちゃう気がするのは勘違いなのかな?
とにかく今回やったまず大まかな流れとしては、
1. PostgreSQLのimageの作成
2. データ保存用のVolumeを作成
3. データボリュームコンテナ の作成
4. PostgreSQLコンテナでデータボリュームコンテナをマウント
です。
Dockerfile作るの初めてでかなり色々勉強になった(笑)
1. PostgreSQLのimageの作成
Dockerfileは以下のようにしました。
とりあえずubuntuにPostgreSQLをインストールして最低限の設定をしているだけです。
FROM ubuntu-upstart
MAINTAINER akira
RUN apt-get update && \
apt-get install -y postgresql
USER postgres
RUN /etc/init.d/postgresql start &&\
psql --command "CREATE ROLE user01 LOGIN CREATEDB PASSWORD 'your_password';" &&\
psql --command "CREATE DATABASE test01 OWNER user01;" &&\
echo "local all postgres peer" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "local all all trust" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "host all all 127.0.0.1/32 md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "host all all ::1/128 md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "host all postgres 0.0.0.0/0 reject" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf &&\
echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf &&\
/etc/init.d/postgresql reload
EXPOSE 5432
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
ユーザー名とパスワードとかは自分で設定してください。
次にDockerfileのあるディレクトリにて
$ docker build -t postgres9.3 .
を実行してimageの作成
2. データ保存用のVolumeを作成
データベースクラスタの置き場所を、pgDataという名前のVolumeであらかじめ作っておきます。
$ docker volume create --name pgData
3.データボリュームコンテナの作成
ここがかなり大事です。
まず、PostgreSQLコンテナを起動して、データベースクラスタのディレクトリを先ほど作ったpgDataにマウントします。
$ run -it -v pgData:/var/lib/postgresql/9.3/main/ --name postgres-test -d postgres9.3
これでこのコンテナは用無しなので削除しておきます。
次にpgDataをマウントして データボリュームコンテナを作成します。
データボリュームコンテナは起動しておく必要はないのでrun ではなくcreate しておきます。
$ docker create -it -v pgData:/var/lib/postgresql/9.3/main/ --name postgres-data busybox
これでDataVolumeContainer内にデータベースクラスタを置くことができました。
4. PostgreSQLコンテナでデータボリュームコンテナをマウント
最後は、データボリュームコンテナをマウントしてPostgreSQLのコンテナを起動すれば永続化の完了です。
$ docker run -it --volumes-from postgres-data -p 5432:5432 -d --name postgres9.3 postgres9.3
Mac OS 上からPosticoを使ってテーブルを操作したりしてから、一旦コンテナ削除してもう一回立ち上げたりしてもちゃんとデータ残ってました。
ここまで来るのに約1週間くらいかかった笑 夏休みで時間はたくさんあるので別にいいですが笑
ローカルのディレクトリを汚したくないという理由でDockerを使い始めたけどかなり苦労しました。
次は本題のRuby on Railsのアプリケーションを作っていきたいと思ってます。来週中にできるかな?笑
Rails コンテナとPostgreSQLコンテナの連携については、こちら
ishikawa-pro.hatenablog.com