docker swarm - 无法连接到服务

docker swarm - can't connect to service

我想学习 docker swarm,但我无法在 debian 10.1 的新 azure 实例上使用它(编辑:我也尝试过 debian 9.11)

我只将问题隔离到以下命令,这应该会在端口 9000 上给我一个简单的 nginx 欢迎页面:

docker swarm init
docker service create --name nginx -p 9000:80 nginx
curl -vvv localhost:9000

但实际上curl挂了,服务没有响应:

* Expire in 1 ms for 1 (transfer 0x5574dbd88f50)
* Expire in 1 ms for 1 (transfer 0x5574dbd88f50)
* Expire in 1 ms for 1 (transfer 0x5574dbd88f50)
*   Trying ::1...
* TCP_NODELAY set
* Expire in 149998 ms for 3 (transfer 0x5574dbd88f50)
* Expire in 200 ms for 4 (transfer 0x5574dbd88f50)
* Connected to localhost (::1) port 9000 (#0)
> GET / HTTP/1.1
> Host: localhost:9000
> User-Agent: curl/7.64.0
> Accept: */*
>

运行 nginx with docker run 在机器上工作。

运行 我的 windows 机器上的上述命令 docker 也有效。

但是一旦我使用 docker stack deploydocker service create,我就无法连接到暴露的端口。

这与 debian 有关系吗?我的设置?我错过了一些配置吗?我该怎么做才能调查这个问题?

Docker 版本为 19.03.4

使用命令docker service ls列出服务。在那里您会找到一个列,其中包含您的服务状态。如果列出来了,那就继续看看有没有错误。使用命令 docker service ps nginx 并检查列 Current state。如果一切正常,则使用命令 docker service logs -f nginx 检查 nginx 日志。告诉我们,我们可以继续提供帮助。

可能是 curl 正在使用 IPv6 而 Nginx 没有为它配置。尝试:

curl -vvv 127.0.0.1:9000

我 运行 遇到了与 docker 群的 curl 挂起的类似问题。我最初认为这是 traefik 的问题,但我也可以使用简单的 httpd 容器重现它。所以这很可能与curl选择了ipv6有关。以下是一些有效的选项

  1. 添加 -4 选项以强制卷曲 ipv4。这有所帮助,但时断时续。
  2. 正在将 net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1 添加到 sudo vi /etc/sysctl.conf 文件并通过 sudo sysctl -p 重新加载它。再次断断续续。
  3. 正在创建覆盖网络 docker network create -d overlay dcm-net 并在 docker-compose.yml 文件中将此网络标记为外部,如下所示:
networks:
  dcm-net:
    external: true

选项 3 目前效果最好。