背景:
原来的项目是使用DockerSwarm技术进行搭建的,虽然现在都是使用Kubernetes技术进行集群的搭建,但技术本身没有过时之分只有适不适合你的应用场景。本篇文章记录了搭建DockerSwarm集群的流程和使用的命令等,有3台Centos,myhost1作为manager节点,另外两台myhost2、myhost3作为worker节点。
1. Linux
①设置主机名
#hostnamectl set-hostname myhost1
#hostnamectl set-hostname myhost2
#hostnamectl set-hostname myhost3
然后进行安装docker(略)
②配置Docker开机启动:
#systemctl enable docker
③启动Docker:
#systemctl start docker
2. Docker
①在myhost1上执行集群初始化命令
#docker swarm init
②然后复制第一步显示的命令:
#docker swarm join --token SWMTKN-1-xxxxx ip:2377
③添加worker节点到Swarm集群中:
在另外两台机器上myhost2、myhost3上执行:
#docker swarm join --token SWMTKN-1-xxxxx ip:2377
④查看集群中的节点:
# docker node ls
⑤查询节点信息
# docker node inspect HOSTNAME
其中HOSTNAME为节点名称,就可以查询到节点的信息。
当然docker node命令还有许多子命令功能,例如:
demote/promote/ps/rm/update,在命令行中可以输入
# docker node 来查看帮助文档来进行操作。
⑥给不同的节点打上标签,用于将任务分配
# docker node update --label-add app=slave1 myhost2
# docker node update --label-add app=slave2 myhost3
⑦在manager机器上查询某个节点的标签信息
# docker node inspect HOSTNAME | grep app
就可以查看到HOSTNAME这个节点的标签信息。
打标签的目的:是用于后续部署stack时,按照各主机的标签将不同的组件分配到不同的主机上运行。
关于docker node命令还有promote、demote、update、rm命令
⑧如果未来有第4台机器,如何将第4台机器加入集群中,myhost4
在myhost1的manger主机上查看添加worker的token :
#docker swarm join-token worker
复制相应的命令,然后粘贴到myhost4主机上进行执行即可加入到集群中。
3. DockerSwarm
范围由大到小: stack-> service -> task -> container
①编写yml文件
例如: Docker-compose-atlassian.yml
②在manager节点上部署应用组件:
#docker stack deploy -c Docker-compose-atlassian.yml atlassian
③查看集群中的stack列表:
# docker stack ls
④查看这个stack中的所有服务:
#docker stack services STACK_NAME
显示出的id为serviceID
其余还包括ps和rm子命令,ps用于列出某个stack中的task,其中id为taskID,其中taskID是容器names的一部分。
而rm用于移除某个stack,从而停止整个stack中的所有服务。
# docker stack rm STACK_NAME
但是不会删除在磁盘上的volume,并且重新启动也没有问题
⑤查看所有的服务的列表和具体的服务中的任务task信息:
#docker service ls
#docker service ps SERVICENAME
其中SERVICENAME为你的服务名称,可以列出当前的服务中的任务taskID,并且可以看到详细信息里面标识了这个服务具体在哪台主机NODE上
⑥查看具体服务的信息
# docker service inspect SERVICENAME
⑦删除一些服务:
# docker service rm SERVICENAME
如果是一个stack里面包含多个服务,那么这个命令只删除SERVICENAME服务,而不删除其他服务。
剩余的是 rollback、scale、update等命令,是回滚、扩展和更新的命令。
不要使用docker stop CONTAINER_ID来停止服务,因为这种方式只是停止了这个容器的运行,而并不会停止服务,是因为在部署时进行了restart_policy的设置