理解swarm集群
一个swarm是一组运行docker服务器的的集群,docker服务器可以是物理机也可以是虚拟机.
swarm manager可以使用多种策略来运行容器.比如”emptiest node”—部署容器到压力最小的服务器上,或者”global”—确保每台服务器都只允许一个容器实例.你可以在Compose文件中指示swarm manager去选择何种策略
swarm managers是swarm进群中唯一可以执行命令,或者授权其他服务器以”workers”身份加入swarm集群的服务器.
初始化swarm,加入节点
试验环境:
1.10.0.0.50 —swarm manager
2.10.0.0.12 —worker 节点
- 初始化swarm,并且指定通告的IP
1 | [root@localhost ~]$docker swarm init --advertise-addr 10.0.0.50 |
根据上面提示,在第二台服务器上以worker身份加入swarm集群
1 | [root@php ~]$docker swarm join --token SWMTKN-1-2i5fyjf2niw81tudcvpw33yuni277vz45lt6tyi5bvcnhvuwea-bj091dpe6e69ph9kt3lmsthgp 10.0.0.50:2377 |
执行docker node ls命令可以管理和查看swarm集群的所有节点
1 | [root@localhost ~]$docker node ls |
执行docker swarm leave命令将某个节点退出swarm集群
1 | [root@php ~]$docker swarm leave |
在swarm集群部署app
现在可以把上一小节的docker compose部署在swarm集群上了.执行命令和上一小节一样.但是需要注意的是只能在swarm manager节点服务器上执行命令.
在第一台服务器上执行如下命令:(确保docker compose文件和镜像文件在这台服务器上)
1 | root@localhost ~]$cd /data/compose |
APP已经成功部署到swarm集群上,现在可以使用上一小节中的同样的命令来管理app集群,只不过这次services和容器已经部署到两台服务器上:
1 | [root@localhost compose]$docker stack ps getstartedlab |
需要在另外一台服务器上pull同样的镜像,否则容器无法启动
在第二台服务器上下载我阿里云私有仓库的镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19docker login --username=jessehuang408 registry.cn-hangzhou.aliyuncs.com
Password:
[root@php ~]$docker pull registry.cn-hangzhou.aliyuncs.com/jesse_images/jesse_images:frendlyhello-v1.0
frendlyhello-v1.0: Pulling from jesse_images/jesse_images
f7e2b70d04ae: Pull complete
1e9214730e83: Pull complete
5bd4ec081f7b: Pull complete
be26b369a1e7: Pull complete
236be9d80905: Pull complete
1bf8a3675b0b: Pull complete
5752f9477f0c: Pull complete
Digest: sha256:8e8b57ef6e22c8c04c1c80cfab9f336928cffabacaa4ae4e74ec57e54bcffdb2
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/jesse_images/jesse_images:frendlyhello-v1.0
[root@php ~]$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.cn-hangzhou.aliyuncs.com/jesse_images/jesse_images frendlyhello-v1.0 f091d1bb803c 2 days ago 131MB
[root@php ~]$*将镜像修改成和第一台服务器一样:frendlyhello:latest
命令:
1 | docker tag 镜像ID REPOSITORY:TAG |
1 | [root@php ~]$docker tag f091d1bb803c frendlyhello:latest |
- 将第一台服务器的docker-compose文件拷贝到同样的目录下
1 | [root@php ~]$mkdir /data/compose |
- 回到第一台服务器上删除刚才创建的getstartedlab
1 | [root@localhost compose]$docker stack rm getstartedlab |
- 重新部署docker compose
1 | [root@localhost compose]$docker stack deploy -c docker-compose.yml getstartedlab |
- 成功部署
1 | [root@localhost compose]$docker stack ps getstartedlab |
在第二台的worker节点上执行命令会提示失败:
1 | [root@php compose]$docker stack ps getstartedlab |
现在,在两台服务器上都能访问刚才部署的app
1 | huangyong@huangyong-Macbook-Pro ~ curl http://10.0.0.12:4000 |
扩展app
扩展app还是直接编辑docker-compose.yml文件.然后重新docker stack deploy部署即可.
如果是需要将其他虚拟机或者物理服务器加入进swarm集群,就像第二台服务器一样使用docker swarm join命令加入即可,
停止swarm
命令:
1 | docker stack rm getstartedlab |
总结
1 | # 初始化一个swarm集群 |