docker - 无法在docker swarm节点worker中访问缩放的Webapp

标签 docker docker-swarm

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

我当前的用例是在装有Windows 7的本地笔记本电脑上。这是我遵循的步骤:

a)使用docker-machine create --driver virtualbox设置一个带有一个主节点和两个工作节点的小型3节点docker群...
所以我有3台docker机器,其IP地址为192.168.99.100-102。管理器是我在... 100节点上初始化的。 101上的worker1和102上的worker2。

b)Docker在每个节点上(主节点,worker1和worker2)使用相同的端口映射运行“简单网络”镜像,例如,使用-p 8080:80的端口映射。我能够使用该docker-machine本地的Web浏览器/ curl访问每个节点上的webapp。

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

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

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

我的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。

ps我尝试进行覆盖网络,这是我获得的成功水平:
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:~$

最佳答案

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

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:

You can rely on the routing mesh. When you publish a service port, the swarm makes the service accessible at the target port on every node, regardless of whether there is a task for the service running on that node or not. This is less complex and is the right choice for many types of services.

关于docker - 无法在docker swarm节点worker中访问缩放的Webapp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46985213/

相关文章:

docker - VueJs Docker镜像未加载到浏览器中

docker - 我可以在 IBM Power 系统上运行 docker 容器进行 x86 构建吗?

linux - 如何在私有(private)服务器上使用 docker-machine?

docker - 如何以及为什么将IS用作Docker上的容器

neo4j - 无法在 Docker Swarm 中发现其他 Neo4J 因果集群实例

Docker Swarm 和私有(private) IP

docker - 如何删除 Docker Swarm 中的所有服务

docker - 在 docker 工具箱中运行卷时出错

php - 路径在容器内不可写

Docker secret 不适用于 MYSQL_ROOT_PASSWORD_FILE