【问题标题】:Can not reach docker container running in a swarm cluster无法访问在 swarm 集群中运行的 docker 容器
【发布时间】:2019-02-18 14:23:27
【问题描述】:

如果这很有趣:操作系统:WIN10 (cygwin),用Java 编写的代码。

我遵循this 的例子。

我希望使用 myvm1IP:80(浏览器 ir curl)到达在端口 80 上运行的 container 前面的 service。不知何故,这不起作用。还是我误解了服务的端口映射?

*:8080->80/tcp

我有一个由 2 个节点组成的正在运行的 docker swarm 集群。 我可以 ping 两个正在运行的虚拟机

我已经降级了版本,因为有 issues with more recent version numbers。使用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服务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 页面 (hub.docker.com/r/elps/articleservice) 上,它说您需要运行多个容器
  • 你似乎有 articleservice 运行,但不是其他 3。我不知道该图像试图做什么。你确定它应该在没有其他容器运行的情况下工作吗?
  • 要使用所有端点,您需要运行所有服务。但是可以在不运行其他服务的情况下查看至少一些内容。例如。您需要 articleservice 和 catalogservice 才能将文章添加到目录中。
  • 怎么知道http服务器运行在docker容器中?如果服务器正在运行,我预计会出现 404,但是您的请求错误,例如密码错误。
  • 例如,如果我尝试在我自己的计算机 IP 地址上卷曲同一个端口,而我肯定没有运行 http 服务器,那么我会得到完全相同的错误:

标签: windows docker docker-compose docker-swarm


【解决方案1】:

好的,所以我只是测试了切换我拥有的所有端口,因为我有点确定有什么问题。

  • 应用程序本身和容器在默认端口 (8080) 上运行
  • 服务器将端口 8080 上的传入流量重定向到容器端口 80(显然没有运行)

在服务配置 (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:Service->8080:Container

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多