您现在的位置是:首页 >技术交流 >容器编排部署网站首页技术交流

容器编排部署

CCTVZHENG 2023-05-13 04:00:02
简介容器分三层:工程project一个目录服务service用于定义容器资源(镜像、网络、依赖、容器)容器container 用于运行服务使用Compose基本上分为三步∶1.Dockerfile定义应用的运行环境2.docker-compose.yml定义组成应用的各服务3.docker-compose up启动整个应用。

一、概述

容器编排部署的作用:

实现复杂容器应用架构之间的互联,减少大量容器部署的成本


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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。