OSS Fan ~OSSでLinuxサーバ構築~

作成日: 2015/11/22

OSSでLinuxサーバ構築

Docker 1.8.2でDockerfileからPostgreSQLのDockerイメージを生成しコンテナを起動

トップページOSSでLinuxサーバ構築 > 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

サーバ構築

設定

(1) 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
ファイル名:/data/docker/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

(2) 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イメージが生成されました。

(3) 生成した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

(4) Dockerコンテナの起動

 生成したDockerイメージからDockerコンテナを起動します。

# docker run -d --privileged --name dbs01 -i -t -p 5432:5432 ranocci/postgresql01:latest /sbin/init
bb1a5c87f114128653688d0ac7e160c7aa5124a10434189d62ba7477beb3d7eb

(5) 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コンテナの起動は終わりです。

動作テスト

(1) 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

(2) 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
#

(3) 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"で通信を受け付けていますか?

プロフィール

らのっち

損害保険会社のIT企画部に勤務するSEです。OSSを勉強中です。

<所属>
日本PostgreSQLユーザ会とくしまOSS普及協議会

■■■ 当サイトは Internet Explorer 11 と Mozilla Firefox 43 で動作確認済みです。 ■■■