目录

搭建Swarm环境

swarm基本操作

swarm实战

docker swarm服务发布模式

docker stack


官网:https://docs.docker.com/swarm/overview/

Docker Swarm is native clustering for Docker. It turns a pool of Docker hosts into a single, virtual Docker host.

Swarm 是 Docker 官方提供的集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

一个 Swarm由一个或多个可以互相通信的Docker 节点组成.
节点会被分为两类,Manager节点和Worker节点。
Manager负责控制集群,监控集群状态、分发任务至worker节点等操作;Worker节点则接收来自Master节点的任务并在其上执行
相当于Manager是包工头,Worker是底层实际干活的工人。

搭建Swarm环境

这里使用的docker在线环境 https://labs.play-with-docker.com/

(1)准备3台centos7机器
    192.168.0.31 (Manager)
    192.168.0.32 (Worker01)
    192.168.0.33 (Worker02)
(2)初始化Manager节点
    docker swarm init --advertise-addr=192.168.0.31
(3)将worker节点加入到集群里

docker swarm join --token SWMTKN-1-5rxv93eb0hg3mzxze2lukaye7rkqm5uvlyk30n2lk9h2z36j2t-650nf075oarceftbefx6palr2 192.168.0.31:2377


查看集群状态


(4)node类型的转换

#可以将worker提升成Manager节点,从而保证swarm的高可用
docker node promote node2
docker node promote node1#降级可以用demote
docker node demote node2

swarm基本操作

Service是自 Docker 1.12 后新引入的概念,仅适用于 docker swarm

Service配置的属性和docker的容器属性基本一致,比如容器名、端口映射、network和image. Servcie可以简单理解为一组相同的容器副本

(1)创建一个tomcat的service
    docker service create --name my-tomcat tomcat
(2)查看当前swarm的service
    docker service ls
(3)查看service的启动日志
    docker service logs my-tomcat
(4)查看service的详情
    docker service inspect my-tomcat
(5)查看my-tomcat运行在哪个node上
   docker service ps my-tomcat

(6)水平扩展service
docker service scale my-tomcat=3
docker service ls
docker service ps my-tomcat

(7)如果停掉一个node的container,service会自动帮我们维护容器副本,创建一个新的容器

(8)删除service
  docker service rm my-tomcat

swarm实战

单机docker中使用bridge网络进行连接通信,多机中使用的是overlay网络

1)在manager节点创建一个overlay网络,用于docker swarm中多机通信
   docker network create -d overlay my-overlay-net
   docker network ls

(2)创建mysql和wordpress的service(Manager node)

docker service create --name mysql --mount type=volume,source=v1,destination=/var/lib/mysql -e MYSQL_ROOT_PASSWORD=examplepass -e MYSQL_DATABASE=db_wordpress --network my-overlay-net mysql:5.6docker service create --name wordpress -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=examplepass -e WORDPRESS_DB_HOST=mysql:3306 -e WORDPRESS_DB_NAME=db_wordpress -p 8080:80 --network my-overlay-net wordpress

运行成功
        
通过各个node的ip:8080都能访问成功(这里我通过play-with-docker open port访问8080端口)

这里的wordpress连接mysql是通过服务名mysql来连接的,说明其中一定有dns解析,会根据serviceName查找到对应的ip,进行连接,这样在部署(扩容)的时候就无需关心容器的ip怎么变化

For most situations, you should connect to the service name, which is load-balanced and handled by all containers (“tasks”) backing the service .

docker swarm服务发布模式

Docker Swarm 支持两种服务发布模式:Ingress模式(默认),Host模式。
通过 Ingress 模式发布的服务,可以保证从 Swarm 集群内任一节点(即使没有运行服务的节点)都能访问该服务;以 Host 模式发布的服务只能通过运行服务副本的节点来访问。下图展示了两种模式的区别。

想要进一步了解ingress和服务发现的底层可以阅读以下文章:
https://www.jianshu.com/p/c83a9173459f
https://www.cnblogs.com/zonehoo/p/11401930.html

(1)单机部署一个tomcat service,各个集群node都可以访问到

[node3] (local) root@192.168.0.61 ~
$ docker service create --name tomcat  -p 8080:8080 --network my-overlay-net tomcat
fywyxuvpbpurt3ha0pkq4wwyu
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged
[node3] (local) root@192.168.0.61 ~
$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
fywyxuvpbpur        tomcat              replicated          1/1                 tomcat:latest       *:8080->8080/tcp
$ docker service ps tomcat
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8pjqve65ebww        tomcat.1            tomcat:latest       node1               Running             Running 40 seconds ago         #该tomcat容器实际部署再node1上,container为4fa7
[node1] (local) root@192.168.0.63 ~
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
4fa7f6681778        tomcat:latest       "catalina.sh run"   5 minutes ago       Up 5 minutes        8080/tcp            tomcat.1.8pjqve65ebwwi3adp53eb3xbg

其他node节点都能通过访问本地的8080端口访问到该tomcat

(2)部署多副本的whoami service,可以通过serviceName进行负载均衡

[node3] (local) root@192.168.0.61 ~
$ docker service create --name whoami -p 8000:8000 --network my-overlay-net -d  jwilder/whoami
k1d6tus51sirz9xd4elgz2xvm
[node3] (local) root@192.168.0.61 ~
$ docker service ps whoami
ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
8kaudc0xvpdm        whoami.1            jwilder/whoami:latest   node3               Running             Running 10 seconds ago
[node3] (local) root@192.168.0.61 ~
$ docker ps
CONTAINER ID        IMAGE                   COMMAND             CREATED             STATUS              PORTS               NAMES
cb723685302a        jwilder/whoami:latest   "/app/http"         48 seconds ago      Up 47 seconds       8000/tcp            whoami.1.8kaudc0xvpdmax2k12nf7h6m5#不同节点上的tomcat,whomi服务,可以容器内通过serviceName ping通
[node3] (local) root@192.168.0.61 ~
$ docker exec -it cb72368  ping tomcat
PING tomcat (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.117 ms
64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.093 ms
64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.097 ms
$ docker exec -it 4fa7 ping whoami
PING whoami (10.0.0.5) 56(84) bytes of data.
64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=1 ttl=64 time=0.137 ms
64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=2 ttl=64 time=0.052 ms
64 bytes from 10.0.0.5 (10.0.0.5): icmp_seq=3 ttl=64 time=0.061 ms#扩容成3个副本,通过whoami:8000访问,返回不同的hostid
[node3] (local) root@192.168.0.61 ~
$ docker service scale whoami=3
whoami scaled to 3
overall progress: 3 out of 3 tasks
1/3: running   [==================================================>]
2/3: running   [==================================================>]
3/3: running   [==================================================>]
verify: Service converged
[node3] (local) root@192.168.0.61 ~
$ docker service ps whoami
ID                  NAME                IMAGE                   NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
8kaudc0xvpdm        whoami.1            jwilder/whoami:latest   node3               Running             Running 3 minutes ago
4jv21432xgqo        whoami.2            jwilder/whoami:latest   node2               Running             Running 8 seconds ago
svg62zqee2g1        whoami.3            jwilder/whoami:latest   node1               Running             Running 8 seconds ago [node1] (local) root@192.168.0.63 ~
$ docker exec -it 4fa7 curl whoami:8000
I'm bca5e1a05a00
[node1] (local) root@192.168.0.63 ~
$ docker exec -it 4fa7 curl whoami:8000
I'm 6f25815a733c
[node1] (local) root@192.168.0.63 ~
$ docker exec -it 4fa7 curl whoami:8000
I'm cb723685302a
[node1] (local) root@192.168.0.63 ~
$ docker exec -it 4fa7 curl whoami:8000
I'm bca5e1a05a00

service对其他服务提供了一个统一的VIP入口,接收其他服务访问时会做负载均衡。

最好再画一张图。

docker stack

在docker中有docker-compose帮助简化部署操作,docker swarm中也可以使用docker stack来进行部署管理servcie
具体的定义方式跟compose差不多,这里就不一一解释了
(1)新建service.yml文件

version: '3'services:wordpress:image: wordpressports:- 8080:80environment:WORDPRESS_DB_HOST: dbWORDPRESS_DB_USER: exampleuserWORDPRESS_DB_PASSWORD: examplepassWORDPRESS_DB_NAME: exampledbnetworks:- ol-netvolumes:- wordpress:/var/www/htmldeploy:mode: replicatedreplicas: 3restart_policy:condition: on-failuredelay: 5smax_attempts: 3update_config:parallelism: 1delay: 10sdb:image: mysql:5.7environment:MYSQL_DATABASE: exampledbMYSQL_USER: exampleuserMYSQL_PASSWORD: examplepassMYSQL_RANDOM_ROOT_PASSWORD: '1'volumes:- db:/var/lib/mysqlnetworks:- ol-netdeploy:mode: globalplacement:constraints:- node.role == managervolumes:wordpress:db:networks:ol-net:driver: overlay

(2)根据service.yml创建service
    docker statck deploy -c service.yml  my-service
(3)常见操作
   
查看stack具体信息
   docker stack ls


   查看具体的service
   docker stack services my-service

成功访问

docker学习笔记(七)docker-swarm相关推荐

  1. Docker学习笔记2 -- Docker的基本命令和使用

    目录 Docker学习笔记1 Docker帮助命令 Docker镜像命令 Docker容器命令 Docker commit操作 Docker学习笔记1 Docker学习笔记1 – Docker基本原理 ...

  2. Docker学习笔记 之 Docker安装配置使用

    简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare met ...

  3. docker学习笔记(五)docker实战

    目录 一.搭建MySQL高可用集群(pxc+HA-Proxy) 二.Nginx+Spring Boot+MySQL 一.搭建MySQL高可用集群(pxc+HA-Proxy) 参考链接:https:// ...

  4. docker学习笔记(四)docker数据持久化volume

    docker数据持久化 官网:https://docs.docker.com/storage/volumes/ docker中的容器是可以随时销毁的,容器中的数据会随着容器的消亡而消亡.然而很多容器都 ...

  5. docker学习笔记(一)docker入门

    目录 基本概念 docker引擎 docker架构 安装docker docker常用命令 Docker 是一个开源的应用容器引擎,它基于 Go 语言 并遵从 Apache2.0 协议开源. Dock ...

  6. Docker 学习笔记(Docker 架构 / 镜像 / 容器 / 常用命令 / Dockerfile / 镜像仓库)

    Docker 1. Docker 入门 1.1 Docker 是什么 1.2 Docker 和 虚拟机 1.3 镜像 容器 仓库 1.4 Docker 架构 1.5 Docker 安装 1.6 doc ...

  7. Docker学习笔记(2)--Docker常用命令

    1. 查看docker信息(version.info) # 查看docker版本 $docker version# 显示docker系统的信息 $docker info 2. 对image的操作(se ...

  8. Docker学习笔记3——Docker命令(幕布笔记)

    命令文档: https://docs.docker.com/engine/reference/run/ 整体图解: Docker命令(镜像): Docker命令(容器): Docker命令(其他): ...

  9. Docker学习笔记--1.Docker原理、容器

    Docker的安装 Docker的基本构成 Docker架构图 镜像(image): 1 Docker 镜像(Image)就是一个只读的模板.镜像可以用来创建 Docker 容器,一个镜像可以创建很 ...

最新文章

  1. 代码操作Oracle
  2. Linux学习(CentOS-7)---磁盘分区(概念、分区方法、分区方案)
  3. boost::detail模块fwd容器的测试程序
  4. 【Python CheckiO 题解】First Word
  5. 启动VMware中的虚拟机,报.vmdk”或它所依赖的某个快照磁盘
  6. 超市收银机属于通用计算机,我是一名刚入超市做收银的,我录入货品后微信收钱之后没有在超市电脑上按确定导入账目导致超市系统上多出来钱这改正过来会很难吗?...
  7. SWIFT调用C语言
  8. 前端每日实战:62# 视频演示如何用纯 CSS 创作一只蒸锅
  9. python逻辑型数据也叫什么_python基础(三)python数据类型
  10. SSH KEY免密码验证
  11. wireshark分析ICMP数据包
  12. 模式识别和机器学习的区别
  13. 浏览器兼容与前端性能优化集合
  14. 肺疫面前,段子手出动,但是玩笑也要分场合
  15. 2019中国区块链开发者大会 | Conflux 伍鸣:性能问题仍是区块链的应用阻碍
  16. jsp大学生兼职信息管理系统
  17. xcpc网络赛个人总结(文笔不好,纯纯记录)
  18. MNIST数据集手写数字分类
  19. 绝妙的 channel
  20. 【开源AI平台】Determined调研

热门文章

  1. java无忧网_零基础java入门课程 - 学途无忧网 - 做技术的王者 - Powered By EduSoho
  2. FutureTask源码
  3. python异步框架twisted_twisted是python实现的基于事件驱动的异步网络通信构架。
  4. 高效大数乘法 c语言,华为2012校园招聘上机题——大数相乘,两个超过100位的大数相乘C语言...
  5. python pymongo+networkx 实现mongo数据血缘关系可视化
  6. SpringBoot 中 @RequestBody的正确使用方法
  7. 修改Tomcat7的/webapps/ROOT发布路径
  8. mysql5.7 solo web服务器
  9. top.location.href和localtion.href有什么不同
  10. oracle学习篇一:sqlplus常用命令