综上所述大家应该知道Docker就是一个容器,Docker-Compose是一个单主机的编排工具,Docker-Swarm是一个多主机的编排工具!
Docker Swarm命令
$ docker swarm init --advertise-addr 192.168.99.121
Swarm initialized: current node (bvz81updecsj6wjz393c09vti) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
172.17.0.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 加入worker
$ docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-1awxwuwd3z9j1z3puu7rcgdbx \
172.17.0.2:2377
# 加入manager
$ docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-7p73s1dx5in4tatdymyhg9hu2 \
172.17.0.2:2377
# --force / -f 强制离开
$ docker swarm leave -f
Node left the default swarm.
docker@manager:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
alz0od3rbkg552mkicfuezhkn * manager Ready Active Leader 19.03.12
jxf5u2hnurrgz90vnd9ay3y7p node-1 Ready Active 19.03.12
lldvm2slseyodo0t7ath5tzne node-2 Ready Active 19.03.12
docker service create --name redis redis:3.0.6
dmu1ept4cxcfe8k8lhtux3ro3
$ docker service create --mode global --name redis2 redis:3.0.6
a8q9dasaafudfs8q8w32udass
$ docker service ls
ID NAME MODE REPLICAS IMAGE
dmu1ept4cxcf redis replicated 1/1 redis:3.0.6
a8q9dasaafud redis2 global 1/1 redis:3.0.6
$ docker service inspect redis
$ docker service logs -f redis
$ docker service ls
ID NAME MODE REPLICAS IMAGE
c8wgl7q4ndfd frontend replicated 5/5 nginx:alpine
dmu1ept4cxcf redis replicated 3/3 redis:3.0.6
iwe3278osahj mongo global 7/7 mongo:3.3
hh08h9uu8uwr job replicated-job 1/1 (3/5 completed) nginx:latest
$ docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
0qihejybwf1x redis.1 redis:3.0.5 manager1 Running Running 8 seconds
bk658fpbex0d redis.2 redis:3.0.5 worker2 Running Running 9 seconds
5ls5s5fldaqg redis.3 redis:3.0.5 worker1 Running Running 9 seconds
$ docker service rm redis
redis
$ docker service ls
ID NAME MODE REPLICAS IMAGE
# frontend服务扩容50个节点
$ docker service scale frontend=50
frontend scaled to 50
Swarm实战演练
使用Dcoker-Machine创建3台虚拟机
1.创建三台主机
docker-machine create --driver=virtualbox manager
docker-machine create --driver=virtualbox node-1
docker-machine create --driver=virtualbox node-2
[root@docker ~]# docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
manager - virtualbox Running tcp://192.168.99.100:2376 v19.03.12
node-1 - virtualbox Running tcp://192.168.99.103:2376 v19.03.12
node-2 - virtualbox Running tcp://192.168.99.102:2376 v19.03.12
2.创建好主机后初始化Swarm manager节点
[root@docker ~]# docker-machine ssh manager
( '>')
/) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
(/-_--_-\) www.tinycorelinux.net
# --advertise-addr 改成 manager 节点ip
docker@manager:~$ docker swarm init --advertise-addr 192.168.99.100
Swarm initialized: current node (alz0od3rbkg552mkicfuezhkn) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
这样就初始化好了manager是不是很简单?
3.切换node-1、node-2加入集群
# node-1加入swarm集群、
[root@docker ~]# docker-machine ssh node-1
( '>')
/) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
(/-_--_-\) www.tinycorelinux.net
docker@node-1:~$ docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker.
#node-2加入swarm集群
[root@docker ~]# docker-machine ssh node-2
( '>')
/) TC (\ Core is distributed with ABSOLUTELY NO WARRANTY.
(/-_--_-\) www.tinycorelinux.net
docker@node-2:~$ docker swarm join --token SWMTKN-1-4mocuep5w9jhd05bww7h0rzwhd1ayd1o3i2lncwkk2cw1rv9d2-9ed4ny56zt7ygw69dok39id8w 192.168.99.100:2377
This node joined a swarm as a worker
docker@manager:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
alz0od3rbkg552mkicfuezhkn * manager Ready Active Leader 19.03.12
jxf5u2hnurrgz90vnd9ay3y7p node-1 Ready Active 19.03.12
lldvm2slseyodo0t7ath5tzne node-2 Ready Active 19.03.12
# --replicas 指定容器个例数
docker@manager:~$ docker service create --name test-nginx --publish 8080:80 --replicas=3 nginx
ya3q60llnj62w141aaekggyl2
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
docker@manager:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ya3q60llnj62 test-nginx replicated 3/3 nginx:latest *:8080->80/tcp
这时候创建好了3个nginx服务,这时候我们只要访问manager的ip:8080 则可以随机访问任意一个nginx服务,是不是类似nginx的负载均衡?
# 发送多次请求nginx服务
curl 192.168.99.100:8080
#查看日志
docker@manager:~$ docker service logs -f ya3q60llnj62
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.1.h50ridnlpsim@node-2 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.1.h50ridnlpsim@node-2 | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.1.h50ridnlpsim@node-2 | 10.0.0.2 - - [25/Mar/2021:14:59:30 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.1.h50ridnlpsim@node-2 | 10.0.0.2 - - [25/Mar/2021:14:59:33 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.3.mw75ab00bfs1@node-1 | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1 | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.3.mw75ab00bfs1@node-1 | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.3.mw75ab00bfs1@node-1 | 10.0.0.2 - - [25/Mar/2021:14:59:28 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1 | 10.0.0.2 - - [25/Mar/2021:14:59:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.3.mw75ab00bfs1@node-1 | 10.0.0.2 - - [25/Mar/2021:14:59:34 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
test-nginx.2.drsv2s4cnf9y@manager | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager | 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
test-nginx.2.drsv2s4cnf9y@manager | /docker-entrypoint.sh: Configuration complete; ready for start up
test-nginx.2.drsv2s4cnf9y@manager | 10.0.0.2 - - [25/Mar/2021:14:59:29 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
test-nginx.2.drsv2s4cnf9y@manager | 10.0.0.2 - - [25/Mar/2021:14:59:32 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
至此所有请求负载到后端3个nginx服务上。