无法访问docker swarm节点worker中的扩展webapp

时间:2017-10-28 00:47:52

标签: docker docker-swarm

我正在尝试在Windows上测试docker-swarm,以便更好地了解群集的工作原理。我从一个简单的图像yeasy / simple-web开始,并在AWS和Azure等上测试过它。

我当前的用例是在我的本地笔记本电脑上,它有Windows 7.以下是我遵循的步骤:

a)使用docker-machine create --driver virtualbox设置一个小型3节点泊坞群,其中包含一个主节点和2个工作节点... 所以我有3台docker机器,其ip addr为192.168.99.100-102。经理是我在... 100节点上初始化的。 101上的worker1和102上的worker2。

b)Docker在每个节点(master,worker1和worker2)上使用相同的端口映射运行“simple-web”映像,例如,使用-p 8080:80的端口映射。我可以使用该docker-machine本地的Web浏览器/ curl访问每个节点上的webapp。

c)使用以下语法在swarm主节点上创建服务:

docker service create --replicas 1 --publish 8080:80 --name simple-web-svc yeasy/simple-web

该服务显示在docker service ls输出上。设置了一个副本计数,以便我尝试让容器在主节点上运行并确实发生了。我可以使用Web浏览器访问此副本。然后我继续扩展到2个副本,根据docker service ls也是成功的。但是,当我尝试使用Web浏览器访问第二个副本(ip addr 192.168.101)时,它不起作用。 (我通过在每个群集节点上执行docker ps并找出2个副本运行的位置来计算运行容器的swarm节点;同样docker service ps <service_name>以方便的方式提供此功能)< / p>

我的docker info看起来像这样:

$docker info
Containers: 21
 Running: 1
 Paused: 0
 Stopped: 20
Images: 20
Server Version: 1.12.3
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 265
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: overlay host bridge null
Swarm: active
 NodeID: d0hve121x3o122ozcegi9tmo0
 Is Manager: true
 ClusterID: 81mfgps70olf4iz8z6fmh8umf
 Managers: 1
 Nodes: 3
 Orchestration:
  Task History Retention Limit: 5
 Raft:
  Snapshot Interval: 10000
  Heartbeat Tick: 1
  Election Tick: 3
 Dispatcher:
  Heartbeat Period: 5 seconds
 CA Configuration:
  Expiry Duration: 3 months
 Node Address: 192.168.99.100
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.27-boot2docker
Operating System: Boot2Docker 1.12.3 (TCL 7.2); HEAD : 7fc7575 - Thu Oct 27 17:23:17
UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 995.8 MiB
Name: default
ID: DDYX:XPK5:2FMG:JHTX:LDMS:XFUX:WPON:XJJH:6HXZ:E7MK:4OJP:SR22
Docker Root Dir: /mnt/sda1/var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 43
 Goroutines: 149
 System Time: 2017-10-28T00:38:42.587703951Z
 EventsListeners: 1
Registry: https://index.docker.io/v1/
Labels:
 provider=virtualbox
Insecure Registries:
 127.0.0.0/8

如果需要更多/其他详细的命令输出,请告诉我。

这是一些额外的 cmd exec输出(我将副本计数增加到2,所以我不需要稍后扩展+1):

docker@default:~$ docker service create --replicas 2 --publish 8080:80 --name simple-web yeasy/simple-web
afhnoixa2vzv3ge54iaoqk2m3
docker@default:~$ docker service ls
ID            NAME        REPLICAS  IMAGE             COMMAND
afhnoixa2vzv  simple-web  2/2       yeasy/simple-web
docker@default:~$

docker@default:~$ docker node ls
ID                           HOSTNAME        STATUS  AVAILABILITY  MANAGER STATUS
4vl5qyxec60bj91o8fw5okkf0    swarm-worker-1  Ready   Active
a8u9807p0t5lquhyednsqrxih    swarm-worker-2  Ready   Active
d0hve121x3o122ozcegi9tmo0 *  default         Ready   Active        Leader

docker@default:~$ docker service ps simple-web
ID                         NAME          IMAGE             NODE            DESIRED ST
ATE  CURRENT STATE           ERROR
2kvb48m0buxc4hfzx2trii10v  simple-web.1  yeasy/simple-web  default         Running
     Running 10 minutes ago
e2c977pexnre7p99wmqz2ii1x  simple-web.2  yeasy/simple-web  swarm-worker-1  Running
     Running 10 minutes ago


docker@default:~$ docker network ls
NETWORK ID          NAME                            DRIVER              SCOPE
554c408f4141        bridge                          bridge              local

afa4c8525a33        cqrsesmsspringboot_default      bridge              local

224b86b82b0c        docker_gwbridge                 bridge              local

1fab35dc310a        host                            host                local

928etnvuhg8x        ingress                         overlay             swarm

e7afc71b2102        none                            null                local

28123e9e93a7        postgresdockercluster_cluster   bridge              local

docker@default:~$ docker network inspect ingress
[
    {
        "Name": "ingress",
        "Id": "928etnvuhg8xun0dql5ig8r2f",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.255.0.0/16",
                    "Gateway": "10.255.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "b3f07b13f2da7d20bc10af38cc161e545b6d254ef5bfc62ec4fd85ecf0aa8c4c": {
                "Name": "simple-web.1.2kvb48m0buxc4hfzx2trii10v",
                "EndpointID": "00b70edabd6f5211f1b417ea70b7118ad0cbd12e2a49d20af80715
e03096624c",
                "MacAddress": "02:42:0a:ff:00:07",
                "IPv4Address": "10.255.0.7/16",
                "IPv6Address": ""
            },
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "0fa7119756f1e76308ba419236231267e1ab6a2caf6d1593fce42e
c5c75a8e16",
                "MacAddress": "02:42:0a:ff:00:03",
                "IPv4Address": "10.255.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "256"
        },
        "Labels": {}
    }
]

以下是浏览器行为的一些屏幕截图: Request 1 Request 2

有人可以帮我调试并使其正常工作吗?

TIA。

P.S。我尝试过覆盖网络,这是我所拥有的成功水平:

docker@default:~$ docker service rm simple-web
simple-web
docker@default:~$ docker service create --replicas 1 --network myoverlaynw --publish 8080:80 --name simple-web yeasy/simple-web
0s3070f4dw8itxwxtouoe9oys
docker@default:~$ docker service ls
ID            NAME        REPLICAS  IMAGE             COMMAND
0s3070f4dw8i  simple-web  0/1       yeasy/simple-web
docker@default:~$ docker service ps simple-web
ID              NAME            IMAGE           NODE        DESIRED STATE   CURRENT STATE            ERROR
cn5rzl4as1oo7gftwhixea72n   simple-web.1        yeasy/simple-web    swarm-worker-2  Running         Running 8 seconds ago
dqq15nua3i8kgkpmlkwx2t77i       \_ simple-web.1     yeasy/simple-web    swarm-worker-1  Shutdown        Rejected 18 seconds ago  "Failed to find a load balance."
eqny9gczipwpq45jd0zhtzqov       \_ simple-web.1     yeasy/simple-web    swarm-worker-2  Shutdown        Rejected 18 seconds ago  "Failed to find a load balance."
docker@default:~$

2 个答案:

答案 0 :(得分:0)

您必须在覆盖网络中运行服务:

docker network create -d overlay my_network

如果您现在在此网络中启动3个服务,请执行以下操作:

docker service create --replicas 2 --network my_network --publish 8080:80 --name simple-web yeasy/simple-web

当所有副本都启动时,您应该能够访问端口8080上每个SWARM-IP上的Web服务。

From Docker Docs

  

您可以依赖路由网格。当您发布服务端口时,   swarm使服务可以在每个节点上的目标端口访问,   无论是否有运行该服务的任务   节点与否。这不太复杂,是许多人的正确选择   服务类型。

答案 1 :(得分:0)

当我使用不同的docker版本时,这发生在我身上。只需检查swarm worker和manager中的docker版本。我还将所有docker版本升级到18.03.1-ce。

(有时这不是你问题的答案,因为你正在使用虚拟机。我正在使用不同的服务器。)

希望这会有所帮助