docker-swarm集群基础

1. docker swarm基础

本周做了一点运维的工作,这里总结一下。

基本概念

  • swarm

    集群工具,管理节点

  • node

    docker节点,分成manager节点与worker节点

  • service

    在node上可以运行service,每个服务可以有多个任务

  • task

    具体的任务对应着container

  • overlay网络

    docker swarm是建立在overlay网络之上的,其示意图如下:
    docker-swarm-overlay网络
    这个示例中有2个service,其中myservice有2个task,client有一个task,它们共享mynet网络,在client上执行curl命令。

    1. 在curl docker.com 与 curl myserice都会启动DNS查询
    2. docker内置的解析器拦截127.0.0.11上的DNS查询,将查询转发到docker引擎的DNS Server
    3. myserver解析为Virtual IP(VIP),该server在内部负载平衡到各个task上。
    4. docker.com在mynet中不存在,这个请求就被转发到外部默认的DNS server上。

docker安装

yum install -y yum-utils

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum install -y docker-ce docker-ce-cli containerd.io

systemctl start docker

docker集群搭建

# leaer节点上初始化
docker swarm init --advertise-addr XXX.XXX.XXX.XXX

# woker节点加入
docker swarm join --token  WokerTokenXXXXXXX LeaderIPXXX.XXX.XXX.XXX:2377

# manager节点加入
docker swarm join --token ManagerTokenXXXXXX  LeaderIPXXX.XXX.XXX.XXX:2377

# leader机器上查看加入的token
docker swarm join-token manager`及`docker swarm join-token worker

2. docker service

  • 创建service

    docker service create --name my_nginx -p 81:80 --replicas 4 nginx

  • 查看service

    docker service ls

  • 查看具体service下的task

    docker service ps my_nginx

  • 更新service

    docker service update --replicas 2 my_nginx

    docker service update --image imageXXX:1.3.1 serviceNameXXX

    update可以修改镜像、备份数等

  • 扩缩service

    docker service scale my_nginx=4

  • 关闭service

    关闭不移除的话使用--replicas = 0更好一些

    docker service update --replicas 0 my_nginx

    删除的话使用remove

    docker service rm my_nginx

  • service帮助

    docker service --help

3. docker stack

简介

docker stack是基于 docker swarm 来完成应用的部署,通过配置docker-compose.yml文件来控制deploy。这里的docker-compose.yml文件与docker compose使用的文件是通用的,主要多了deploy属性,双方差异的属性会忽略。

compose文件

  • 在compose文件中定义应用,然后通过 docker stack deploy命令完成部署和管理。

  • docker-compose.yml

    version: "3"
    services: 
    	nginx: 
    		image: nignx
    		ports: 
    			- 80:80
    		deploy:	
    			mode: replicated	# 每个node启动一个
    			replicas: 4
    			ssh-keygen -R 192.168.3.10
    	visualizer:
    		image: xxx
    		ports:
    			- "9001: 8080"
    		volumes: 
    			- "/var/run/docker.sock:/var/run/docker.sock"
    		deploy:	
    			replicas: 1
    			placement:	
    				constraints: [node.role == manager]
    
    

    yml文件中会忽略container_namebuildexpose 等属性

命令

  • docker stack deploy --with-registry-auth -c docker-compose.yml stack-demo
  • docker stack deploy --with-registry-auth -c docker-compose1.yml -c docker-compose2.yml stack-demo
  • docker stack ls
  • docker stack ps stack-demo
  • docker stack rm stack-demo

注意:

用贯了docker compose经常会用docker compose stop xxxService、docker compose up -d xxxService等针对compose文件中某个service的命令。很遗憾docker stack并没有这种设计,它不能直接针对compose文件中某个service进行操作

4. 补充

  • docker swarm service的重启,参考

    docker service update --force service_name
    
  • docker deploy时强制拉取新镜像,参考

    docker service update --force --image foobar:latest myservice
    
  • docker pull同名同tag的镜像

    docker pull –disable-content-trust=false foobar:latest 
    
  • docker镜像的判断,参考

    结论:如果两个镜像的ImageID一样,那么这两个镜像一样,不管两个镜像在同一台主机上,或者不是同一台主机上。Digest并不能保证

# 微服务 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×