我正在尝试在单个节点上运行docker swarm,并且在将docker应用程序端口暴露给主机时遇到了问题。
这与Docker swarm service port not exposed类似,但我正在单个节点上运行,并对我的问题和研究提供更多细节。
例如,给定以下myapp.yml文件:
version: "3"
services:
app:
image: myapp
ports:
- "8123:8123"
通过以下命令启动堆栈:
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。
curl -v http://localhost:8123/myapp
给出在Docker中运行的应用程序的输出。
当我运行docker ps
时,端口部分的输出显示:0.0.0.0:8123:8123/tcp
。
docker network inspect bridge
- 显示Docker容器分配给bridge网络。默认情况下,docker run命令使用Docker桥接网络。
命令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
命令,只在输出的PORTS字段中看到8123/tcp
。
命令docker port myapp
没有输出(表示docker主机上没有可用端口)。
当我运行docker network ls
时,我看到:
NETWORK ID NAME DRIVER SCOPE
1234567890 bridge bridge local
9999999999 myapp_default overlay swarm
我注意到网络myapp_default与桥接(local)模式不同。我尝试使用现有的bridge网络,但是当我在堆栈/组合文件中引用bridge网络时,我发现创建了网络myapp_bridge。
所以我阅读了Docker Networking https://blog.alexellis.io/docker-stacks-attachable-networks/的好文章。
到目前为止,我还没有让它工作,所以我写下这篇文章来寻求建议/帮助。
注意:此文章(日期为2017年2月)称它应该可以工作,但并未回答我的问题。
我认为我已经接近成功了。
资源和其他相关问题
https://docs.docker.com/v17.12/get-started/part5/ - 是Docker堆栈技术的主要文档。但在该页面上搜索网络并没有找到有用的信息。
https://blog.alexellis.io/docker-stacks-attachable-networks/ - 很好的文章。
Docker swarm service port not exposed - 类似于我正在问的问题。
https://runnable.com/docker/basic-docker-networking - Docker网络编写。当创建覆盖网络(使用docker stack deploy时默认)时,它会显示以下内容:
这些网络需要有效的键值存储服务,如Consul、Etcd或ZooKeeper。在创建网络之前,您必须安装和配置您的键值存储服务。
docker service create
命令吗? - Yamukcurl
,并且像YamacKurtulus所说的那样工作了。我还学到了docker ps
输出的是Dockerfile EXPOSE中的内容,而不是实际被映射的内容。我认为docker inspect myapp
并显示已映射的端口,但我不确定。 - PatS