Docker是一个开源的基于LXC的高级容器引擎,我们可以把应用以及依赖包打包到一个镜像中,发布到支持Docker的 Linux或Windows 机器上,实现虚拟化。
服务器集群是应对用户量增长的必要方法,Docker支持用docker swarm命令来管理docker集群。Docker集群是指通过把多个docker engine聚集在一起,形成一个大的docker engine,对外提供容器的集群服务。同时这个集群对外提供Swarm API,用户可以像使用docker engine一样使用docker集群。
1.Docker Swarm介绍
Docker Swarm是Docker公司推出的用来管理docker集群的平台,可以将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为前端的访问入口,各种形式的Docker Client均可以直接与Swarm通信。
Swarm deamon只是一个调度器(Scheduler)加路由器(router),本身不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器。即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行后,会重建集群信息。
Swarm集群中有两种节点:管理节点(manager nodes)和工作节点(worker nodes)。管理节点执行集群的管理功能,维护集群的状态;工作节点接收和执行任务,并参与集群的负载调度。
Swarm的常用命令有3类:
1) 集群管理命令
docker swarm init/join/leave/update
2) 服务管理命令
docker service create/inspect/update/remove/tasks
3) 节点管理命令
docker node accept/promote/demote/inspect/update/tasks/ls/rm
2.Swarm集群搭建
准备两块安装好docker的开发板,一台作为作为manager节点,一台作为worker节点。
其中:
manager节点的ip地址是: 192.168.1.4
worker节点的ip地址是: 192.168.1.5
2.1 初始化swarm
在manager节点上初始化swarm。
jishu@Jishu:~$ sudo docker swarm init
Swarm initialized: current node (wx1rdqx8xqzc0libigcblb2rj) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-00ffwd7g2u2vawgkhl0dww0480pwwpyjsuluicbmdb6oqsbxpz-1warpp43hpe6oz5xpjtpidmdb 192.168.1.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
初始化结束后,会生成集群token,这个token是该集群的唯一标记。worker节点需要用这个集群token来加入到集群中。
2.2 添加worker节点
在worker节点上执行docker swarm join命令,加入集群。
jishu@Jishu:~$ sudo docker swarm join --token SWMTKN-1-00ffwd7g2u2vawgkhl0dww0480pwwpyjsuluicbmdb6oqsbxpz-1warpp43hpe6oz5xpjtpidmdb 192.168.1.4:2377
This node joined a swarm as a worker.
在manager节点上查看集群内的节点,可以看到有了两个节点。
jishu@Jishu:~$ sudo docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
yyhzfgpll80oshvze4j9bqntm Jishu Ready Active 19.03.8
wx1rdqx8xqzc0libigcblb2rj * Jishu Ready Active Leader 19.03.8
如果要添加其他manager节点,token与工作节点的字符串不同。需要在当前manager节点上执行以下命令:
jishu@Jishu:~$ sudo docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-00ffwd7g2u2vawgkhl0dww0480pwwpyjsuluicbmdb6oqsbxpz-dfl7zmduxxt0wh82ovitcpbsu 192.168.1.4:2377
并在新增的manager节点执行docker swarm join命令。
由于目前只有两个节点,所以不添加额外的manager节点。
2.3 创建集群服务
给集群创建nginx WEB服务,创建命令如下:
docker service create --replicas 2 -p 8053:80 --name nginx-test-2 nginx
其中:
-replicas 参数:指运行实例个数,集群中有两个节点,因此设置为2
-p参数:端口映射,将集群中节点的8053端口映射到容器内部的80端口
--name参数:集群服务的名称,设置为nginx-test-2
最后一个参数nginx是指使用的nginx镜像
jishu@Jishu:~$ sudo docker service create --replicas 2 -p 8053:80 --name nginx-test-2 nginx
0qaotc2ci19n2f6ppq7q2r3as
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service converged
创建完成后,可以用docker service ls命令查看service。
jishu@Jishu:~$ sudo docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
0qaotc2ci19n nginx-test-2 replicated 2/2 nginx:latest *:8053->80/tcp
在manager节点上查看nginx容器实例:
jishu@Jishu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c32f6bd0625f nginx:latest "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx-test-2.2.ql90wmzklbxa8woocuckmuak3
472ffc1e3996 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8052->80/tcp nginx-test-1
292df1d11d48 nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:8051->80/tcp nginx-test
可以看到新的nginx容器实例创建成功。
用浏览器访问manager节点上新建的nginx WEB服务,http://192.168.1.4:8053,成功!
在worker节点上查看nginx容器实例:
jishu@Jishu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c0e985762c1 nginx:latest "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes 80/tcp nginx-test-2.1.qi5ryylc60e99y5307akjxcwm
可以看到nginx容器实例创建成功。
用浏览器访问worke节点上的nginx WEB服务,http://192.168.1.5:8053,成功!
至此,docker swarm集群创建并配置成功。