Docker

Dockerコンテナ内PostgreSQLをIPアドレス指定で起動させる

IPアドレス指定でアクセスできるようにPostgreSQLをコンテナ実行
docker run --name pos153ip `
  -p 192.168.3.5:5432:5432 `
  -e POSTGRES_PASSWORD=pospass `
  -d `
  -v D:\docker\post153ip\pgdata:/var/lib/postgresql/data `
  postgres:15.3
オプション解説
  • –p <ホストのIPアドレス>:5432:5432 でホストのポートとコンテナ内ポートをマッピング
  • -e オプション は環境変数を設定するもの。管理ユーザのパスワードを環境変数へセットしています。(管理ユーザ名、データベース名なども指定できますがここでは省略しているのでデフォルトのpostgresユーザ、postgresデータベースとなります)
  • -d オプション(–detachと同じ)はバックグランドで動作させるためのものです。もし上記の例で指定しなかった場合、PostgreSQL立ち上げ時のログがコマンド実行コンソールに出力され続けます。PostgreSQLやMySQLなどを動作させるには実質必須オプションかと感じます。
  • –v はではボリュームまたはバインドマウントを指定します。何れもPostgreSQLのデータを永続化するためのものです。上記の例ではバインドマウントを指定しています。(PostgreSQLを利用する場合各種設定ファイルを編集する事が多くあるのですが、ボリューム方式だとコンテナに直接入って(bash等でviを利用する事になる)編集する事になるのですが、PostgreSQLのコンテナではviなどが入っていないらしく実質直接変更できないためです。 )
実行例(powershellで動作させています)
docker >> docker run --name pos153ip `
>>   -p 192.168.3.5:5432:5432 `
>>   -e POSTGRES_PASSWORD=pospass `
>>   -d `
>>   -v D:\docker\post153ip\pgdata:/var/lib/postgresql/data `
>>   postgres:15.3
cfaf601af9ebd8d81a7042daa38e578b16722536721d8fd29d91a3e50d6bb954
docker >>
--
-- 実行しているか確認
--
docker >> docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                        NAMES
cfaf601af9eb   postgres:15.3   "docker-entrypoint.s…"   9 minutes ago   Up 9 minutes   192.168.3.5:5432->5432/tcp   pos153ip
docker >>


--
-- ボリュームを確認
-- 
docker >> docker volume ls
DRIVER    VOLUME NAME
local     5e6224a4fdff6cdb48d8427f8fbb54e8c8b80d1e29ece9a768c890707d73a207
local     c3890a09f898be5532f1f554aaa7d62c4baa33a40107890039ddbd560d14559a
local     mypostgresdata
local     postgresdb
docker >>
--
-- docker volume ls ってちょっと物足りないですよね、、
-- こんな時は 「docker container inspect」を使います。
--
docker >> docker container inspect pos153ip | ConvertFrom-Json | Select-Object -ExpandProperty Mounts

Type        : bind
Source      : D:\docker\post153ip\pgdata
Destination : /var/lib/postgresql/data
Mode        :
RW          : True
Propagation : rprivate


docker >>

--
-- docker container inspect で今度はネットワークを
-- 確認してみます。
-- コンテナ内は別セグメントのネットワークが構築されているようです。
-- ホストコンピュータとはNAT接続になっているのでしょう。
--
docker >> docker container inspect pos153ip | ConvertFrom-Json | Select-Object -ExpandProperty NetworkSettings

Bridge                 :
SandboxID              : 57d05cfb267e0616e8a879c090f5855f57f0fc36db8e8e0c494482935d692db4
HairpinMode            : False
LinkLocalIPv6Address   :
LinkLocalIPv6PrefixLen : 0
Ports                  : @{5432/tcp=System.Object[]}
SandboxKey             : /var/run/docker/netns/57d05cfb267e
SecondaryIPAddresses   :
SecondaryIPv6Addresses :
EndpointID             : 6c926c30e97db23a7d6f3e7680714ad1e351455a1aadc08287d7dd53f76865c1
Gateway                : 172.19.0.1
GlobalIPv6Address      :
GlobalIPv6PrefixLen    : 0
IPAddress              : 172.19.0.2
IPPrefixLen            : 24
IPv6Gateway            :
MacAddress             : 02:42:ac:13:00:02
Networks               : @{bridge=}


docker >>
--
-- 以下の通りIPアドレス指定でPostgreSQLへ接続する事ができました。
-- ※当方のpsqlのバージョンが古く警告でていますが、、そこは気にせずww
--
post153ip >>
post153ip >> psql -h 192.168.3.5 -p 5432 -d postgres -U postgres
ユーザー postgres のパスワード:
psql (14.7、サーバー 15.3 (Debian 15.3-1.pgdg120+1))
警告: psql のメジャーバージョンは 14 ですが、サーバーのメジャーバージョンは 15 です。
         psql の機能の中で、動作しないものがあるかもしれません。
"help"でヘルプを表示します。

postgres=#
-- inet_server_addr()とinet_client_addr()を使ってサーバ側と
-- クライアント側のIPを確認してみます
-- docker container inspectで確認した通りのIPが確認できました。
--
postgres=# select 'inet_server_addr' as item_name,cast(inet_server_addr() as text) as item_value
postgres-# union select 'inet_client_addr' as item_name,cast(inet_client_addr() as text) as item_value
postgres-# order by 1;
    item_name     |  item_value
------------------+---------------
 inet_client_addr | 172.19.0.1/32
 inet_server_addr | 172.19.0.2/32
(2 行)


postgres=#
-- 一度 docker runするとコンテナまではできているので、次からはコンテナの起動、停止
-- の運用で大丈夫です。
--
docker >> docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                        NAMES
cfaf601af9eb   postgres:15.3   "docker-entrypoint.s…"   14 minutes ago   Up 14 minutes   192.168.3.5:5432->5432/tcp   pos153ip
docker >>

--
-- コンテナを停止
--
docker >> docker container stop  pos153ip
pos153ip
docker >> docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
docker >> docker container start pos153ip

--
-- コンテナ起動
-- 
docker >> docker container start pos153ip
pos153ip
docker >> docker ps
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS         PORTS                        NAMES
cfaf601af9eb   postgres:15.3   "docker-entrypoint.s…"   14 minutes ago   Up 6 seconds   192.168.3.5:5432->5432/tcp   pos153ip
docker >> docker ps
スポンサーリンク
コピペで使う