我正在尝试在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": {}
}
]
以下是浏览器行为的一些屏幕截图:
有人可以帮我调试并使其正常工作吗?
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/