Docker swarm 不暴露端口

Pat*_*atS 5 docker docker-compose

我正在尝试在单个节点上运行 docker swarm 并且无法将 docker 应用程序端口暴露给主机。

这类似于未公开的 Docker swarm 服务端口,但我在单个节点中运行,并提供有关我的问题和研究的更多详细信息。

例如,给定以下 myapp.yml 文件:

version: "3"
services:
  app:
    image: myapp
    ports: 
      - "8123:8123"
Run Code Online (Sandbox Code Playgroud)

堆栈通过

docker stack deploy -c myapp.yml myapp

堆栈启动后,当我尝试访问端口(通过 curl)时,它失败了。例如,

curl -v http://localhost:8123/myapp

显示连接被拒绝(没有在该端口上侦听)。

代码在使用 docker run 时有效

以下命令启动映像并显示如何验证端口是否已公开。

docker run -p 8123:8123 --name myapp myapp

卷曲然后工作。

curl -v http://localhost:8123/myapp

提供在 docker 中运行的应用程序的输出。

当我docker ps 在 PORTS 部分运行输出时显示:0.0.0.0:8123:8123/tcp.

docker network inspect bridge- 显示 docker 容器已分配给桥接网络。docker 网桥网络默认与 docker run 命令一起使用。

命令docker port myapp显示:

8123/tcp -> 0.0.0.0:8123

它与docker ps PORT字段的输出相匹配。

docker stack deploy 不暴露端口

开始使用后docker stack deploy -c myapp.yml myapp,我运行docker ps命令并且只8123/tcp在输出的PORTS字段中看到。

该命令docker port myapp没有输出(表明 docker 主机没有可用的端口。

当我运行时docker network ls,我看到:

NETWORK ID       NAME            DRIVER     SCOPE
1234567890      bridge           bridge     local
9999999999      myapp_default   overlay    swarm
Run Code Online (Sandbox Code Playgroud)

所以我注意到网络myapp_default与桥接、本地处于不同的模式。我尝试使用现有的桥接网络,但是当我在堆栈/撰写文件中引用桥接网络时,我观察到网络myapp_bridge已创建。

所以我阅读了 docker 网络https://blog.alexellis.io/docker-stacks-attachable-networks/是一篇很好的文章。

到目前为止,我还没有让它工作,所以我起草了这个来寻求建议/帮助。

注意:这篇文章(日期为 2017 年 2 月)说它应该有效,但没有解决我的问题。

我想我很接近了。

资源和其他相关问题

https://docs.docker.com/v17.12/get-started/part5/ - 是 docker 堆栈技术的 docker 主要文档。但是在该页面上搜索网络显示没有任何用处。

https://blog.alexellis.io/docker-stacks-attachable-networks/ - 写得很好。

Docker swarm 服务端口未公开- 类似于我问的问题。

https://runnable.com/docker/basic-docker-networking - 撰写关于 docker 网络的文章。它在创建覆盖网络时说明以下内容(这是使用 docker stack deploy 时的默认设置)。

这些网络需要有效的键值存储服务,例如 Consul、Etcd 或 ZooKeeper。在创建网络之前,您必须安装和配置您的键值存储服务。

无法在 swarm compose yaml 文件中使用用户定义的网桥

Rya*_*der 6

成群结队

ports:
  - "8123:8123"
Run Code Online (Sandbox Code Playgroud)

将公开所有 swarm 节点上的端口,如果其他服务使用某些节点上的端口,您可能会遇到问题

您只能使用下一个 docker-compose.yml 配置在带有容器的主机上公开端口

services:
  app:
    ports:
      - target: 8123
        published: 8123
        mode: host
Run Code Online (Sandbox Code Playgroud)