Docker堆栈:将端口发布到主机

这个问题

当运行$ docker stack deploy ... ,是否有任何方法发布一个只能被主机访问的端口?

我正在使用在Digital-Ocean上运行的Ubuntu服务器实例。

假设我运行一个名为dbmysql服务。 我可以从不同的容器访问数据库, 而不需要在我docker-compose.yml文件中有ports: ["3306:3306"] 。 从我的其他容器,我可以使用数据库作为MySQL主机和默认端口。 这按预期工作。

现在我想从我的主机访问数据库。 据我所知,这是不可能发布一个端口。 当我把ports: ["3306:3306"]放在我docker-compose.yml文件中时,我可以使用mysql -uroot -p -h 127.0.0.1访问数据库。 问题是,数据库现在可以从外部访问,我可以使用mysql -uroot -p -h foo.com从任何PClogin到数据库,这似乎是不必要的不​​安全。

我可以想一些其他的用例,你可能需要这样做:

  • 使用任何需要由泊坞窗容器访问的数据库, 也可以从泊坞外的应用程序访问。
  • 使用nginx,不在docker中运行,作为在docker中运行的应用程序的反向代理。 没有暴露的应用程序本身的networking

如果这些用例可以使用其他解决scheme解决,我当然很高兴听到。

我试过的一些东西

  • 使用防火墙阻止对端口3306的访问。这不起作用,因为docker工人使用IP表。
  • 在撰写文件中使用ports: ["127.0.0.1:3306:3306"] 。 当用户docker-compose up时,这可以按照预期docker-compose up 。 不幸的是,这在使用Docker堆栈时不起作用。
  • 许多其他可能的解决scheme并没有带领任何地方…