华为云DevOps系列之 —— 持续部署与发布(三)容器技术 & Docker
此篇文章中,主要介绍了容器的背景以及容器相关的技术,并着重介绍了 Docker 相关概念(镜像、容器、工作机制等),并未涉及太多终端的操作,大家需要学习更多 Docker 相关技术的话,请访问以下文章
Docker 超详细版(基础+进阶)(一)
Docker 超详细版(基础+进阶)(二)
容器的背景
高度分散和异构化的部署环境
- 开发完软件/工程后,我们要进行部署,部署的时候就面临着高度分散和异构化的部署环境
- 硬件上要搭建好物理的硬件环境:服务器、数据中心、云环境、容灾备份等,然后要进行应用的部署配置
- 软件方面,不同的技术栈有不同的依赖和配置,要使用不同的方式和工具进行部署,同时要考虑到应用之间的交互
- 各种纷乱的硬件环境以及技术栈为软件部署带来了巨大的挑战,以此产生了
容器
代码集装箱装卸工
- 容器,相当于软件行业的集装箱,也就是英文里的 container,它就像我们运输业的集装箱一样,把货物都打包在了一起,容器把软件应用进行了封装,把软件运行所依赖的环境都放在了一起,形成了软件界的统一运输规范
- docker 是容器技术的一种,它是将任何需要运送的代码进行封装、转移、管理的标准化工具,所有的软件交付工具、开发、测试、持续集成、部署、版本管理、运行环境都按照 docker 进行统一
容器实现了快速交付和部署
- 容器是操作系统内核自带能力,容器是在 Linux 内核实现的
轻量级高性能资源隔离机制
- 我们可以将容器与我们熟悉的虚拟机进行对比,虚拟机通过 Hypervisor 层实现了虚拟化,在 Hypervisor 层上面我们可以创建多个虚拟机,每个虚拟机都有自己的操作系统 Guest OS
- Docker 相较而言就非常的轻量,它没有 Hypervisor 层,也不需要安装 Guest OS,它基于 docker engine 可以直接运行多个容器应用,docker 把程序所依赖的 bin 和 libs 文件都打包好了,所以容器的
移植性
非常强,可以跨云部署,轻量,能够更细粒度的去划分资源,提高资源的利用率,且能够实现资源的快速弹性伸缩
- 部署裸机上的应用是小时级的,虚拟机是分钟级的,而容器是秒级的,可以
实现软件的快速交付以及部署
什么是容器技术
-
容器技术在云计算领域可以分为两大类:一个是以 Docker 为代表的
容器引擎技术
,另一个是以 K8S 为标准的容器编排技术
-
Docker 代表容器引擎技术是因为 docker 主导了容器引擎的标准 OCI(OCI 定义了容器的编译方式、技术上的约束),很多其他容器技术都遵循或者兼容 OCI 标准,如 Kata 安全容器
-
Docker 的两个版本
- docker CE community edition 是免费的开源社区版本
- docker EE enterprise edition 是商用版,提供收费的技术支持
- Kubernetes 是业界公认的容器编排领域的事实标准,几乎所有的公有云厂商的容器技术都是基于 kubernetes 实现的
Docker
什么是 Docker
-
最主流的容器运行时技术,提供了容器的运行时能力,经过多次容器技术标准的演进和 OCI 标准和确立,目前 Docker 的框架如下所示
-
containerd 是容器技术标准化之后的产物,为了能够兼容OCI 标准,独立负责容器运行时和生命周期(如创建、启动、停止、中止、信号处理、删除等),从 daemon 中剥离,向 docker engine 提供运行容器的 API,通过 grpc 通信;每创建一个容器,containerd 都会创建一个 shim 进程,每个 shim 会调用 runc(前身是 libcontainer)进行实际的容器运行时管理,比如创建 namespace 的隔离
-
Docker 的技术特点
- 容器镜像定义了统一的软件交付标准
- 文件挂载提供了更小资源占用的运行环境
- 共享 OS 内核使容器本质上只是一个进程,秒级启停
-
Docker 的优势
- 统一的交付标准可以屏蔽环境差异,使能 DevOps
- 更小的资源消耗,提高资源利用率,匹配微服务架构
- 极速的弹性伸缩、故障恢复,解放运维生产力
Docker 的关键技术
- Docker 所应用的几个关键技术实际上都不是 Docker 发明的,而是 Linux 早期成熟的技术,Docker 将这几个技术整合形成了革命性的成果
- Namespace 负责运行环境的隔离,即每个容器都是一个
独立进程
,通过 namespace 技术进行隔离,每个容器互相不可见,包括进程隔离、网络隔离、文件隔离 - Cgroup 是负责运行资源的隔离或者说独占,可以为每个容器指定资源数量,互相不侵占
- Union filesystem 是解决应用运行的小型化统一标准,容器镜像提供了容器运行的基础,但容器镜像并不等于容器
Docker 镜像
-
Docker 镜像是一个特殊的
文件系统
,除了提供容器运行时所需的程序、库、资源、配置文件外,还包含了一些为运行时准备的一些配置参数,镜像不包含任何动态数据,它的内容在构建之后也不会改变。类似于一个快速部署的模版,打包好了应用程序和运行环境
-
镜像的特点是
分层存储
,由于镜像包含 OS 完整的 root 文件系统,其体积往往是庞大的,因此在 Docker 设计时,充分利用了 Union FS 的技术,将其设计为分层存储的架构,所以严格意义来说,镜像只是一个虚拟的概念,其由多层文件系统联合组成
-
实际上容器镜像是一系列
分层的只读文件
,当容器镜像运行为容器时,就会在镜像的最上层添加一个可写的层,也就是容器层,所有对于运行时容器的修改其实都是对这个容器读写层的修改,所有对容器的变化,比如写新的文件,修改已有文件和删除文件,都只会作用在这个容器层之中
-
优点
- 多个容器可以共享 image 存储,节省存储空间
- 部署多个容器时,base image 可以避免多次拷贝,实现快速部署
Dockerfile 构建容器镜像
- 通过前面我们已经了解了镜像的基本概念,我们可以发现镜像是应用发布的标准格式,那么如何去创建/制作镜像呢?
- 根据 Dockerfile 构建镜像,通过 Dockerfile 描述可构建为一个 tar 包,通过 docker 客户端使用
build
命令构建一个镜像。当我们对镜像进行run
操作的时候,就会启动一个容器 - Docker 镜像生命周期管理
docker pull
从镜像仓库拉取一个镜像docker push
推送镜像到镜像仓库docker build
将 Dockerfile 构建为镜像docker tag
为镜像打上一个标签
- Docker 容器的生命周期管理
docker run
运行一个容器docker stop
停止一个容器docker start
启动一个容器docker restart
重启一个容器docker kill
杀掉一个运行的容器docker pause
暂停一个容器
Docker 发布系统工作机制
- 镜像提供了一种标准化运输或者发布方式,发布系统工作机制就是 build、ship、run
- Docker 的三大组件
- Docker 引擎
- Docker 客户端
- 镜像仓库
Docker 容器的持续部署流水线
- 首先开发人员使用 git/svn 工具开发以及提交代码,触发测试和 Jenkins 编译构建(这里的测试通常是对于代码的测试,白盒测试)
- Jenkins 根据代码工程中的 dockerfile 即可构建为 docker 容器镜像,然后使用镜像,触发部署
- 通过 k8s 集群进行可视化编排与容器集群管理(如弹性伸缩,滚动升级等)
- 统一格式打包的镜像可以一致性地部署到开发、测试、生产环境
- 容器镜像作为 DevOps 流程的标准交付件,实现了跨阶段的标准化发布流程
容器让开发和运维协同工作
- 开发人员
- 关心容器内
- code
- Libraries
- Package Manager
- Apps
- Data
- 针对任何环境都采用同样方式打包
- 除了开发时,也要关心运行时
- 关心容器内
- 运维人员
- 只需要担心容器外的事情
- 远程访问
- 监控
- 网络配置
- 所有的容器采用同样的方式启动、停止、复制、接入和升级
- 只需要担心容器外的事情
最后,欢迎大家关注我的个人微信公众号 『小小猿若尘』,获取更多IT技术、干货知识、热点资讯。同时,我在公众号中分享了精心整理的一些视频资料(包括 Python全栈教程、AI教程、前端、数据库等),大家回复相应关键词即可获取网盘视频链接,感谢大家的关注😊
- 点赞
- 收藏
- 关注作者
评论(0)