问题
我无法连接到一个PostgreSQL数据库(14.1/最新),在我的笔记本电脑上的对接映像运行。我试图连接到数据库,.NET EntityFrameworkCore/Npgsql运行在膝上型计算机上的另一个容器中,psql
直接在笔记本上运行。
环境
重造
我像这样开始我的postgres容器。注意,由于它处于主机网络模式,所以我不发布端口。
docker run -d --network=host --name=my-database -v dbdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres postgres
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
18e154fe815c postgres "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 5432/tcp my-database
来自my-database
容器的日志显示
...
2022-01-11 16:56:18.179 UTC [1] LOG: starting PostgreSQL 14.1 (Debian 14.1-1.pgdg110+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
2022-01-11 16:56:18.179 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
2022-01-11 16:56:18.179 UTC [1] LOG: listening on IPv6 address "::", port 5432
2022-01-11 16:56:18.182 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2022-01-11 16:56:18.188 UTC [26] LOG: database system was shut down at 2022-01-11 16:35:54 UTC
2022-01-11 16:56:18.203 UTC [1] LOG: database system is ready to accept connections
此时,我希望能够连接到数据库,但是我得到了一个错误。
$ psql -h localhost -p 5432 -U postgres
psql: error: connection to server at "localhost" (::1), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
发布于 2022-01-11 19:12:49
我真的不能说我理解这里发生了什么,但是在尝试了一系列的标志组合之后,这就是我所期望的连接方式。
docker run -d --rm -p5432:5432 --name=my-datbase -v dbdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres postgres
显然,这与我前面提出的策略不同,因为它消除了--network=host
param,而是发布了它的端口。
现在,正如对这个答案的注释所示,这并不一定解决另一个相关的情况,即如何从另一个容器连接到这个数据库。
为此,我必须创建一个码头网络,即
docker network create my-network
并将标志--network=my-network
添加到每个容器:my-database
容器和需要连接到数据库的应用程序容器。现在,这两个容器都在同一个虚拟网络上。
最后,我可以从应用程序容器中运行(例如) psql -h my-database -p 5432 -U postgres
。主机名是码头容器的名称,即docker run --name=my-database ...
也就是说,这两个容器必须位于同一个docker
网络上。看起来,与我最初的直觉相反,默认的bridge
网络并不是这样工作的,所以需要一个定制的网络。
docker network ls
和docker network inspect my-network
将对其他调试类似情况的人很有用。
其中大部分可以使用docker-compose
进行简化,但在我的特定情况下,这不是一个可行的选择。
https://stackoverflow.com/questions/70671610
复制相似问题