我有一个在两个节点(管理者节点和工作节点)上运行的Docker Swarm。该群有两个服务。一种服务是在工作程序节点上运行的SlimerJS服务器,该服务器使用以下Dockerfile创建:
FROM evpavel/slimerjs-alpine:latest
RUN mkdir /usr/local/slimerjs-server
COPY server.js /usr/local/slimerjs-server
EXPOSE 8910
ENTRYPOINT slimerjs --headless /usr/local/slimerjs-server/server.js $(hostname -i) 8910
该脚本带有两个命令行参数:IP地址和要侦听的端口。使用$(hostname -i)
传递容器的IP地址。我使用端口8910。检查容器的日志,使用正确的IP地址和端口成功创建了服务器。但是,它不会在收到请求时记录日志。
另一个服务是在管理器节点上运行的Traefik。我已经通过访问在工作节点上运行的Apache服务器进行了测试,它似乎可以正常工作。在Traefik的仪表板上,前端规则只是我的管理者节点的IP(主机:123.456.789.100),后端有一台服务器,其容器的IP为{http://10.0.0.14:8910)。
这是我用来部署堆栈的docker-compose文件:
version: "3.2"
services:
headlessbrowser:
image: sgsmcall/webpage-layout-probing-server:0.3
deploy:
restart_policy:
condition: on-failure
placement:
constraints: [node.role == worker]
labels:
- "traefik.docker.network=comp390_webnet"
- "traefik.port=8910"
- "traefik.frontend.entryPoints http"
- "traefik.frontend.rule=Host:123.456.789.100"
ports:
- "8910"
networks:
- webnet
loadbalancer:
image: traefik
command: --docker \
--docker.swarmmode \
--docker.watch \
--web \
--loglevel=DEBUG
ports:
- 80:80
- 8080:8080
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
restart_policy:
condition: on-failure
update_config:
delay: 2s
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
driver: overlay
那是什么问题?每当我尝试通过管理器的IP(123.456.789.100)访问SlimerJS服务器时,我都会在纯文本响应中收到“错误请求”。作为独立容器运行时,我可以连接到它。我已经检查了traefik服务的日志,该服务肯定是将HTTP请求发送到SlimerJS服务器。我正在发送的HTTP请求(简单的GET请求)中没有任何内容引起我的注意。
我很困惑,有人对这个问题有任何想法吗?