一、概述
容器编排部署的作用:
实现复杂容器应用架构之间的互联,减少大量容器部署的成本
Docker"三剑客"编排部署
工具︰
docker machine
用于创建和管理docker host
docker compose
通过一个文件定义复杂的容器应用之间的关系
容器与容器之间的依赖也可以在docker-compose.yml文件里面定义
postgresql数据库容器
docker swarm
用于管理docker host
把docker host生成一个集群
可以使用YAML文件实现复杂容器应用编排
以上就是docker三剑客
kubernetes k8s 枯吧力死
归云原生计算基金会
能够实现复杂容器应用的编排部署
容器自动装箱功能
容器滚动更新及回滚
容器水平扩展
配置中心
密钥和存储管理
容器云平台使用kubernetes完成核心功能
mesos + marathon
mesos集群资源管理 每次都去请求 linux,容器一旦发生响应延迟就不行
marathon容器编排部署 这个可以进行容器的定时启动和运行时间的 控制
二、docker compose
2.1 docker compose 作用
在一个文件中定义复杂的容器应用之间的关系,用一个命令即可执行。
YAML,类似于htmI,xml 都是标记语言
. YAML格式文件
. docker-compose 使用yaml文件启动容器
start & stop 启动容器与关闭并删除容器
down & up 关闭容器与 开启新的容器
2.2 docker compose的定义方法
容器分三层:
工程project一个目录
服务service用于定义容器资源(镜像、网络、依赖、容器)
容器container 用于运行服务
使用Compose基本上分为三步∶
1.Dockerfile定义应用的运行环境
2.docker-compose.yml定义组成应用的各服务
3.docker-compose up启动整个应用
2.3 docker compose的部署
先ping一下网络,需要外网下载yum
安装好epel-release和python2-pip之后才能安装docker-compose
验证docker-compose命令是否存在
2.3.1 使用docker compose 部署应用的案例
第一步:创建一个project目录
第二步: 定义web服务
在web目录中创建一个Dockerfile文件,目的就是 创建容器镜像
再创建一个index.py 文件 可以在网上找一个python的web文件
第三步:定义haproxy服务
在project目录创建一个haproxy目录,在该目录下创建haproxy.cfg文件
第四步:创建docker-compose.yaml文件
如果ports的端口格式写错启动容器会报错,"80:80"
第五步:用docker-compose 命令启动project项目工程
注意:启动工程的命令必须在工程目录下 up启动新的容器 down关闭
-d 可以后台启动,后台启动就可以在docker compose服务器当前终端启动或关闭容器
不加-d就是当前终端启动,通过浏览器访问测试可以清楚的在终端看见报错问题
python2.7和haproxy的容器镜像自动下载之后就可以通过网页访问服务器70端口查看haproxy的页面,80端口访问的是工程目录里面的index.py
一共三台web服务器容器+一个haproxy容器
2.3.2 docker-compose编排应用案例 Flask redis
1、创建一个python应用目录,再创建一个 python文件
vim app.py
2、创建安装的软件需求列表
vim requirements.txt 直接列出需求的软件,因为需要创建这些软件的容器镜像
3、创建Dockerfile文件
通过python2.7镜像里面的pip安装需求软件清单requirements.txt
CMD运行python文件app.py
4、创建编排 脚本
在同一目录(应用目录)下创建docker-compose.yml
yml文件2版本支持空格,3版本才可以tab,tab也是四个空格
web容器内的5000端口映射到主机的5000端口
将当前目录挂载到web容器内/code
web容器依赖于redis容器
redis容器从Docker Hub获取镜像
5、运行docker-compose up 终端启动项目工程
会自动下载需要的软件
6、通过访问服务器ip+5000端口号可以查看访问次数
2.3.3 使用容器运行wordpress应用
第一步:创建一个工程目录
第二步:创建docker-compose.yml文件
第三步:运行docker-compose启动项目工程
docker-compose up 建议不加-d 方便排错
最后就可以用服务器ip+8000端口访问服务了,这个应用是用容器来运行的,并且数据挂载到了本地服务器的工程目录 ,实现了数据的持久化
三、docker swarm
中文意思是码头人群,是docker host集群管理工具
docker官方提供的用来统一集群管理的,把整个集群资源做统一调度
比kubernetes要轻量化 哭吧力死
实现scaling 规模扩大或缩小 死给您
实现rolling update滚动更新或版本回退
实现service discovery 服务发现(让容器中的服务被发现)
实现load balance负载均衡
实现route mesh路由网格,服务治理
3.1 docker swarm架构
节点(node)就是一台docker host
管理节点(manager node)负责管理集群中的节点并向工作节点分配任务。
工作节点(worker node)接收管理节点分配的任务,运行任务
服务(services),在工作节点运行的,由多个任务共同组成
任务(task),运行在工作节点上的容器或容器中包含的应用,是集群调度中的最小管理单元
因为一个容器也算是任务
3.2 docker swarm部署环境准备
准备主机
3台主机
centos7.6
cpu、memory、disk
第一步:准备ip及主机名称
可以通过scp把网卡配置文件上传到其他主机之后再配置ip
第二步:安全准备
第三步:根据官方文档安装docker
yum -y install docker-ce
daemon.json文件不用改,但是如果要使用本地仓库可以修改
就是删掉ExecStart后面的
systemctl enable docker
systemctl start docker
第四步:docker swarm 集群部署
集群初始化docker swarm init --listen-addr manager node ip:2377
根据情况把命令复制到其他node节点 可以再添加一个manager节点
添加工作节点到swarm集群之后可以
用docker node ls 列出swarm集群中的所有node节点
包括节点的信息和节点安装的docker版本以及节点的状态
3.3 docker swarm 应用
3.3.1制作发布服务的镜像
必须先部署好harbor
然后确保服务器能登录harbor
docker login 就能直接登录了
可以打包需要的容器镜像
node1必须配置daemon.json 非安全仓库
daemon.json文件必须配置ip,要不然上传镜像到harbor仓库时会报错
"insecure-registries": ["http://ip"]
Dockerfile文件内容
最后访问harbor网页可以看到有两个版本的镜像
3.3.2 发布服务
在这里需要注意的是在swarm mode中对外暴露的是服务( service )的概念,而不是容器。在swarm mode的设计中,为了保持高可用架构,它准许同时启动多个容器共同支撑一个服务,如果一个容器挂了,它会自动使用另一个容器。
第一步:在manager node 上创建服务
映射的端口是用于访问web页面的,也就是之前是80端口httpd服务,但是容器端口映射之后就是8090
第二步:docker service ps 服务名称
查看服务运行在哪些节点上
扩展和缩小
multiple 多个 replicated 复制
docker service scale 服务名称 =容器数量
缩小就是把容器数量3个变成1个就行,减少容器数量就是 缩小
删除服务 docker service rm 服务名称
滚动更新(版本回退)
更新服务 docker service update --image 新的镜像名称 服务名称
把v2改成v1就能变成版本回退
间隔更新
update-parallelism 1 间隔是1个容器
间隔延迟30s --update-delay 30s
docker stack
早期使用service发布,每次只能发布一个service
yaml可以发布多个服务,但是使用docker-compose只能在一台主机发布
docker stack借助docker swarm发布多服务
是docker生态service发布的最高层次
使用docker stack部署服务
deploy 部署 -c 通过yml文件部署 stack-demo 是测试案例的意思
docker stack ls 可以看到有3个服务 集群是swarm
docker stack 部署其实就是通过docker-compose.yml文件去安装应用镜像images
replicas就是代表安装的进度
docker swarm 发布服务挂载本地卷实现数据持久化存储
--mount "type=bind,source=$PWD,target=目标目录" --publish 端口映射
挂载的当前目录其实就是主机的/目录 挂载到容器的/abc
如果创建服务的时候发现错了,可以docker service rm 服务名称
删掉服务 重新创建
可以通过docker ps 查看所有的容器信息
可以根据服务的名称或镜像 的名称找到容器的名称
本地卷挂载到容器目录虽然实现了持久化存储,但是容器横向扩展的时候,每个node节点都会运行相同的容器,但是写入的统一的数据(例如/var/www/html/index/index.html)又必须重复操作,每台服务器都在本地写入一次,费时费力
docker service scale 扩展了3个服务在集群中随机分配,可能是每台服务器运行一个
docker swarm 发布服务挂载网络卷
实现跨docker host之间容器数据共享
持久化保存数据到网络服务器中
第一步:创建nfs服务
no_root_squash 注意别写错
nfs服务器端在node3 所以node3就必须创建共享目录 其他节点创建挂载目录
exportfs -rv 输出共享目录
设置开机自启并 启动nfs服务 rpcbind nfs-server
在集群中的其他服务器查看共享目录是否存在
第二步:在docker host中创建volume
整个集群的所有主机都必须创建volume
查看volume本地卷列表
docker volume inspect 卷名称 查看volume卷的详细信息
o :指定哪个主机输出的什么权限
第三步:使用docker service 发布服务时使用volume
手动启动service时挂载
前题条件是nfs服务已经被挂载到本地 其实就是共享目录是否都在服务器上
因为整个集群的volume卷都是靠共享目录的服务器ip挂载的
创建多副本时需要在每个容器运行的docker hosts上添加volume
创建服务时必须在manager node 管理节点上,因为可以分配任务给其他工作节点
测试可以在nfs服务器上的共享目录中修改文件
使用每个节点的 ip+81端口就能访问到AAAA的网页
因为其他节点把共享目录挂载到了nginx服务的项目目录,所以千万注意获取应用镜像之前先确认镜像里面的文件是否干净
启动容器的过程中会自动生成,所以需要干净的 应用镜像
docker swarm 网络存储卷编排部署services
前提是必须删除之前所有节点创建的网络存储卷的挂载smartvolume1
docker volume rm 卷名
第一步:创建project工程目录
第二步:在工程目录中创建yaml文件
yaml版本必须是3.3,其他的可能不支持
第三步:编排部署文件
千万注意:condition千万不能写错
第四步:使用docker stack 部署yaml文件
nginx-stack是自定义命名docker stack部署的服务名称
可以查看docker stack 里面的服务的信息
自动创建了网络 和服务
docker volume ls 查看smartvolume1卷是否挂载成功,因为是通过docker stack 部署的,所以卷的名称前缀就是nginx-stack