无法访问在Swarm集群中运行的Docker容器

3
如果这很有趣:操作系统:WIN10(cygwin),代码使用Java编写。
我按照this的例子进行了操作。
引用: 我期望能够通过myvm1IP:80(浏览器或curl)访问运行在端口80上的容器前的服务,但某种原因它无法正常工作。或者我对服务的端口映射理解有误吗? *:8080->80/tcp 我已经拥有一个由两个节点组成的运行中的docker swarm集群。 我可以ping通两个运行中的VMs 由于存在更高版本号的问题,我已经降级了版本。使用docker inspect vmName获取有关引擎的信息。
    "Engine": {
        "EngineVersion": "18.06.1-ce",
        "Labels": {
            "provider": "hyperv"
        },

我执行了以下的 docker-compose.yml 文件:

version: "3"

services:
  web:
    image: elps/articleservice:1.1.0.4
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    ports:
      - "8080:80"
    environment:
      - MYSQL_HOST=192.168.178.82
      - MYSQL_DB=article
      - MYSQL_USER=root
      - MYSQL_PASSWORD=abcdefg
    networks:
      - webnet    

networks:
  webnet:

两个副本都成功启动,并能够连接到正在运行的本地数据库(假设我查看了日志并且一切都正常)。容器已经启动并运行。

docker ps -a 的输出结果

CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                      PORTS               NAMES
979ed7ea88b7        elps/articleservice:1.1.0.4   "java -jar articlese…"   27 minutes ago      Up 27 minutes               8080/tcp            getstartedlab_web.1.j1j41so8pz6atxqnq9fqqquk7
7684c3667025        elps/articleservice:1.1.0.4   "java -jar articlese…"   27 minutes ago      Up 27 minutes               8080/tcp            getstartedlab_web.2.r4kadvztiwgpckkuannnhcsea

docker service ls 的输出

ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
gvyi9moxtpvq        getstartedlab_web   replicated          2/2                 elps/articleservice:1.1.0.4   *:8080->80/tcp

docker-machine ls 的输出结果

NAME    ACTIVE   DRIVER   STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        hyperv   Running   tcp://192.168.178.88:2376           v18.06.1-ce
myvm2   -        hyperv   Running   tcp://192.168.178.89:2376           v18.06.1-ce

当我尝试执行curl myvmIP:80时,我收到以下响应:

无法连接到192.168.178.88端口80:连接被拒绝

我期望收到一个404错误代码,因为没有/的映射。我错了吗?

在 Docker Hub 页面(https://hub.docker.com/r/elps/articleservice)上,它说您需要运行多个容器。 - bremen_matt
您似乎已经运行了articleservice,但其他三个容器没有运行。我不知道那个镜像想要做什么。您确定它可以在其他容器未运行的情况下正常工作吗? - bremen_matt
你如何知道在Docker容器中http服务器正在运行?如果服务器正在运行,我会期望看到404错误,但是如果请求有问题,比如密码错误,那么就会出现其他错误。 - bremen_matt
例如,如果我尝试在自己计算机的IP地址上curl相同的端口,而我肯定没有运行http服务器,则会得到完全相同的错误: - bremen_matt
matt@mattpc:~$ curl 192.168.1.5:80 curl: (7) 无法连接到192.168.1.5的80端口:连接被拒绝 - bremen_matt
显示剩余3条评论
1个回答

2
好的,我简单测试了一下,把所有的端口都切换了一遍,因为我有点确定有问题。
  • 应用程序本身和容器运行在默认端口(8080)上
  • 服务器将传入的流量重定向到容器端口80(显然没有运行任何内容)的8080端口上
在服务配置(docker-compose.yml)中切换端口后,它可以正常工作。
所以工作的docker-compose.yml看起来像这样:
version: "3"

services:
  web:
    image: elps/articleservice:1.1.0.4
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    ports:
      - "80:8080"
    environment:
      - MYSQL_HOST=192.168.178.82
      - MYSQL_DB=article
      - MYSQL_USER=root
      - MYSQL_PASSWORD=abcdefg
    networks:
      - webnet    

networks:
  webnet:

因此,进入的流量将被重定向如下:

进入的流量 -> 80:服务 -> 8080:容器

(注:Service和Container为IT技术中的专业术语,不做翻译)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接