はじめに
DockerでNode-REDコンテナからPostgresコンテナへ接続する際に少し沼った。
「ECONNREFUSED」が出てきて接続できなかった。
2か所ほど設定を間違っていたので、備忘録として。
状況
- Dockerで下記コンテナ間で接続を試みた
- Node-RED
- Postgres
- docker-compose.ymlを用いた立ち上げ
version: '3'
services:
postgres:
image: postgres
container_name: postgres
ports:
- '6432:5432'
volumes:
- (略)
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: *****
nodered:
image: nodered/node-red
container_name: nodered
ports:
- '2880:1880'
volumes:
- (略)
- Node-REDのノード、設定は下記の通り
- ノード: node-red-contrib-postgres-variable
- Host: localhost
- Port: 6432
- Database: postgres
- Username: postgres
- Password: *****
解消
Node-REDのノード設定が間違っていた。
Host
内部接続ではあるものの、ホストはlocalhost
ではなくpostgres
にしなければならなかった。
コンテナ間の接続は同ネットワーク内での接続ということで、IPアドレスなどを指定するのではなく、コンテナ名を指定する必要があると思われる。
たしかにlinks
のような内部接続の設定を考慮すると当然といえば当然かもしれない。
ちなみに、Postgresのコンテナ内でhostname
コマンドを実行すると、コンテナのIDが出力される。
Port
ポートの設定をポートフォワーディングで設定していた6432
に設定していたが、正しくは元の5432
を指定しなければならかった。
ポートフォワーディングはあくまで外部から接続があった場合の設定なので、同じネットワーク内にあるコンテナ間の接続では、既存のポートを設定する必要があると思われる。
そりゃそうか。
終わりに
Dockerでコンテナを立ち上げて作業しているということを忘れていると、このような現象に見舞われる気がする。
Dockerの基礎知識をもっと付けておかないと、よくわからないところで沼るなと改めて思った。
最後まで読んでいただきありがとうございます。
認識が違っている点などがあれば、ぜひご指摘ください!
(特にDockerは詳しくないので、今後誰かの助けとなるようブラッシュアップしていきたいです!)