我正在尝试在单个节点上运行docker swarm,并且无法使docker app端口暴露给主机。
这类似于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 -p 8123:8123 --name myapp myapp
然后卷曲。
curl -v http://localhost:8123/myapp
提供在docker中运行的应用的输出。
当我运行docker ps
时,“端口”部分的输出将显示:0.0.0.0:8123:8123/tcp
。
docker network inspect bridge
-显示docker容器已分配给 bridge 网络。默认情况下,docker bridge网络与docker run命令一起使用。
命令docker port myapp
显示:
8123/tcp -> 0.0.0.0:8123
与docker ps
PORT 字段的输出相匹配。
开始使用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 与本地网桥的模式不同。我尝试使用现有的 bridge 网络,但是当我在堆栈/撰写文件中引用 bridge 网络时,我发现创建了网络 myapp_bridge 。
所以我读过docker网络https://blog.alexellis.io/docker-stacks-attachable-networks/是一篇不错的文章。
到目前为止,我还没有开始工作,所以我起草了该文件以寻求建议/帮助。
注意:This aricle (dated Feb 2017)说应该可以,但是不能解决我的问题。
我想我要走了。
https://docs.docker.com/v17.12/get-started/part5/-是有关docker stack技术的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时的默认设置)。
这些网络需要有效的键值存储服务,例如 领事,Etcd或ZooKeeper。您必须安装并配置您的 键值存储服务,然后再创建网络。
答案 0 :(得分:3)
群居
ports:
- "8123:8123"
将在所有群集节点上公开端口,如果其他服务在某些节点上使用端口,则可能会出现问题
您只能使用下一个docker-compose.yml配置
在带有容器的主机上公开端口services:
app:
ports:
- target: 8123
published: 8123
mode: host
答案 1 :(得分:1)
您应该为您的服务定义一个网络。在Docker Swarm模式下,docker容器变为“ Service”,要访问其端口,请调用Service的名称 我为您提供了一个docker-compose文件的示例,该示例介绍了如何连接nginx和php-fpm
version: '3.2'
services:
nginx:
image: nginx
links:
- php
- mariadb:mysql
ports:
- "8880:80"
networks:
- frontend
deploy:
#mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
php:
image: php
deploy:
#mode: replicated
replicas: 1
placement:
constraints: [node.role == manager]
#endpoint_mode: dnsrr
links:
- mariadb:mysql
mariadb:
image: mariadb:10.4.1
#restart: always
deploy:
mode: replicated
replicas: 1
#placement:
#constraints: [node.role == manage]
environment:
MYSQL_ROOT_PASSWORD: SECRET
volumes:
- type: volume
source: mydatabase
target: /var/lib/mysql/data
volume:
nocopy: true # do not copy data from container when a volume is created?
networks:
frontend
volumes:
mydatabase:
部署(docker stack deploy -c docker-compose.yaml)
之后,以查看服务列表:
docker service ls
要公会nginx如何访问您的php-fpm后端,请编辑您的nginx配置文件:
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass **NAME_OF_PHP_SERVICE_IN SWARM**:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
您没有将容器的IP地址(IP:9000)放入Swarm集群中,而是将php服务的名称放入了