首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用network=host与docker postgres的连接错误

使用network=host与docker postgres的连接错误
EN

Stack Overflow用户
提问于 2022-01-11 18:19:38
回答 1查看 1.7K关注 0票数 1

问题

我无法连接到一个PostgreSQL数据库(14.1/最新),在我的笔记本电脑上的对接映像运行。我试图连接到数据库,.NET EntityFrameworkCore/Npgsql运行在膝上型计算机上的另一个容器中,psql直接在笔记本上运行。

环境

  • MacOS 10.15.7
  • 码头桌面4.3.2 (72729)

重造

我像这样开始我的postgres容器。注意,由于它处于主机网络模式,所以我不发布端口。

代码语言:javascript
运行
复制
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容器的日志显示

代码语言:javascript
运行
复制
...
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

此时,我希望能够连接到数据库,但是我得到了一个错误。

代码语言:javascript
运行
复制
$ 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?
EN

回答 1

Stack Overflow用户

发布于 2022-01-11 19:12:49

我真的不能说我理解这里发生了什么,但是在尝试了一系列的标志组合之后,这就是我所期望的连接方式。

代码语言:javascript
运行
复制
docker run -d --rm -p5432:5432 --name=my-datbase -v dbdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=postgres postgres

显然,这与我前面提出的策略不同,因为它消除了--network=host param,而是发布了它的端口。

现在,正如对这个答案的注释所示,这并不一定解决另一个相关的情况,即如何从另一个容器连接到这个数据库。

为此,我必须创建一个码头网络,即

代码语言:javascript
运行
复制
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 lsdocker network inspect my-network将对其他调试类似情况的人很有用。

其中大部分可以使用docker-compose进行简化,但在我的特定情况下,这不是一个可行的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70671610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档