従来の docker では、コンテナに IP アドレスが 172.xxx.xxx.xxx のように割り当てられていた。 このアドレスは下記で取得可能。

docker inspect -f '{{ .NetworkSettings.IPAddress }}' コンテナID

コンテナ内でポートを開いた時、とくに何もせずとも 172.xxx.xxx.xxx のポート5432をアクセスすればよい。

しかしルートレスコンテナの場合、IPアドレスが付与されない。

通信するには、明示的に-pオプションを使ってコンテナのポートをホストに公開するのが簡単である。

podman run --name=pg --rm -it \
  -e POSTGRES_PASSWORD=mysecretpassword \
  -p 5432:5432 \
  docker.io/library/postgres:alpine

このときホスト側から 127.0.0.1:5432 にアクセスしてコンテナ内のサーバにアクセスができる。

psql -h 127.0.0.1 -U postgres -p 5432 postgres

コンテナどおしで通信する場合は、単一ポッドに入れる方法と、ポートマッピングを駆使する方法がある。 簡単なのは通信する必要があるコンテナを単一ポッドに入れてしまう方法だ。

podman run --name=pg --rm -it \
  -e POSTGRES_PASSWORD=mysecretpassword \
  --pod new:mypod \
  docker.io/library/postgres:alpine

同様に

podman run --name=psql --rm -it \
  --pod mypod \
  docker.io/library/postgres:alpine \
  psql -h pg -U postgres

こうすると同一のポッドmypod内にある2つのコンテナは自然にアクセスできる。 この例では、片方のコンテナから 127.0.0.1 の 5432 ポートを叩くと自然にもう片方のコンテナのサーバにアクセスできる。

さらに、ポートをホストに公開するには、一旦podman pod createを実行して、ここで-pオプションを使ってコンテナのポートをホストに公開する必要がある。

podman pod create mypod -p 5432:5432
podman run --name=pg --rm -it
  -e POSTGRES_PASSWORD=mysecretpassword \
  --pod mypod \
  docker.io/library/postgres:alpine

参考文献