云原生
第2章 云原生基础设施之容器技术
2.1 容器发展背景
企业 IT 业务云化路径 - 传统业务云化
方式一:物理机部署,统一管理
- 特征: 业务无法云化部署,物理资源搬迁或纳管到云平台资源池。
- 资源管理: 按峰值需求静态分配,资源占用率高,缺乏统一管理。

方式二:云化后虚拟化部署
- 特征: 应用使用 P2V/V2V 方式迁移到 IaaS 平台。
- 资源管理: 按应用组件分类打标签,集群化管理。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VCrHXOG-1658812101021)(华为云原生入门级认证.assets/image-20220725125621745.png)]](https://1000bd.com/contentImg/2022/07/30/100108949.png)
企业 IT 业务云化路径 - 业务云化创新
方式一:云化后容器部署
- 特征: 应用容器化,快速发布和弹性伸缩(应用不改或少改)。
- 资源管理: 混合编排虚机进程和容器应用。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPAzZspf-1658812101023)(华为云原生入门级认证.assets/image-20220725125911093.png)]](https://1000bd.com/contentImg/2022/07/30/100109096.png)
方式二:云原生
- 特征: 引用微服务化实现 Cloud-Native 架构(应用架构改造),业务敏捷。
- 资源管理: 应用层集中、动态管理和调度。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r3goZPzK-1658812101025)(华为云原生入门级认证.assets/image-20220725125922013.png)]](https://1000bd.com/contentImg/2022/07/30/100109243.png)
容器是什么?
- 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
- 开发人员在自己开发环境创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOqNONrf-1658812101026)(华为云原生入门级认证.assets/image-20220725130054062.png)]](https://1000bd.com/contentImg/2022/07/30/100109411.png)
为什么使用容器?
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hwQL5Gbx-1658812101028)(华为云原生入门级认证.assets/image-20220725130134504.png)]](https://1000bd.com/contentImg/2022/07/30/100109582.png)
容器核心思想
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xAiQ6eKz-1658812101031)(华为云原生入门级认证.assets/image-20220725130148511.png)]](https://1000bd.com/contentImg/2022/07/30/100109734.png)
容器与虚拟机
- 容器和虚拟机之间的主要区别在于虚拟化层的位置和操作系统资源的使用方式。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4f0Maw4e-1658812101038)(华为云原生入门级认证.assets/image-20220725130230375.png)]](https://1000bd.com/contentImg/2022/07/30/100109929.png)
容器 VS 虚拟机
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ya6sR7aa-1658812101040)(华为云原生入门级认证.assets/image-20220725130250188.png)]](https://1000bd.com/contentImg/2022/07/30/100110240.png)
Docker 项目介绍
2.2 容器关键技术介绍
容器规范
- 容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt 。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker 、CoreOS 、Google 在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目的是制定开放的容器规范。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-deVDVYxW-1658812101042)(华为云原生入门级认证.assets/image-20220725132444951.png)]](https://1000bd.com/contentImg/2022/07/30/100110597.png)
容器 runtime
- runtime 与操作系统 kernel 紧密协作,为容器提供运行环境。
- 常见的容器 rumtime:
- runC 是 Docker 公司 2015 年发布的容器 runtime 工具,符合 OCI 规范。
- runC 由 Libcontainer 演变而来。
- rkt ,是 CoreOS 公司开发的 Docker/runc 的一个流行替代方案,符合 OCI 规范。
- Kata ,2017 年整合 Clear Container 和 runV 项目,基于虚拟化技术的容器实现,符合 OCI 规范。
- gVisor ,2018 年 Google 公司发布 gVisor 的项目,基于虚拟化技术的容器实现,符合 OCI 规范。
Docker Engine 介绍
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NSd76Pg3-1658812101044)(华为云原生入门级认证.assets/image-20220725132803860.png)]](https://1000bd.com/contentImg/2022/07/30/100110759.png)
Docker 架构
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mdEIV1mz-1658812101046)(华为云原生入门级认证.assets/image-20220725141024458.png)]](https://1000bd.com/contentImg/2022/07/30/100111063.png)
Docker 内部构建
- Docker 镜像(Image)
- Docker 镜像就是一个只读模板,镜像可以用来创建 Docker 容器。另外 Dccker 提供了一个很简单的机制来创建镜像活着更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
- Dcoker 容器(Container)
- Docker 利用容器来运行应用。容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除、每个容器都是相互隔离的、保证安全的平台。
- Docker 仓库(Repository)
- 仓库是集中存放镜像文件的场所。仓库注册服务器上往往存放着很多仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。
Docker 容器实现原理
- Docker 容器通过 namespace 技术实现进程隔离,通过 cgroup 技术实现容器进程可用资源的限制。Docker 启动一个容器时,实际是创建了包含多个 namespace 参数的进程。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdEFhFob-1658812101047)(华为云原生入门级认证.assets/image-20220725141513048.png)]](https://1000bd.com/contentImg/2022/07/30/100111197.png)
Namespace
- Namespace:命名空间
- 作用:资源隔离。
- 原理:namespace 将内核的全局资源进行封装,使得每个 namespace 都有一份独立的资源。因此不同进程在各自 namespace 内对同一资源的使用不会相互干扰。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnbzedEn-1658812101048)(华为云原生入门级认证.assets/image-20220725141630994.png)]](https://1000bd.com/contentImg/2022/07/30/100111603.png)
PID namespace 隔离示例
Cgroups
- Cgroups:Linux Control Groups
- 作用:限制一个进程组对系统资源的使用上限,包括 CPU 、内存、Block I/O 等。
- Cgroups 还可以设置进程优先级,对进程进行挂起和恢复等操作。
- 原理:将一组进程放在一个 Cgroup 中,通过给这个 Cgroup 分配指定的可用资源,达到控制这一组进程可用资源的目的。
- 实现:在 Linux 中,Cgroups 以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。该路径中所有的资源种类均可被 Cgroup 限制。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rkPhiuNO-1658812101050)(华为云原生入门级认证.assets/image-20220725142141959.png)]](https://1000bd.com/contentImg/2022/07/30/100112040.png)
容器镜像
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-950dHMGR-1658812101056)(华为云原生入门级认证.assets/image-20220725142447326.png)]](https://1000bd.com/contentImg/2022/07/30/100112556.png)
UnionFS 联合文件系统
- UnionFS 主要的功能是将多个不同位置的目录联合挂载到同一个目录下。
- 每一个镜像层都是 Linux 操作系统文件与目录的一部分。在使用镜像时,docker 会将所有的镜像层联合挂载到一个统一的挂载点上,表现为一个完整的 Linux 操作系统提供容器使用。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyNfM0fY-1658812101057)(华为云原生入门级认证.assets/image-20220726110553938.png)]](https://1000bd.com/contentImg/2022/07/30/100112822.png)
容器数据卷
容器 copy-on-write 特性
对容器的增删改查操作:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qpMkNlL0-1658812101058)(华为云原生入门级认证.assets/image-20220726110853631.png)]](https://1000bd.com/contentImg/2022/07/30/100113128.png)
Registry
Docker Hub
- Docker Hub 是目前世界上最大的容器镜像仓库,由 Docker 公司维护,并提供官方镜像及大量用户上传的镜像。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D52hSOlJ-1658812101061)(华为云原生入门级认证.assets/image-20220726111241716.png)]](https://1000bd.com/contentImg/2022/07/30/100113526.png)
2.3 如何使用 Dockerfile 构建镜像
如何构建镜像
- Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vEVgj5vl-1658812101061)(华为云原生入门级认证.assets/image-20220726111405318.png)]](https://1000bd.com/contentImg/2022/07/30/100113776.png)
Dockerfile
- Dockerfile :文件指令集,描述如何自动创建 Docker 镜像。
- Dockerfile 是包含若干指令的文本文件,可以通过这些指令创建出 docker image 。
- Dockerfile 文件中的指令执行后,会创建一个个新的镜像层。
- Dockerfile 文件中的注释以"#"开始。
- Dockerfile 一般由 4 部分组成“
- build context :为镜像构建提供所需的文件或目录。
Dockerfile 常用指令
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iG4SGxZw-1658812101062)(华为云原生入门级认证.assets/image-20220726111641069.png)]](https://1000bd.com/contentImg/2022/07/30/100113904.png)
一个简单的 Dockerfile
#基于centos镜像
FROM centos
#维护人的信息
MAINTAINER docker_user docker_user@email.com
#安装httpd软件包
RUN yum -y update
RUN yum -y install httpd
#开启80端口
EXPOSE 80
#复制该脚本至镜像中,并修改其权限
ADD run.sh /run.sh
RUN chmod 755 /run.sh
#当启动容器时执行的脚本文件
CMD ["/run.sh"]
Dockerfile 示例 (1)
- 编辑一个 Dockerfile 文件,并命名为 Dockerfile1 ,存放于 /root/df 目录下。
FROM httpd
COPY index.html /
RUN /bin/bash -c "echo Huawei"
- 使用 dcoker build 命令用文件 Dockerfile1 构建一个镜像,并将镜像命名为 test2 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vomV1EB4-1658812101063)(华为云原生入门级认证.assets/image-20220726112149571.png)]](https://1000bd.com/contentImg/2022/07/30/100114041.png)
Dockerfile 示例 (2)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QIhgehJD-1658812101064)(华为云原生入门级认证.assets/image-20220726112225833.png)]](https://1000bd.com/contentImg/2022/07/30/100114182.png)
镜像命名
- 镜像名称格式
- image name = repository:tag
- tag 一般用于描述镜像版本,若未指定 tag ,则默认为 “latest” 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8sakBOqz-1658812101065)(华为云原生入门级认证.assets/image-20220726112857354.png)]](https://1000bd.com/contentImg/2022/07/30/100114574.png)
搭建私有 Registry 示例 (1)
-
使用 “registry" 镜像构建本地镜像仓库。registry 是 docker hub 上维护的镜像,其服务端口是 5000 。-v 参数将宿主机的 /root/myregistry 目录映射到容器的 /var/lib/registry 目录,用于存放镜像数据。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HwXoF9pR-1658812101066)(华为云原生入门级认证.assets/image-20220726113043456.png)]](https://1000bd.com/contentImg/2022/07/30/100114716.png)
-
使用 docker tag 命令修改镜像名称,使其符合 registry 上的格式要求。若要将镜像上传到 registry ,镜像名称需要符合其命名格式要求:[Registry-host]:[port]/[username]/[repository:tag] 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdbfTYlk-1658812101067)(华为云原生入门级认证.assets/image-20220726113233528.png)]](https://1000bd.com/contentImg/2022/07/30/100114857.png)
-
上传容器镜像到私有 Registry 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hnbKclo-1658812101069)(华为云原生入门级认证.assets/image-20220726113246098.png)]](https://1000bd.com/contentImg/2022/07/30/100115060.png)
搭建私有 Registry 示例 (2)
- 在 Linux 下,若使用如 “192.168.137.99:1000” 这样的内网地址作为私有仓库地址,则需要在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在需新建该文件),然后重启 Docker 服务。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3wYOIML-1658812101069)(华为云原生入门级认证.assets/image-20220726113546369.png)]](https://1000bd.com/contentImg/2022/07/30/100115185.png)
上传 SWR 镜像仓库
- 连接容器镜像服务。登录容器镜像服务控制台,复制登陆指令,在安装容器引擎的机器中执行。

2.4 容器生命周期管理
查看 Docker 服务状态

运行一个容器 (1)
- 执行 docker run 命令运行一个容器。
- “-d” 参数可在后台运行容器;“-p” 参数将宿主机 8080 端口映射到容器 80 端口。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VkGcj2EW-1658812101075)(华为云原生入门级认证.assets/image-20220726123916250.png)]](https://1000bd.com/contentImg/2022/07/30/100116247.png)
运行一个容器 (2)
容器生命周期管理 (1)
-
使用 docker stop 命令停止一个容器。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBcAGI4e-1658812101077)(华为云原生入门级认证.assets/image-20220726124225903.png)]](https://1000bd.com/contentImg/2022/07/30/100117076.png)
-
使用 docker ps -a 查看所有状态的容器,状态是 Exited 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-seDhhQR5-1658812101078)(华为云原生入门级认证.assets/image-20220726124237718.png)]](https://1000bd.com/contentImg/2022/07/30/100117216.png)
-
使用命令 docker start 命令启动一个容器。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qReuvnyG-1658812101079)(华为云原生入门级认证.assets/image-20220726124246157.png)]](https://1000bd.com/contentImg/2022/07/30/100117341.png)
-
使用命令 docker start 命令启动一个容器,状态是 Up 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ys0XRFjR-1658812101080)(华为云原生入门级认证.assets/image-20220726124254423.png)]](https://1000bd.com/contentImg/2022/07/30/100117732.png)
容器生命周期管理 (2)
-
使用 docker pause 命令暂停一个容器。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m2Ms7yjq-1658812101081)(华为云原生入门级认证.assets/image-20220726124434393.png)]](https://1000bd.com/contentImg/2022/07/30/100118025.png)
-
使用命令 docker ps - a 查看所有状态的容器,状态是 Paused 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8MXyPo8L-1658812101081)(华为云原生入门级认证.assets/image-20220726124458322.png)]](https://1000bd.com/contentImg/2022/07/30/100118233.png)
-
使用命令 docker unpause 恢复启动一个容器。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuLFGkgX-1658812101083)(华为云原生入门级认证.assets/image-20220726124508389.png)]](https://1000bd.com/contentImg/2022/07/30/100118655.png)
-
使用命令 docker unpause 命令恢复一个容器,状态是 Up 。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCyfKmE6-1658812101084)(华为云原生入门级认证.assets/image-20220726124518720.png)]](https://1000bd.com/contentImg/2022/07/30/100118804.png)
容器生命周期管理 (3)
进入一个容器
其他常见命令
-
使用 docker inspect 获取容器/镜像元数据。
-
使用 docker top 命令查看容器中运行的进程信息。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNsZYEns-1658812101092)(华为云原生入门级认证.assets/image-20220726125021904.png)]](https://1000bd.com/contentImg/2022/07/30/100120697.png)
-
使用 docker events 从服务器获取实时事件。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ejlNXv31-1658812101093)(华为云原生入门级认证.assets/image-20220726125042446.png)]](https://1000bd.com/contentImg/2022/07/30/100120931.png)
-
使用 docker port 列出指定的容器的端口映射。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MBnKlYtg-1658812101094)(华为云原生入门级认证.assets/image-20220726125059918.png)]](https://1000bd.com/contentImg/2022/07/30/100121072.png)
-
使用 docker cp 与主机之间进行数据拷贝。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bocDrf4g-1658812101094)(华为云原生入门级认证.assets/image-20220726125113237.png)]](https://1000bd.com/contentImg/2022/07/30/100121212.png)
思考题

答案:ABCD

答案:A
本章总结
- 介绍了容器的相关概念,发展,架构以及应用场景。
- 介绍了容器和虚拟机的区别。
- 介绍了 Docker 架构以及容器生命周期管理。
- 介绍了容器相关基础操作。
缩略语
- IaaS:Infrastructure as a Service ,即基础设施即服务,指把 IT 基础设施作为一种服务通过网络对外提供,并根据用户对资源的实际使用量或占用量进行计费的一种服务模式。
- OCI:Open Container Initiative ,开放容器计划,定一套容器和镜像的标准和规范。
- P2V:physical machine to virtual machine ,物理机转换成虚拟机。
- PaaS:Platform as a Service ,即平台即服务,把服务器平台作为一种服务提供的商业模式。
- UnionFS:Union File System ,联合文件系统,它是一种轻量级的高性能分层文件系统,实现 Docker 镜像的技术基础。
- V2V:virtual machine to virtual machine ,不同虚拟化环境的虚拟机之间互相迁移、转换。