一,docker swarm 是什么html
Docker Swarm、Docker Machine与Docker Compose号称Docker三剑客
Docker Swarm 和 Docker Compose 同样,都是 Docker 官方容器编排项目,但不一样的是,Docker Compose 是一个在单个服务器或主机上建立多个容器的工具,能够将组成某个应该的多个docker容器编排在一块儿,同时管理。
而 Docker Swarm 则能够在多个服务器或主机上建立容器集群服务,其主要做用是把若干台Docker主机抽象为一个总体,而且经过一个入口(docker stack)统一管理这些Docker主机上的各类Docker资源。前端
Swarm的基本架构以下图所示,node
docker swarm init --advertise-addr 192.168.100.129
此时将本机ip“192.168.100.126”,会默认当前节点为 Leader,执行 docker info 查看linux
经过下面命令获取加入token,其余节点能够用 manager 或者 worker 的身份加入到当前集群web
docker swarm join-token [worker|manager]
须要加入的节点无需再执行“docker swarm init”初始化,直接加入节点便可spring
出错了,须要在管理管设置防火墙docker
firewall-cmd --permanent --add-port=2377/tcp # 容许某端口放行
而后执行防火墙从新加载tomcat
firewall-cmd --reload
再次在须要加入的节点上执行加入服务器
这里咱们加入2个节点,执行 docker info 查看微信
在管理端执行“docker info” 查看, 显示工3个节点
脱离集群
docker swarm leave
结果以下:
三,docker-stack.yml文件编排
Docker stack 也是一个yaml文件,和一份docker-compose.yml文件差很少,指令也基本一致。可是与compose相比其不支持build、links和network_mode。Docker stack有一个新的指令deploy。
注:stack不支持的指令
Deploy是用来指定swarm服务部署和运行时的相关配置,而且只有使用docker stack deploy 部署swarm集群时才会生效。若是使用docker-compose up 或者docker-compose run时,该选项会被忽略。要使用deploy选项,compose-file中version版本要在3或3+。
下面经过一个demo说明 deploy关键选项version: "3.4"
version: "3.4" services: demo-docker: image: ejiyuan/demo-docker ports: - 8081:8081 environment: - DF_NOTIFY_CREATE_SERVICE_URL=http://proxy:8080/v1/docker-flow-proxy/reconfigure deploy: mode: replicated replicas: 2 endpoint_mode: vip labels: com.example.description: "This label will appear on the web service" resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M restart_policy: condition: on-failure delay: 5s max_attempts: 3 window: 120s update_config: parallelism: 1 delay: 10s order: start-first visualizer: image: dockersamples/visualizer ports: - "9080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: replicas: 1 placement: constraints: [node.role == manager] portainer: image: portainer/portainer ports: - "9000:9000" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: replicas: 1 placement: constraints: [node.role == manager]
visualizer,portainer 为服务管理与监听服务,这里先不作详细介绍
1,mode :global 全局(每一个群集节点只有一个容器)replicated 副本(指定容器的数量)。默认值:replicated。
2,replicas:副本模式下每一个节点启动副本的数量
3,endpoint_mode:指定swarm服务发现的模式
4,labels:指定服务的标签。这些标签仅在服务上设置,而不在服务的任何容器上设置
5,resources:设置服务资源分配
6,restart_policy:配置在容器退出时是否并如何重启容器。取代docker-compose 中的 restart指令。
7,update_config :配置更新服务,用于无缝更新应用(rolling update)
四,docker stack相关命令
1, docker stack deploy:部署新的堆栈或更新现有堆栈
docker stack deploy [OPTIONS] STACK
参数
私有仓库须要携带"--with-registry-auth"参数,不然提示
image registry.cn-beijing.aliyuncs.com/ejiyuan/app:latest could not be accessed on a registry to record
its digest. Each node will access registry.cn-hangzhou.aliyuncs.com/ejiyuan/app:latest,
possibly leading to different nodes running different
须要先登陆到阿里私有仓
sudo docker login --username=ejiyuan@aliyun.com registry.cn-beijing.aliyuncs.com
内网地址
sudo docker login --username=ejiyuan@aliyun.com registry-vpc.cn-beijing.aliyuncs.com
执行命令开始使用 docker-stack.yml 文件部署服务堆,堆名为“test”
docker stack deploy -c docker-stack.yml test --with-registry-auth
结果以下:
2,docker stack ls:列出现有堆栈以及堆中的服务数量
docker stack ls [flags]
SERVICES 显示堆中有多少个服务
3,docker stack ps:列出堆栈中的任务
docker stack ps [OPTIONS] STACK [flags]
对应 docke run为 上图中,绿、蓝、黄分别表明上面文件中定义的三个服务
4,docker stack services :列出堆栈中的服务
docker stack services [OPTIONS] STACK [flags]
5,docker stack rm :删除一个或多个堆栈
docker stack rm STACK [STACK...] [flags]
六,服务升级
docker service upadte 命令参数详解
1,更新镜像:
docker service update --image ejiyuan/demo-docker:latest test_demo-docker
使用 portainer/portainer:latest镜像,更新 portainer_portainer服务,此方法执行前,必须将 镜像文件上传到远程仓中,程序会自动拉取远程仓中镜像文件与启动服务的镜像对比,若是没有变化不会启动更新,也不会重启服务
即便设置了update_config.order: start-first,服务会先启动在中止,可是tomcat 启动 spring 项目须要必定时间,这段时间服务是不可用的,可是服务状态是Runing的,因此,这里启用两个副本,每次更新一个,等待一个服务启动完成后,在执行另外一个更新,主要目的是为了,无缝的升级系统,具体update_config.delay设置为多少能够参考tomcat的启动时间
Tomcat started on port(s): 8081 (http) with context path '' Started DemoDockerApplication in 17.292 seconds (JVM running for 18.745)
注意:若是有多个同名images,最后一次编译的会被加tag :latest,push时 要加上
docker push registry.cn-beijing.aliyuncs.com/ejiyuan/demo-docker:latest
2,更新节点数目
docker service scale test_demo-docker=3
运行结果:
3,添加或者更新一个对外端口
docker service update -–publish-add 8090 test_demo-docker
结果以下
七,更新节点
docker node update [OPTIONS] NODE [flags]
参数:
NODE:节点名称 可使用 “docker info” 查看获得
执行下面语句查看节点详情
docker node inspect atv61b72x9qa5dpbrew2n016g
该命令只会更改角色,部分权限并无当即更新,所以执行服务操做时有可能提示该错误Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
当即生效更新节点为manger 执行
docker node promote NODE [NODE...]
七,经常使用命令
命令 | 描述 |
---|---|
docker swarm init | 初始化一个 swarm 群集 |
docker swarm join | 加入群集做为节点或管理器 |
docker swarm join-token | 管理用于加入群集的令牌 |
docker swarm leave | 离开 swarm 群集 |
docker swarm unlock | 解锁 swarm 群集 |
docker swarm unlock-key | 管理解锁钥匙 |
docker swarm update | 更新 swarm 群集 |
命令 | 描述 |
---|---|
docker node demote | 从 swarm 群集管理器中降级一个或多个节点 |
docker node inspect | 显示一个或多个节点的详细信息 |
docker node ls | 列出 swarm 群集中的节点 |
docker node promote | 将一个或多个节点推入到群集管理器中 |
docker node ps | 列出在一个或多个节点上运行的任务,默认为当前节点 |
docker node rm | 从 swarm 群集删除一个或多个节点 |
docker node update | 更新一个节点 |
命令 | 描述 |
---|---|
docker service create | 建立服务 |
docker service inspect | 显示一个或多个服务的详细信息 |
docker service logs | 获取服务的日志 |
docker service ls | 列出服务 |
docker service rm | 删除一个或多个服务 |
docker service scale | 设置服务的实例数量 |
docker service update | 更新服务 |
docker service rollback | 恢复服务至update以前的配置 |
如何滚动更新 Service?- 天天5分钟玩转 Docker 容器技术(102)
Docker 小记 — 微信斗牛棋牌源码搭建Compose & Swarm