Docker 1.8.2でDockerfileからPostgreSQLのDockerイメージを生成しコンテナを起動
目次
概要
Docker 1.8.2でPostgreSQLが稼働する環境を構築します。 Dockerfileを作成し、CentOSの公式DockerイメージをベースにPostgreSQLをインストールしたDockerイメージを生成する手順を記述します。 生成したDockerイメージからDockerコンテナを起動し、ホストOSからpsqlで接続してSQLの実行を確認します。
構成
想定環境
DockerfileからDockerイメージを生成し、Dockerコンテナを起動するまでの流れは以下の通りです。
起動したDockerコンテナ内のPostgreSQLへpsqlで接続するで接続する際の流れは以下の通りとなります。 Dockerコンテナ起動後に実際にこの流れで接続確認を行います。
サーバ構成
OSバージョン
■ホストOS
Red Hat Enterprise Linux 7.1 x86_64
■コンテナOS
CentOS 7.1.1503 x86_64
ソフトウェア・パッケージ一覧
ホストOSには以下のパッケージがインストール済みであることが前提です。
- docker-1.8.2-7.el7.x86_64.rpm
コンテナOSには以下のパッケージをインストールします。 インストールはDockerfileを利用して後述の手順の中で実行します。 なお、バージョンは2015年11月22日時点のものです。 yumでインストールしているため、実行する時期によって異なることが 考えられますのでご注意ください。
- postgresql-libs-9.2.14-1.el7_1.x86_64
- postgresql-9.2.14-1.el7_1.x86_64
- postgresql-server-9.2.14-1.el7_1.x86_64
環境構築
設定
Dockerfileの作成
/data/docker/ ディレクトリ内にDockerfile(ファイル名はDockerfile_postgresql01)を作成します。 Dockerfileに記述する内容で、 yumを利用してPostgreSQLパッケージをインストールし、初期設定までやります。 インストールするパッケージはPostgreSQLのサーバ用パッケージとクライアント用パッケージ、ライブラリパッケージ(依存関係で自動インストールされる)の3つです。 インストール後にinitdbコマンドでデータベースクラスタを作成します。 systemdで自動起動の設定やユーザのパスワード設定も行います。 PostgreSQLサーバの設定ファイル(postgresql.conf)とクライアント認証設定ファイル(pg_hba.conf)を編集します。 これら2つのファイルはsedコマンドを使って泥臭く置換しています。 yumでインストールされるPostgreSQLのバージョンが新しくなると設定ファイルの初期設定内容が変更される可能性があります。 そうなるとsedの置換条件にヒットしなくなるのでDockerfile自体も修正する必要がでてきますので、注意しましょう。 今後はできればGitHub等からファイルをダウンロードしてくるなど改善が必要そうです。
# cd /data/docker/ # vi Dockerfile_postgresql01
※ファイルを新規作成※
FROM centos:latest
MAINTAINER RANOCCI
ENV container docker
RUN yum update -y && yum clean all
RUN yum install -y postgresql postgresql-server && yum clean all
RUN su - postgres -c "initdb --encoding=UTF8 --no-locale --pgdata=/var/lib/pgsql/data --auth=ident"
RUN systemctl enable postgresql
RUN cp -piv /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.bk
RUN sed -e "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
RUN sed -e "s/log_filename = 'postgresql-%a.log'/log_filename = 'postgresql-%Y%m%d.log'/g" /var/lib/pgsql/data/postgresql.tmp > /var/lib/pgsql/data/postgresql.conf
RUN sed -e "s/log_truncate_on_rotation = on/log_truncate_on_rotation = off/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
RUN sed -e "s/log_rotation_age = 1d/log_rotation_age = 7d/g" /var/lib/pgsql/data/postgresql.tmp > /var/lib/pgsql/data/postgresql.conf
RUN sed -e "s/#log_line_prefix = ''/log_line_prefix = '%t [%p] '/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
RUN mv /var/lib/pgsql/data/postgresql.tmp /var/lib/pgsql/data/postgresql.conf
RUN su - postgres -c "pg_ctl start -w;psql -c \"alter role postgres with password 'password';\";pg_ctl stop -m fast"
RUN cp -piv /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bk
RUN sed -e "s/^host/#host/g" /var/lib/pgsql/data/pg_hba.conf > /var/lib/pgsql/data/pg_hba.tmp
RUN sed -e "s/^local/#local/g" /var/lib/pgsql/data/pg_hba.tmp > /var/lib/pgsql/data/pg_hba.conf
RUN echo "local all postgres peer" >> /var/lib/pgsql/data/pg_hba.conf
RUN echo "local all all md5" >> /var/lib/pgsql/data/pg_hba.conf
RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf
RUN rm -f /var/lib/pgsql/data/pg_hba.tmp
EXPOSE 5432
Dockerイメージの生成
作成したDockerfile(ファイル名はDockerfile_postgresql01)からDockerイメージを生成します。 Dockerイメージの名前は『作成者/イメージ名』の形式に倣って『ranocci/postgresql01』とします。
# cd /data/docker/
# ls -l
合計 8
-rw-r--r-- 1 root root 232 11月 15 02:58 Dockerfile_httpd01
-rw-r--r-- 1 root root 1998 11月 22 06:49 Dockerfile_postgresql01 ←これを使う
drwxr-xr-x 2 root root 23 11月 15 10:29 web01
# docker build -f ./Dockerfile_postgresql01 -t ranocci/postgresql01 --no-cache=true .
Sending build context to Docker daemon 6.144 kB
Step 0 : FROM centos:latest
---> ce20c473cd8a
Step 1 : MAINTAINER RANOCCI
---> Running in 965bc983e387
---> 9ecccfb97fcf
Removing intermediate container 965bc983e387
Step 2 : ENV container docker
---> Running in a342692e96d9
---> 78e4934b9bdd
Removing intermediate container a342692e96d9
Step 3 : RUN yum update -y && yum clean all
---> Running in fe10e70c45e4
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: ftp.nara.wide.ad.jp
* extras: ftp.jaist.ac.jp
* updates: mirror.vodien.com
Resolving Dependencies
--> Running transaction check
---> Package coreutils.x86_64 0:8.22-11.el7 will be updated
---> Package coreutils.x86_64 0:8.22-12.el7_1.2 will be an update
---> Package gmp.x86_64 1:6.0.0-11.el7 will be updated
---> Package gmp.x86_64 1:6.0.0-12.el7_1 will be an update
---> Package krb5-libs.x86_64 0:1.12.2-14.el7 will be updated
---> Package krb5-libs.x86_64 0:1.12.2-15.el7_1 will be an update
---> Package nspr.x86_64 0:4.10.8-1.el7_1 will be updated
---> Package nspr.x86_64 0:4.10.8-2.el7_1 will be an update
---> Package nss.x86_64 0:3.19.1-5.el7_1 will be updated
---> Package nss.x86_64 0:3.19.1-7.el7_1.2 will be an update
---> Package nss-softokn.x86_64 0:3.16.2.3-12.el7_1 will be updated
---> Package nss-softokn.x86_64 0:3.16.2.3-13.el7_1 will be an update
---> Package nss-softokn-freebl.x86_64 0:3.16.2.3-12.el7_1 will be updated
---> Package nss-softokn-freebl.x86_64 0:3.16.2.3-13.el7_1 will be an update
---> Package nss-sysinit.x86_64 0:3.19.1-5.el7_1 will be updated
---> Package nss-sysinit.x86_64 0:3.19.1-7.el7_1.2 will be an update
---> Package nss-tools.x86_64 0:3.19.1-5.el7_1 will be updated
---> Package nss-tools.x86_64 0:3.19.1-7.el7_1.2 will be an update
---> Package nss-util.x86_64 0:3.19.1-3.el7_1 will be updated
---> Package nss-util.x86_64 0:3.19.1-4.el7_1 will be an update
---> Package openldap.x86_64 0:2.4.39-6.el7 will be updated
---> Package openldap.x86_64 0:2.4.39-7.el7.centos will be an update
---> Package pam.x86_64 0:1.1.8-12.el7 will be updated
---> Package pam.x86_64 0:1.1.8-12.el7_1.1 will be an update
---> Package sqlite.x86_64 0:3.7.17-4.el7 will be updated
---> Package sqlite.x86_64 0:3.7.17-6.el7_1.1 will be an update
---> Package tzdata.noarch 0:2015f-1.el7 will be updated
---> Package tzdata.noarch 0:2015g-1.el7 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Updating:
coreutils x86_64 8.22-12.el7_1.2 updates 3.2 M
gmp x86_64 1:6.0.0-12.el7_1 updates 280 k
krb5-libs x86_64 1.12.2-15.el7_1 updates 826 k
nspr x86_64 4.10.8-2.el7_1 updates 126 k
nss x86_64 3.19.1-7.el7_1.2 updates 851 k
nss-softokn x86_64 3.16.2.3-13.el7_1 updates 305 k
nss-softokn-freebl x86_64 3.16.2.3-13.el7_1 updates 204 k
nss-sysinit x86_64 3.19.1-7.el7_1.2 updates 52 k
nss-tools x86_64 3.19.1-7.el7_1.2 updates 480 k
nss-util x86_64 3.19.1-4.el7_1 updates 71 k
openldap x86_64 2.4.39-7.el7.centos updates 344 k
pam x86_64 1.1.8-12.el7_1.1 updates 714 k
sqlite x86_64 3.7.17-6.el7_1.1 updates 394 k
tzdata noarch 2015g-1.el7 updates 431 k
Transaction Summary
================================================================================
Upgrade 14 Packages
Total download size: 8.2 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
warning: /var/cache/yum/x86_64/7/updates/packages/nspr-4.10.8-2.el7_1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for nspr-4.10.8-2.el7_1.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total 1.8 MB/s | 8.2 MB 00:04
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@CentOS)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Updating : nspr-4.10.8-2.el7_1.x86_64 1/28
Updating : nss-util-3.19.1-4.el7_1.x86_64 2/28
Updating : nss-softokn-freebl-3.16.2.3-13.el7_1.x86_64 3/28
Updating : 1:gmp-6.0.0-12.el7_1.x86_64 4/28
Updating : coreutils-8.22-12.el7_1.2.x86_64 5/28
Updating : sqlite-3.7.17-6.el7_1.1.x86_64 6/28
Updating : nss-softokn-3.16.2.3-13.el7_1.x86_64 7/28
Updating : nss-sysinit-3.19.1-7.el7_1.2.x86_64 8/28
Updating : nss-3.19.1-7.el7_1.2.x86_64 9/28
Updating : nss-tools-3.19.1-7.el7_1.2.x86_64 10/28
Updating : openldap-2.4.39-7.el7.centos.x86_64 11/28
Updating : pam-1.1.8-12.el7_1.1.x86_64 12/28
Updating : krb5-libs-1.12.2-15.el7_1.x86_64 13/28
Updating : tzdata-2015g-1.el7.noarch 14/28
Cleanup : openldap-2.4.39-6.el7.x86_64 15/28
Cleanup : tzdata-2015f-1.el7.noarch 16/28
Cleanup : nss-tools-3.19.1-5.el7_1.x86_64 17/28
Cleanup : nss-sysinit-3.19.1-5.el7_1.x86_64 18/28
Cleanup : nss-3.19.1-5.el7_1.x86_64 19/28
Cleanup : nss-softokn-3.16.2.3-12.el7_1.x86_64 20/28
Cleanup : nss-util-3.19.1-3.el7_1.x86_64 21/28
Cleanup : krb5-libs-1.12.2-14.el7.x86_64 22/28
Cleanup : pam-1.1.8-12.el7.x86_64 23/28
Cleanup : coreutils-8.22-11.el7.x86_64 24/28
Cleanup : 1:gmp-6.0.0-11.el7.x86_64 25/28
Cleanup : nspr-4.10.8-1.el7_1.x86_64 26/28
Cleanup : sqlite-3.7.17-4.el7.x86_64 27/28
Cleanup : nss-softokn-freebl-3.16.2.3-12.el7_1.x86_64 28/28
Verifying : nss-softokn-3.16.2.3-13.el7_1.x86_64 1/28
Verifying : openldap-2.4.39-7.el7.centos.x86_64 2/28
Verifying : tzdata-2015g-1.el7.noarch 3/28
Verifying : pam-1.1.8-12.el7_1.1.x86_64 4/28
Verifying : coreutils-8.22-12.el7_1.2.x86_64 5/28
Verifying : sqlite-3.7.17-6.el7_1.1.x86_64 6/28
Verifying : 1:gmp-6.0.0-12.el7_1.x86_64 7/28
Verifying : nss-sysinit-3.19.1-7.el7_1.2.x86_64 8/28
Verifying : nss-3.19.1-7.el7_1.2.x86_64 9/28
Verifying : nss-tools-3.19.1-7.el7_1.2.x86_64 10/28
Verifying : nss-softokn-freebl-3.16.2.3-13.el7_1.x86_64 11/28
Verifying : nspr-4.10.8-2.el7_1.x86_64 12/28
Verifying : krb5-libs-1.12.2-15.el7_1.x86_64 13/28
Verifying : nss-util-3.19.1-4.el7_1.x86_64 14/28
Verifying : openldap-2.4.39-6.el7.x86_64 15/28
Verifying : pam-1.1.8-12.el7.x86_64 16/28
Verifying : tzdata-2015f-1.el7.noarch 17/28
Verifying : sqlite-3.7.17-4.el7.x86_64 18/28
Verifying : nss-softokn-freebl-3.16.2.3-12.el7_1.x86_64 19/28
Verifying : nss-util-3.19.1-3.el7_1.x86_64 20/28
Verifying : nspr-4.10.8-1.el7_1.x86_64 21/28
Verifying : nss-softokn-3.16.2.3-12.el7_1.x86_64 22/28
Verifying : 1:gmp-6.0.0-11.el7.x86_64 23/28
Verifying : coreutils-8.22-11.el7.x86_64 24/28
Verifying : nss-tools-3.19.1-5.el7_1.x86_64 25/28
Verifying : nss-3.19.1-5.el7_1.x86_64 26/28
Verifying : nss-sysinit-3.19.1-5.el7_1.x86_64 27/28
Verifying : krb5-libs-1.12.2-14.el7.x86_64 28/28
Updated:
coreutils.x86_64 0:8.22-12.el7_1.2
gmp.x86_64 1:6.0.0-12.el7_1
krb5-libs.x86_64 0:1.12.2-15.el7_1
nspr.x86_64 0:4.10.8-2.el7_1
nss.x86_64 0:3.19.1-7.el7_1.2
nss-softokn.x86_64 0:3.16.2.3-13.el7_1
nss-softokn-freebl.x86_64 0:3.16.2.3-13.el7_1
nss-sysinit.x86_64 0:3.19.1-7.el7_1.2
nss-tools.x86_64 0:3.19.1-7.el7_1.2
nss-util.x86_64 0:3.19.1-4.el7_1
openldap.x86_64 0:2.4.39-7.el7.centos
pam.x86_64 0:1.1.8-12.el7_1.1
sqlite.x86_64 0:3.7.17-6.el7_1.1
tzdata.noarch 0:2015g-1.el7
Complete!
Loaded plugins: fastestmirror
Cleaning repos: base extras systemdcontainer updates
Cleaning up everything
Cleaning up list of fastest mirrors
---> 2d88aaab0fbf
Removing intermediate container fe10e70c45e4
Step 4 : RUN yum install -y postgresql postgresql-server && yum clean all
---> Running in 0d34dd2d1413
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: ftp.nara.wide.ad.jp
* extras: ftp.riken.jp
* updates: ftp.riken.jp
Resolving Dependencies
--> Running transaction check
---> Package postgresql.x86_64 0:9.2.14-1.el7_1 will be installed
--> Processing Dependency: postgresql-libs(x86-64) = 9.2.14-1.el7_1 for package: postgresql-9.2.14-1.el7_1.x86_64
--> Processing Dependency: libpq.so.5()(64bit) for package: postgresql-9.2.14-1.el7_1.x86_64
---> Package postgresql-server.x86_64 0:9.2.14-1.el7_1 will be installed
--> Running transaction check
---> Package postgresql-libs.x86_64 0:9.2.14-1.el7_1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
postgresql x86_64 9.2.14-1.el7_1 updates 3.0 M
postgresql-server x86_64 9.2.14-1.el7_1 updates 3.7 M
Installing for dependencies:
postgresql-libs x86_64 9.2.14-1.el7_1 updates 231 k
Transaction Summary
================================================================================
Install 2 Packages (+1 Dependent package)
Total download size: 7.0 M
Installed size: 33 M
Downloading packages:
--------------------------------------------------------------------------------
Total 363 kB/s | 7.0 MB 00:19
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : postgresql-libs-9.2.14-1.el7_1.x86_64 1/3
Installing : postgresql-9.2.14-1.el7_1.x86_64 2/3
Installing : postgresql-server-9.2.14-1.el7_1.x86_64 3/3
Verifying : postgresql-9.2.14-1.el7_1.x86_64 1/3
Verifying : postgresql-server-9.2.14-1.el7_1.x86_64 2/3
Verifying : postgresql-libs-9.2.14-1.el7_1.x86_64 3/3
Installed:
postgresql.x86_64 0:9.2.14-1.el7_1 postgresql-server.x86_64 0:9.2.14-1.el7_1
Dependency Installed:
postgresql-libs.x86_64 0:9.2.14-1.el7_1
Complete!
Loaded plugins: fastestmirror
Cleaning repos: base extras systemdcontainer updates
Cleaning up everything
Cleaning up list of fastest mirrors
---> 25997a435785
Removing intermediate container 0d34dd2d1413
Step 5 : RUN su - postgres -c "initdb --encoding=UTF8 --no-locale --pgdata=/var/lib/pgsql/data --auth=ident"
---> Running in 0639a2a82bd0
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".
fixing permissions on existing directory /var/lib/pgsql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 32MB
creating configuration files ... ok
creating template1 database in /var/lib/pgsql/data/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
Success. You can now start the database server using:
postgres -D /var/lib/pgsql/data
or
pg_ctl -D /var/lib/pgsql/data -l logfile start
---> 17d6f432c4b9
Removing intermediate container 0639a2a82bd0
Step 6 : RUN systemctl enable postgresql
---> Running in f1dcd9eb2aca
---> 330e2bf15c42
Removing intermediate container f1dcd9eb2aca
Step 7 : RUN cp -piv /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.bk
---> Running in f61bcd2c2bc8
'/var/lib/pgsql/data/postgresql.conf' -> '/var/lib/pgsql/data/postgresql.conf.bk'
---> 555e4d6cce7d
Removing intermediate container f61bcd2c2bc8
Step 8 : RUN sed -e "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
---> Running in ac31ebf4a367
---> b9557e18f5b7
Removing intermediate container ac31ebf4a367
Step 9 : RUN sed -e "s/log_filename = 'postgresql-%a.log'/log_filename = 'postgresql-%Y%m%d.log'/g" /var/lib/pgsql/data/postgresql.tmp > /var/lib/pgsql/data/postgresql.conf
---> Running in 974cd8c11d23
---> ea1ace3e6acb
Removing intermediate container 974cd8c11d23
Step 10 : RUN sed -e "s/log_truncate_on_rotation = on/log_truncate_on_rotation = off/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
---> Running in 6612782c21af
---> bcde8a24739f
Removing intermediate container 6612782c21af
Step 11 : RUN sed -e "s/log_rotation_age = 1d/log_rotation_age = 7d/g" /var/lib/pgsql/data/postgresql.tmp > /var/lib/pgsql/data/postgresql.conf
---> Running in ec56d5e6b603
---> 14a4e612142f
Removing intermediate container ec56d5e6b603
Step 12 : RUN sed -e "s/#log_line_prefix = ''/log_line_prefix = '%t [%p] '/g" /var/lib/pgsql/data/postgresql.conf > /var/lib/pgsql/data/postgresql.tmp
---> Running in c6ac1cf5545d
---> 25e859a05e64
Removing intermediate container c6ac1cf5545d
Step 13 : RUN mv /var/lib/pgsql/data/postgresql.tmp /var/lib/pgsql/data/postgresql.conf
---> Running in 3bbd24083447
---> a1bd6df14520
Removing intermediate container 3bbd24083447
Step 14 : RUN su - postgres -c "pg_ctl start -w;psql -c \"alter role postgres with password 'password';\";pg_ctl stop -m fast"
---> Running in 5826508c0806
waiting for server to start.... done
server started
ALTER ROLE
waiting for server to shut down.... done
server stopped
---> 77779bf06bad
Removing intermediate container 5826508c0806
Step 15 : RUN cp -piv /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bk
---> Running in ced0d8a18950
'/var/lib/pgsql/data/pg_hba.conf' -> '/var/lib/pgsql/data/pg_hba.conf.bk'
---> 6ed6c4d80048
Removing intermediate container ced0d8a18950
Step 16 : RUN sed -e "s/^host/#host/g" /var/lib/pgsql/data/pg_hba.conf > /var/lib/pgsql/data/pg_hba.tmp
---> Running in e48d8d565917
---> 36a8284f986c
Removing intermediate container e48d8d565917
Step 17 : RUN sed -e "s/^local/#local/g" /var/lib/pgsql/data/pg_hba.tmp > /var/lib/pgsql/data/pg_hba.conf
---> Running in 27084725b03c
---> a13c8f69d80c
Removing intermediate container 27084725b03c
Step 18 : RUN echo "local all postgres peer" >> /var/lib/pgsql/data/pg_hba.conf
---> Running in f936d36b6f06
---> 4020d6cb70e7
Removing intermediate container f936d36b6f06
Step 19 : RUN echo "local all all md5" >> /var/lib/pgsql/data/pg_hba.conf
---> Running in a88f31d0d4ac
---> 02133df630b9
Removing intermediate container a88f31d0d4ac
Step 20 : RUN echo "host all all 0.0.0.0/0 md5" >> /var/lib/pgsql/data/pg_hba.conf
---> Running in 9e35e74a1c82
---> ecc70e53dc2a
Removing intermediate container 9e35e74a1c82
Step 21 : RUN rm -f /var/lib/pgsql/data/pg_hba.tmp
---> Running in 06450ca1d1b2
---> 1dc291a634d2
Removing intermediate container 06450ca1d1b2
Step 22 : EXPOSE 5432
---> Running in c0ca90e7c67e
---> d2078d614b29
Removing intermediate container c0ca90e7c67e
Successfully built d2078d614b29
最後に「Successfully built」と表示されたらビルド成功です。 これでDockerイメージが生成されました。
生成したDockerイメージの確認
Dockerイメージを一覧表示し、『ranocci/postgresql01』という名前のイメージが生成されていることを確認します。
# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ranocci/postgresql01 latest d2078d614b29 7 minutes ago 290.1 MB ←これが生成された
ranocci/httpd01 latest bda5163b549b 7 days ago 256.4 MB
docker.io/feduxorg/centos-postgresql latest 2e051da650ef 8 days ago 421.6 MB
docker.io/centos latest ce20c473cd8a 5 weeks ago 172.3 MB
Dockerコンテナの起動
生成したDockerイメージからDockerコンテナを起動します。
# docker run -d --privileged --name dbs01 -i -t -p 5432:5432 ranocci/postgresql01:latest /sbin/init bb1a5c87f114128653688d0ac7e160c7aa5124a10434189d62ba7477beb3d7eb
Dockerコンテナの起動確認
Dockerコンテナが起動したことを確認します。 Dockerコンテナが起動し、コンテナIDが割り当てられていること、ステータスがUPになっていることを確認します。 また、5432番ポートでDockerのプロキシがリッスンしていることを確認します。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb1a5c87f114 ranocci/postgresql01:latest "/sbin/init" 6 seconds ago Up 4 seconds 0.0.0.0:5432->5432/tcp dbs01 ←起動した 1a7171551708 ranocci/httpd01:latest "/sbin/init" 7 days ago Up 7 days 0.0.0.0:80->80/tcp web01 # netstat -tanp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 32558/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1687/master tcp 0 96 192.168.0.106:22 192.168.0.101:54226 ESTABLISHED 25528/sshd: root@pt tcp6 0 0 :::80 :::* LISTEN 26761/docker-proxy tcp6 0 0 :::22 :::* LISTEN 32558/sshd tcp6 0 0 :::5432 :::* LISTEN 28386/docker-proxy ←リッスン中 tcp6 0 0 ::1:25 :::* LISTEN 1687/master
以上でDockerイメージの生成とPostgreSQLが稼働するDockerコンテナの起動は終わりです。
動作テスト
Dockerコンテナの停止・起動テスト
Apacheが稼働するDockerコンテナの停止・起動確認を行います。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb1a5c87f114 ranocci/postgresql01:latest "/sbin/init" 5 minutes ago Up 5 minutes 0.0.0.0:5432->5432/tcp dbs01 ←稼働中 1a7171551708 ranocci/httpd01:latest "/sbin/init" 7 days ago Up 7 days 0.0.0.0:80->80/tcp web01 # docker stop dbs01 dbs01 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb1a5c87f114 ranocci/postgresql01:latest "/sbin/init" 5 minutes ago Exited (137) 7 seconds ago dbs01 ←停止中 1a7171551708 ranocci/httpd01:latest "/sbin/init" 7 days ago Up 7 days 0.0.0.0:80->80/tcp web01 # docker start dbs01 dbs01 # docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bb1a5c87f114 ranocci/postgresql01:latest "/sbin/init" 6 minutes ago Up 10 seconds 0.0.0.0:5432->5432/tcp dbs01 ←稼働中 1a7171551708 ranocci/httpd01:latest "/sbin/init" 7 days ago Up 7 days 0.0.0.0:80->80/tcp web01
Dockerコンテナへのログイン確認
稼働中のDockerコンテナに接続して、コンテナ内のCentOS上でPostgreSQLの稼働状態を確認します。
# docker exec -i -t dbs01 /bin/bash [root@bb1a5c87f114 /]# cat /etc/redhat-release CentOS Linux release 7.1.1503 (Core) [root@bb1a5c87f114 /]# uname -a Linux bb1a5c87f114 3.10.0-229.el7.x86_64 #1 SMP Thu Jan 29 18:37:38 EST 2015 x86_64 x86_64 x86_64 GNU/Linux [root@bb1a5c87f114 /]# ps -ef | grep postgres postgres 73 1 0 13:04 ? 00:00:00 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432 postgres 74 73 0 13:04 ? 00:00:00 postgres: logger process postgres 76 73 0 13:04 ? 00:00:00 postgres: checkpointer process postgres 77 73 0 13:04 ? 00:00:00 postgres: writer process postgres 78 73 0 13:04 ? 00:00:00 postgres: wal writer process postgres 79 73 0 13:04 ? 00:00:00 postgres: autovacuum launcher process postgres 80 73 0 13:04 ? 00:00:00 postgres: stats collector process root 187 169 0 14:32 ? 00:00:00 grep --color=auto postgres [root@bb1a5c87f114 /]# systemctl status postgresql postgresql.service - PostgreSQL database server Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled) Drop-In: /run/systemd/system/postgresql.service.d mq00-docker.conf Active: active (running) since Sun 2015-11-22 13:04:36 UTC; 1h 28min ago Process: 70 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS) Process: 65 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS) Main PID: 73 (postgres) CGroup: /system.slice/docker-bb1a5c87f114128653688d0ac7e160c7aa5124a10434189d62ba7477beb3d7eb.scope/system.slice/postgresql.service tq73 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432 tq74 postgres: logger process tq76 postgres: checkpointer process tq77 postgres: writer process tq78 postgres: wal writer process tq79 postgres: autovacuum launcher process mq80 postgres: stats collector process ? 73 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432 Nov 22 13:04:35 bb1a5c87f114 systemd[1]: Starting PostgreSQL database server... Nov 22 13:04:35 bb1a5c87f114 pg_ctl[70]: pg_ctl: another server might be running; trying to start server anyway Nov 22 13:04:36 bb1a5c87f114 systemd[1]: Started PostgreSQL database server. [root@bb1a5c87f114 /]# exit exit #
psqlでの接続確認
Dockerが稼働するサーバのホストOS(Red Hat Enterprise Linux 7.1)からDockerコンテナ内のPostgreSQLにpsqlで接続確認を行います。
# su - postgres 最終ログイン: 2015/11/22 (日) 07:11:57 JST日時 pts/0 -bash-4.2$ psql -h localhost ←コンテナ外からはUnixドメインソケット接続不可、TCP/IP接続する パスワード: ←入力したパスワードは表示されない psql (9.4.5, サーバー 9.2.14) "help" でヘルプを表示します. postgres=# select now(); ←SQLを実行してみる now ------------------------------- 2015-11-22 14:38:22.998407+00 (1 行) postgres=# select oid, datname from pg_database; ←SQLを実行してみる oid | datname -------+----------- 1 | template1 12002 | template0 12007 | postgres (3 行) postgres=# \q ←psqlコマンドを終了する -bash-4.2$ exit ←Dockerコンテナから抜ける ログアウト #
以上でPostgreSQLが稼働するDockerコンテナの動作確認は終わりです。
参考
Dockerコンテナ内のPostgreSQLとの接続について
ホストOSのターミナルからDockerコンテナ内のPostgreSQLにUnixドメインソケット接続使用とすると失敗します。 DockerではホストOSとカーネルを共有しているとはいえ、IPアドレスも別だしTCP/IP接続しかできないようです。
# su - postgres
最終ログイン: 2015/11/22 (日) 07:11:57 JST日時 pts/0
-bash-4.2$ psql ←Unixドメインソケット接続してみると
psql: サーバに接続できませんでした: そのようなファイルやディレクトリはありません
ローカルにサーバが稼動していますか?
Unixドメインソケット"/var/run/postgresql/.s.PGSQL.5432"で通信を受け付けていますか?