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

Docker堆栈:将端口发布到主机 问题,docker,firewall,docker-swarm,docker-stack,Docker,Firewall,Docker Swarm,Docker Stack,在运行$docker stack deploy…时,是否有任何方法可以发布一个端口,使其仅可供主机访问 我正在使用一个运行在Digital Ocean的Ubuntu服务器实例 例子 假设我运行了一个名为db的mysql服务。我可以从不同的容器访问数据库,而无需在我的docker compose.yml文件中具有端口:[“3306:3306”]。从我的另一个容器中,我可以使用db作为mysql主机和默认端口。这正是我们想要的 现在我想从我的主机访问数据库。据我所知,如果不发布端口,这是不可能的。当

在运行
$docker stack deploy…
时,是否有任何方法可以发布一个端口,使其仅可供主机访问

我正在使用一个运行在Digital Ocean的Ubuntu服务器实例

例子 假设我运行了一个名为dbmysql服务。我可以从不同的容器访问数据库,而无需在我的
docker compose.yml
文件中具有
端口:[“3306:3306”]
。从我的另一个容器中,我可以使用db作为mysql主机和默认端口。这正是我们想要的

现在我想从我的主机访问数据库。据我所知,如果不发布端口,这是不可能的。当我将端口:[“3306:3306”]放入我的
docker compose.yml
文件时,我可以使用
mysql-uroot-p-h 127.0.0.1
访问数据库。问题是,现在数据库也可以从外部访问,我可以使用
mysql-uroot-p-hfoo.com
从任何PC登录数据库,这似乎是不必要的

我可以想到一些您可能需要的其他用例:

  • 使用需要docker容器访问的任何数据库,以及从docker外部的应用程序访问的数据库
  • 使用nginx(不在docker中运行)作为docker中运行的应用程序的反向代理。无需将应用程序本身暴露于web
如果这些用例可以使用其他解决方案来解决,我当然很高兴听到

我尝试过的一些事情
  • 使用防火墙阻止对端口3306的访问。这不起作用,因为docker弄乱了ip表
  • 使用撰写文件中的
    端口:[“127.0.0.1:3306:3306”]
    。当用户
    docker编写时,这将按预期工作。不幸的是,这在使用Docker堆栈时不起作用
  • 很多其他可能的解决方案都没有带来任何结果

您的主机是否在AWS或类似平台上?我现在正在Digital Ocean上托管。我想您可以发布端口,但可以通过Digital Ocean防火墙控制访问(如果它们有类似AWS安全组的功能)。我在AWS上也做了类似的事情,我们的容器发布到盒子中,但访问控制是由我们的AWS安全组完成的。这样,如果需要,我们可以从外部访问DB控制台,但应用程序仍然使用内部。