问题
运行时$ docker stack deploy ...
,有没有办法以只有主机可以访问的方式发布端口?
我目前正在使用在 Digital-Ocean 上运行的 Ubuntu 服务器实例。
例子
假设我运行一个名为db的mysql服务。我可以从不同的容器访问数据库,而无需在我的文件中。从我的另一个容器中,我可以将db用作 mysql 主机和默认端口。这按预期工作。ports: ["3306:3306"]
docker-compose.yml
现在我想从我的主机访问数据库。据我所知,如果不发布端口,这是不可能的。当我放入ports: ["3306:3306"]
我的docker-compose.yml
文件时,我可以使用mysql -uroot -p -h 127.0.0.1
. 问题是数据库现在也可以从外部访问,我可以从任何 PC 使用 登录到数据库mysql -uroot -p -h foo.com
,这似乎是不必要的不安全。
我可以想到一些您可能需要它的其他用例:
- 使用需要由 docker 容器访问的任何数据库,也可以从 docker 之外的应用程序访问。
- 使用不在 docker 中运行的 nginx 作为在 docker中运行的应用程序的反向代理。无需将应用程序本身暴露给网络
如果这些用例可以使用其他解决方案来解决,我当然很乐意听到。
我尝试过的一些事情
- 使用防火墙阻止对端口 3306 的访问。这不起作用,因为 docker 与 ip-tables 混淆。
ports: ["127.0.0.1:3306:3306"]
在撰写文件中使用。当用户docker-compose up
. 不幸的是,这在使用 Docker 堆栈时不起作用。- 许多其他可能的解决方案都没有导致任何地方......