32. 32
Docker with RHEL7 技術勉強会
dm-thinのスナップショット機能について
Dockerは、Dockerイメージのスナップショットコピーを多用します(次ページ参照)が、
RHEL7/CentOS7/Atomic HostのDockerでは、dm-thinのスナップショット機能を用いて、
コピーを作成します。
– 差分領域のみに新しいブロックが割り当てるため高速にコピーを取得すると共に、ディスク使用量を
節約する効果があります。
A B C
スナップショット作成直後
A B C A B C
ブロックプール
・・・ A B C D
A B C A B D
書き込み発生
・・・
ブロックプール
書き込んだ部分は
新しいブロックを割り当てる
46. 46
Docker with RHEL7 技術勉強会
PostgreSQL用イメージのサンプル
FROM enakai00/rhel6:ver1.0
MAINTAINER Etsuji Nakai
RUN groupadd -g 10000 postgres;
useradd -u 10000 -g 10000 postgres
RUN yum -y install postgresql-server
ADD init.sh /usr/local/bin/init.sh
RUN chown postgres.postgres /usr/local/bin/init.sh;
chmod u+x /usr/local/bin/init.sh
USER postgres
EXPOSE 5432
CMD ["/usr/local/bin/init.sh"]
~/build_pgsql/Dockerfile
ユーザー「postgres」で
起動スクリプト init.sh を実行
uid/gidを明示して
ユーザー/グループを作成
47. 47
Docker with RHEL7 技術勉強会
PostgreSQL用イメージのサンプル
#!/bin/bash
export PGDATA=/var/lib/pgsql/data
if [ "${PG_USER-undef}" = "undef" ]; then
export PG_USER=pguser
fi
if [ "${PG_DATABASE-undef}" = "undef" ]; then
export PG_DATABASE=pgdb
fi
if [[ ! -f /var/lib/pgsql/data/PG_VERSION ]]; then
/usr/bin/initdb
cat <<'EOF' >> /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'
log_destination = 'stderr'
logging_collector = off
EOF
cat <<'EOF' > /var/lib/pgsql/data/pg_hba.conf
local all all trust
host all all 0.0.0.0/0 trust
host all all ::1/128 trust
EOF
/usr/bin/pg_ctl start
sleep 5
/usr/bin/createuser -D -E -R -S -U postgres $PG_USER
/usr/bin/createdb -O $PG_USER $PG_DATABASE
/usr/bin/pg_ctl stop
fi
exec /usr/bin/postmaster
~/build_pgsql/init.sh
環境変数を用いて、作成する
ユーザーとDBを指定
execコマンドで自分自身(PID=1)を
アプリケーションプロセスに切り替える
あくまでサンプルなので
セキュリティ設定は適当です…
「docker logs」でログが見れるように
標準(エラー)出力にログを出力
48. 48
Docker with RHEL7 技術勉強会
PostgreSQL用イメージのサンプル
ビルド/実行例は次のようになります。
# docker build -t enakai00/pgsql:ver1.0 ~/build_pgsql/
# mkdir /data
# chcon -Rt svirt_sandbox_file_t /data
# chown 10000.10000 /data
# docker run -itd -p 5432:5432 -v /data:/var/lib/pgsql/data --name pgsql
-e PG_USER=etsuji -e PG_DATABASE=mydb enakai00/pgsql:ver1.0
# docker logs pgsql
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
...
LOG: database system was shut down at 2016-02-09 04:10:27 EST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
# psql -h localhost -U etsuji -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+-----------+---------+-------+-----------------------
mydb | etsuji | SQL_ASCII | C | C |
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
データ保存ディレクトリーは
ホストLinux上に用意
49. 49
Docker with RHEL7 技術勉強会
PostgreSQL用イメージのサンプル
コンテナを停止すると、DBの停止処理が適切に行われていることがわかります。
# docker stop pgsql
# docker logs pgsql
...
waiting for server to shut down....LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down
done
server stopped
LOG: database system was shut down at 2016-02-09 04:21:19 EST
LOG: database system is ready to accept connections
LOG: autovacuum launcher started
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down
# docker rm pgsql