在Ubuntu 20.04上从Docker Swarm拒绝连接

时间:2020-06-14 15:15:47

标签: docker ubuntu networking swarm

下面更新!

我对Ubuntu 20.04上的Docker swarm感到困惑。我在Scaleway上创建了一个干净的Ubuntu计算机,基本上遵循了https://dockerswarm.rocks/中的教程。我很快也找到了本教程,它更简短,更简洁:https://blog.creekorful.com/2019/10/how-to-install-traefik-2-docker-swarm/

基本上(全部通过SSH进入计算机):

  • 已安装Docker
  • 使用# docker swarm init --advertise-addr=x.x.x.x初始化了一个Swarm,我在其中使用了服务器的远程IP地址。
  • 然后我创建了一个覆盖网络# docker network create --driver=overlay my-net
  • 我启动了一个简单的hello world容器:
version: '3'
services:
  helloworld:
    image: tutum/hello-world:latest
    ports:
            - 80:80
    networks:
     - my-net
networks:
    my-net:
       external: true

# docker stack deploy -c helloworld.yml helloworld

  • 从这一刻起,我认为我应该能够# curl 127.0.0.1并获得自己的问候。但是,我得到一个连接被拒绝: curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused

我尝试过/检查过的事情

docker服务ls的输出

root@www2:~# docker service ls
ID                  NAME                    MODE                REPLICAS            IMAGE                      PORTS
md1bd2ydswo8        helloworld_helloworld   replicated          1/1                 tutum/hello-world:latest   *:80->80/tcp

docker ps的输出

root@www2:~# docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS               NAMES
7c2d9d7379c5        tutum/hello-world:latest   "/bin/sh -c 'php-fpm…"   About a minute ago   Up About a minute   80/tcp              helloworld_helloworld.1.7u99ox2ea6bylb5by8vdca0pt

在ubuntu上启用UFW

UFW默认情况下处于禁用状态,但我也尝试启用它。这是# ufw status

的输出
root@www2:~# ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere                  
2376/tcp                   ALLOW       Anywhere                  
2377/tcp                   ALLOW       Anywhere                  
7946/tcp                   ALLOW       Anywhere                  
7946/udp                   ALLOW       Anywhere                  
4789/udp                   ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
22/tcp (v6)                ALLOW       Anywhere (v6)             
2376/tcp (v6)              ALLOW       Anywhere (v6)             
2377/tcp (v6)              ALLOW       Anywhere (v6)             
7946/tcp (v6)              ALLOW       Anywhere (v6)             
7946/udp (v6)              ALLOW       Anywhere (v6)             
4789/udp (v6)              ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)

纠缠IP地址

我还尝试了卷曲到公共IP和私有IP,以及将私有IP用作advertise-addr。我还尝试通过IP和域名从笔记本电脑卷曲到远程服务器。但是全部无济于事...

在Arch Linux上尝试

我在笔记本电脑上运行Arch Linux,并尝试在笔记本电脑上进行本地操作,这没有任何问题。

非常欢迎任何想法,谢谢!

更新

由于我几乎迷失了它,我决定启动另一个VPS,这次是清理Ubuntu 18.04(而不是20.04),它可以立即工作,没有任何问题.....

2 个答案:

答案 0 :(得分:1)

几天来我一直在关注这个问题。在 IBM Cloud 上的全新 Ubuntu 20.04 映像上,无法从 Docker Swarm 服务公开端口。

我最终在来自 sudo journalctl -u docker.service

的日志中发现了这条消息
level=error msg="Could not get ipvs family information from the kernel. It is possible that ipvs is not enabled in your kernel. Native loadbalancing will not work until this is fixed."

通过将 ipvsadmsudo apt-get install ipvsadm 一起安装,然后运行 ​​sudo ipvasdm,它会返回类似的消息,确认了这一点。

我切换回 18.04 而不是 faff 试图重建内核,但毫无疑问,如果您如此倾向,这是可能的。

答案 1 :(得分:0)

只有我的2美分。我有类似的行为,但这是由于容器未正确启动,因为我的卷绑定安装的基础文件系统存在问题。

为确保您不会出现这种情况,只需从本地卷开始堆栈即可。

此外,请确保数据包很好地到达了群集节点。您可以使用iptables命令的组合进行检查,例如:

iptables -Z #to Zero all counters
iptables -v -L #to list rules & packet counts
iptables -v -t nat -L #to also check in the NAT table. The NAT table is probably the most relevant here, since I guess the first rules applied are in the prerouting section in NAT table.

此致