環境
$ docker --version
Docker version 20.10.6, build 370c289
$ cat /etc/os-release | head -n 2
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
やりたいこと
Ubuntu のホスト上で Docker エンジンを動かし、さらにその上で PHP のコンテナを動作させている。
Ubuntu のホスト上で別途 PostgreSQL を動作させており、通常 127.0.0.1 のアドレスで接続できる状態である。
Docker エンジン上の PHP コンテナから、 ホストOS 上の PostgreSQL データベースに接続したい。
方法
以下の stackoverflow の回答でうまく行った。
https://stackoverflow.com/a/52591177
PostgreSQL 側の設定
pg_hba.conf で、Docker のネットワークからの接続を許可する。私の場合は 172.16.0.0/12 のサブネットだったので、 172.16.0.0/12 の範囲を広く許可した。
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 172.16.0.0/12 md5
postgresql.conf を編集し、すべてのインターフェースで接続を待ち受けるように設定した。
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
listen_addresses = '*' # what IP address(es) to listen on;
Docker 側の設定
docker0 インターフェースに指定されたアドレスを確認し、これをデータベースのホストアドレスとして指定する。
$ ip address show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:31:7f:15:4c brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
その上で、 --network=host
の引数を与えて docker run
コマンドを実行したところ、データベースへの接続が成功した。
docker run --network=host --env-file .env <container-name>