【问题标题】:No access to docker container's exposed port from host无法从主机访问 docker 容器的暴露端口
【发布时间】:2021-07-17 13:14:26
【问题描述】:

当我像这样启动 docker 容器时:

sudo docker run -p5432:5432 -d -e POSTGRES_PASSWORD=test_pass -e POSTGRES_USER=test_user -e POSTGRES_DB=test_db --name postgres postgres:12

我可以看到它是由命令sudo docker ps 启动的。但是当我尝试使用

从主机连接到容器时
psql -Utest_user -p5432 -h localhost -d test_db

它只是挂了几分钟,然后报告无法连接。

但是当我像这样添加--net host 选项时:

sudo docker run --net host -p5432:5432 -d -e POSTGRES_PASSWORD=test_pass -e POSTGRES_USER=test_user -e POSTGRES_DB=test_db --name postgres postgres:12

一切都按预期开始,我可以使用相同的 psql 命令连接到 postgresql。

我运行的其他容器也是如此,不仅是从 postgres:12 图像创建的。

我只能在设置--net host 选项时向他们发出请求。 但是我需要公开不同的端口,例如 2000:5432 以同时运行多个 postgres 容器。 我应该怎么做才能让它工作?我的机器是 Ubuntu:20,以防万一,而 docker 是昨天按照官方网站的说明安装的全新机器。

【问题讨论】:

    标签: postgresql docker containers


    【解决方案1】:

    您无法连接到数据库容器,因为默认情况下它只允许来自本地主机(同一网络中的本地计算机)的连接。

    当您启动 docker 容器时,它会成为自己的网络(通常在 172.0.0.0/某个 ip 范围内)。

    当您设置标志 -net host 时,docker 会获取您主机的 IP 地址,这就是您能够连接到数据库的原因(因为那时你们都在同一个网络上)。

    解决方案是使用 -net 主机标志,或者编辑数据库容器的配置文件以允许外部连接,不推荐。

    【讨论】:

    • 嗨,尼古拉!感谢您的回答!但恐怕情况并非如此,因为首先我设法通过端口5432上的telnet从主机连接到postgresql,除此之外我通过sudo docker exec postgres bash进入容器并查看配置文件并找到(listen_addresses = '*'在 postgresql.conf 文件中)和(host all all all md5 在 pg_hba.conf 文件中)。
    • 如果你不使用-net host,我认为有必要调整主机名,将它从localhost更改为我猜的容器名称。很抱歉,我无法向您提供有关它的更多信息,因为我没有太多使用 postgresql docker 容器的经验,我不想误导您。但是在你不使用-net host的情况下,db的主机名肯定不是localhost,因为它在你的网络上而不是在容器的网络上。
    • 别担心,我需要检查所有想法,所以还是谢谢!至于问题 - 在 docker run 命令中,我将 5432 端口从容器映射到主机上的 5432,因为我有 -p5432:5432 选项。所以我相信我可以使用localhost:5432连接到容器中的postgresql。
    最近更新 更多