LoginSignup
0
0

How to create and run multiple postgreSQL containers with docker compose on single docker host at the same time.

Last updated at Posted at 2024-05-16

How to create and run multiple postgreSQL containers with docker compose on single docker host at the same time.

Obejctives

  • Run multiple PostgreSQL containers with
    • multiple versions
    • different ports
    • different local volumes

Restriction

  • Official PostgreSQL container image doesn't have Japanese locale such like ja_JP.utf8 .

Official images and available version tags

System

# cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)

# docker -v
Docker version 26.1.2, build 211e74b

Tips

Separate the project name (small letter) for each containers with docker compose command.

Options:
  -p, --project-name string        Project name
must consist only of lowercase alphanumeric characters, hyphens, and underscores as well as start with a letter or number

Mapping different port numbers.

Mapping database data directory to local volume.

  • If you remove container with misstake, you can recovery database with recreating conatainer.

Make 3 compose files

# cat PGSQL15.7-PJ1.yml
services:
  db:
    image: postgres:15.7
    container_name: postgres_15.7-1
    ports:
      - 5433:5432
    volumes:
      - type: bind
        source: /docker-postgres/15.7-1/data
        target: /var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=P@ssw0rd
# cat PGSQL15.7-PJ2.yml
services:
  db:
    image: postgres:15.7
    container_name: postgres_15.7-2
    ports:
      - 5434:5432
    volumes:
      - type: bind
        source: /docker-postgres/15.7-1/data
        target: /var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=P@ssw0rd
# cat PGSQL14-PJ3.yml
services:
  db:
    image: postgres:14
    container_name: postgres_14-1
    ports:
      - 5435:5432
    volumes:
      - type: bind
        source: /docker-postgres/14-1/data
        target: /var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=P@ssw0rd

Prepare local volumes

# mkdir -p /docker-postgres/15.7-1/data /docker-postgres/15.7-1/data /docker-postgres/14-1/data
# ls -l /docker-postgres/15.7-1/data /docker-postgres/15.7-1/data /docker-postgres/14-1/data
/docker-postgres/14-1/data:
合計 0

/docker-postgres/15.7-1/data:
合計 0

/docker-postgres/15.7-1/data:
合計 0

Execute docker compose with dry run at first

# docker compose -p pj1 -f PGSQL15.7-PJ1.yml --dry-run up
[+] Running 1/1
 ✔ DRY-RUN MODE -  db Pulled                                                                                                        1.3s
[+] Running 1/0
 ✔ DRY-RUN MODE -  Container postgres_15.7-1  Created                                                                               0.0s
end of 'compose up' output, interactive run is not supported in dry-run mode

(snip)

Execute docker compose

# docker compose -p pj1 -f PGSQL15.7-PJ1.yml up -d
[+] Running 15/15
 ✔ db Pulled                                                                                                                       18.5s
   ✔ 09f376ebb190 Pull complete                                                                                                     6.0s
   ✔ 119215dfb3e3 Pull complete                                                                                                     6.0s
   ✔ 94fccb772ad3 Pull complete                                                                                                     6.5s
   ✔ 0fc3acb16548 Pull complete                                                                                                     6.7s
   ✔ d7dba7d03fe8 Pull complete                                                                                                     7.8s
   ✔ 898ae395a1ca Pull complete                                                                                                     8.0s
   ✔ 088e651df7e9 Pull complete                                                                                                     8.0s
   ✔ ed155773e5e0 Pull complete                                                                                                     8.0s
   ✔ 52df7d12fb73 Pull complete                                                                                                    15.3s
   ✔ bab1ecc22dc9 Pull complete                                                                                                    15.4s
   ✔ 1655a257a5b5 Pull complete                                                                                                    15.4s
   ✔ 978f02dfc247 Pull complete                                                                                                    15.4s
   ✔ d715d7d9aee0 Pull complete                                                                                                    15.4s
   ✔ b2e9251b2f8d Pull complete                                                                                                    15.4s
[+] Running 1/1
 ✔ Container postgres_15.7-1  Started 
same image
 # docker compose -p pj2 -f PGSQL15.7-PJ2.yml up -d
[+] Running 1/1
 ✔ Container postgres_15.7-2  Started  
# docker compose -p pj3 -f PGSQL14-PJ3.yml up -d
[+] Running 15/15
 ✔ db Pulled                                                                                                                       22.7s
   ✔ 09f376ebb190 Already exists                                                                                                    0.0s
   ✔ eae1b5cf3e42 Pull complete                                                                                                     0.7s
   ✔ a9404ea998bc Pull complete                                                                                                     1.1s
   ✔ 9b72f3da5ca8 Pull complete                                                                                                     1.2s
   ✔ 0862c192c702 Pull complete                                                                                                     2.4s
   ✔ ca21a003e48e Pull complete                                                                                                     2.6s
   ✔ 16e7bd8396f1 Pull complete                                                                                                     2.6s
   ✔ 1c42d8ac920e Pull complete                                                                                                     7.0s
   ✔ 3dc5508cdb5e Pull complete                                                                                                    19.8s
   ✔ 277e41134633 Pull complete                                                                                                    19.8s
   ✔ 8fec6d10d079 Pull complete                                                                                                    19.8s
   ✔ ff5496d1ae7d Pull complete                                                                                                    19.9s
   ✔ acb6b31dbd6d Pull complete                                                                                                    19.9s
   ✔ faf3364210ef Pull complete                                                                                                    19.9s
[+] Running 1/1
 ✔ Container postgres_14-1  Started 

Check containers and database connections

# docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED              STATUS              PORTS                                       NAMES
f0130bc31557   postgres:14     "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:5435->5432/tcp, :::5435->5432/tcp   postgres_14-1
0360be108fdf   postgres:15.7   "docker-entrypoint.s…"   2 minutes ago        Up 2 minutes        0.0.0.0:5434->5432/tcp, :::5434->5432/tcp   postgres_15.7-2
fbf9655439f0   postgres:15.7   "docker-entrypoint.s…"   3 minutes ago        Up 3 minutes        0.0.0.0:5433->5432/tcp, :::5433->5432/tcp   postgres_15.7-1
# docker compose ls
NAME                STATUS              CONFIG FILES
pj1                 running(1)          /root/docker-compose/PGSQL15.7-PJ1.yml
pj2                 running(1)          /root/docker-compose/PGSQL15.7-PJ2.yml
pj3                 running(1)          /root/docker-compose/PGSQL14-PJ3.yml
# docker inspect postgres_15.7-1
(snip)
            "Mounts": [
                {
                    "Type": "bind",
                    "Source": "/docker-postgres/15.7-1/data",
                    "Target": "/var/lib/postgresql/data"
                }
            ],
(snip)
# ls -l /docker-postgres/15.7-1/data /docker-postgres/15.7-1/data /docker-postgres/14-1/data
/docker-postgres/14-1/data:
合計 64
-rw-------. 1 systemd-coredump input     3  5月 16 20:23 PG_VERSION
drwx------. 5 systemd-coredump input    41  5月 16 20:23 base
drwx------. 2 systemd-coredump input  4096  5月 16 20:24 global
drwx------. 2 systemd-coredump input     6  5月 16 20:23 pg_commit_ts
drwx------. 2 systemd-coredump input     6  5月 16 20:23 pg_dynshmem
-rw-------. 1 systemd-coredump input  4821  5月 16 20:23 pg_hba.conf
(snip)
-rw-------. 1 systemd-coredump input    88  5月 16 20:23 postgresql.auto.conf
-rw-------. 1 systemd-coredump input 28827  5月 16 20:23 postgresql.conf
-rw-------. 1 systemd-coredump input    36  5月 16 20:23 postmaster.opts
-rw-------. 1 systemd-coredump input    94  5月 16 20:23 postmaster.pid

/docker-postgres/15.7-1/data:
合計 64
-rw-------. 1 systemd-coredump input     3  5月 16 20:22 PG_VERSION
drwx------. 5 systemd-coredump input    33  5月 16 20:22 base
drwx------. 2 systemd-coredump input  4096  5月 16 20:24 global
drwx------. 2 systemd-coredump input     6  5月 16 20:22 pg_commit_ts
drwx------. 2 systemd-coredump input     6  5月 16 20:22 pg_dynshmem
-rw-------. 1 systemd-coredump input  4821  5月 16 20:22 pg_hba.conf
(snip)
-rw-------. 1 systemd-coredump input    88  5月 16 20:22 postgresql.auto.conf
-rw-------. 1 systemd-coredump input 29517  5月 16 20:22 postgresql.conf
-rw-------. 1 systemd-coredump input    36  5月 16 20:22 postmaster.opts
-rw-------. 1 systemd-coredump input    94  5月 16 20:22 postmaster.pid

/docker-postgres/15.7-1/data:
合計 64
-rw-------. 1 systemd-coredump input     3  5月 16 20:22 PG_VERSION
drwx------. 5 systemd-coredump input    33  5月 16 20:22 base
drwx------. 2 systemd-coredump input  4096  5月 16 20:24 global
drwx------. 2 systemd-coredump input     6  5月 16 20:22 pg_commit_ts
drwx------. 2 systemd-coredump input     6  5月 16 20:22 pg_dynshmem
-rw-------. 1 systemd-coredump input  4821  5月 16 20:22 pg_hba.conf
(snip)
-rw-------. 1 systemd-coredump input    88  5月 16 20:22 postgresql.auto.conf
-rw-------. 1 systemd-coredump input 29517  5月 16 20:22 postgresql.conf
-rw-------. 1 systemd-coredump input    36  5月 16 20:22 postmaster.opts
-rw-------. 1 systemd-coredump input    94  5月 16 20:22 postmaster.pid
#  docker exec -it postgres_15.7-1 /bin/bash
root@fbf9655439f0:/# ls -al /var/lib/postgresql/data
total 68
drwx------. 19 postgres root      4096 May 16 11:22 .
drwxr-xr-x.  1 postgres postgres    18 May 14 02:57 ..
drwx------.  5 postgres postgres    33 May 16 11:22 base
drwx------.  2 postgres postgres  4096 May 16 11:24 global
drwx------.  2 postgres postgres     6 May 16 11:22 pg_commit_ts
drwx------.  2 postgres postgres     6 May 16 11:22 pg_dynshmem
-rw-------.  1 postgres postgres  4821 May 16 11:22 pg_hba.conf
(snip)
  • ctrl p > q for detach
from the local host with psql command
# psql postgres -h 127.0.0.1 -p 5434 -U postgres
ユーザ postgres のパスワード:
psql (13.14、サーバ 15.7 (Debian 15.7-1.pgdg120+1))
警告: psql のメジャーバージョンは 13 ですが、サーバのメジャーバージョンは 15 です。
         psql の機能の中で、動作しないものがあるかもしれません。
"help"でヘルプを表示します。

postgres=# select version();
                                                       version
---------------------------------------------------------------------------------------------------------------------
 PostgreSQL 15.7 (Debian 15.7-1.pgdg120+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 12.2.0-14) 12.2.0, 64-bit
(1 行)

postgres=# \q
  • If you don't have psql command on the docker host, install psql command "dnf install postgresql" or connect from remote psql with proper hg_hba.conf.
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0