首页 > 解决方案 > Docker postgres 图像:如何限制来自主机网络的访问?

问题描述

我在自定义 docker 网络中的 docker 容器中运行 postgres 服务器,我发现我可以psql从主机访问它。

从安全角度来看,这在我看来是不可取的,因为我认为 docker 网络的目的是隔离对容器的访问。

我的想法是,我将在同一个 docker 网络中的单独容器中运行我的应用程序,并仅在应用程序容器上发布端口。这样,外部世界可以访问应用程序,但不能访问数据库。

我的问题是:为什么在没有我明确指定的情况下将 5432 端口发布到 postgres 容器上的主机,以及如何“取消发布”该端口?

一个相关的问题是:在这种情况下发布端口 5432 是一个安全问题(或者至少比不发布它更不安全) ,我错了吗?

我的容器在这里运行官方 docker postgres 映像:https ://hub.docker.com/_/postgres/

谢谢你的帮助!

编辑:这是我用来运行容器的 docker 命令:

docker run -d --restart=always --name=db.geppapp.com -e "POSTGRES_USER=<user>" -e "POSTGRES_PASSWORD=<password>" -e "POSTGRES_DB=gepp" -v "/mnt/storage/postgres-data:/var/lib/postgresql/data" --net=db postgres

编辑 2:我最初的问题并不完全正确,因为 docker 实际上并没有将端口 5432 发布到主机,而是我在连接到 postgres 时将容器的 IP 地址指定为主机,psql如下所示:

psql --host=<docker-assigned-ip> --username=<user> --dbname=gepp

因此,阻止我限制从主机访问容器的原因实际上是在主机网络上为容器分配了一个 IP 地址。

标签: postgresqldocker

解决方案


postgres 的 Dockerfile 公开了该端口 5432,但这并不意味着它使主机可以访问容器的端口。要将端口公开给主机,您必须使用 -p 标志发布一系列端口或使用 -P 标志发布所有公开的端口。但我没有在你的命令中看到这一点。

您确定您没有访问本地 postgres 而不是容器 postgres 吗?

或者您是否连接到主机网络?如果 docker 容器设置为 network_mode: 主机或主机类型,则容器中公开的任何端口也将在 docker 主机上公开,而不需要 -p 或 -P docker run 选项。


推荐阅读