我刚刚完成了docker文档,并在aws(http://13.127.150.218,http://13.235.134.73)上创建了两个实例。第一个是经理,第二个是工人。以下是我用来部署的组合文件
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
此处,redis服务具有将其限制为仅在管理器节点上运行的约束。现在,我的问题是,如何在工作实例上使用Web服务来使用Redis服务。
答案 0 :(得分:3)
您需要在所有容器中使用hostname参数,以便您可以使用此值从worker访问服务或从worker访问manager上的服务。
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: username/repo:tag
hostname: "web"
deploy:
replicas: 5
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
ports:
- "80:80"
networks:
- webnet
visualizer:
image: dockersamples/visualizer:stable
hostname: "visualizer"
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
redis:
image: redis
hostname: "redis"
ports:
- "6379:6379"
volumes:
- "/home/docker/data:/data"
deploy:
placement:
constraints: [node.role == manager]
command: redis-server --appendonly yes
networks:
- webnet
networks:
webnet:
令人上瘾的是,如果使用portainer而不是可视化工具,则可以使用更多选项来控制SWARM堆栈:
https://hub.docker.com/r/portainer/portainer
BR,
卡洛斯
答案 1 :(得分:2)
不管管理员放置在何处,所有在同一网络上的堆栈文件中的服务都可以使用嵌入式DNS功能,该功能有助于按定义的服务名称解析每个服务。
在这种情况下,服务web
通过服务名称使用服务redis
。
以下是ping命令的示例,该命令能够从与Redis服务关联的容器内解析服务web
-
详细了解Swarm Native Service Discovery,以了解这一点。