【华为云原生入门级认证】第 2 章 云原生基础设施之容器技术

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 【华为云原生入门级认证】第 2 章 云原生基础设施之容器技术

云原生

第2章 云原生基础设施之容器技术

2.1 容器发展背景

企业 IT 业务云化路径 - 传统业务云化

方式一:物理机部署,统一管理



  • 特征: 业务无法云化部署,物理资源搬迁或纳管到云平台资源池。
  • 资源管理: 按峰值需求静态分配,资源占用率高,缺乏统一管理。


7259d6e22c674e00afa6041dd0b2fcf7.png


方式二:云化后虚拟化部署

  • 特征: 应用使用 P2V/V2V 方式迁移到 IaaS 平台
  • 资源管理: 按应用组件分类打标签,集群化管理。



aebc254417384c34af765f6d7b79970f.png


企业 IT 业务云化路径 - 业务云化创新

方式一:云化后容器部署

  • 特征: 应用容器化,快速发布和弹性伸缩(应用不改或少改)。
  • 资源管理: 混合编排虚机进程和容器应用。


48db079d8dad4437a650331b04a00a19.png


方式二:云原生

  • 特征: 引用微服务化实现 Cloud-Native 架构(应用架构改造),业务敏捷。
  • 资源管理: 应用层集中、动态管理和调度。


4a06a443cd36498eaa631f21fee11ddb.png


容器是什么?


  • 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
  • 开发人员在自己开发环境创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。


aefc8cb88d2f417e9ce14194a634919c.png

为什么使用容器?


68f7b4424e9c4a169199cf4cd55fa7c3.png

容器核心思想

f679aaa5be294fb6851f86514405f2f4.png

容器与虚拟机

  • 容器和虚拟机之间的主要区别在于虚拟化层的位置和操作系统资源的使用方式。


7f80f4eaadf8439db4c3283aed2536e3.png


容器 VS 虚拟机


2a6569fec8804b07b6aa0a6b78f98859.png

Docker 项目介绍


2013 年,dotCloud 公司将 Docker 项目开源。


Docker 项目:


GitHub 上开发的 Moby 开源项目的一部分

遵循 Apache License 2.0 许可证协议

Go 语言编写

Docker 是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。


Docker 公司目前推出两个版本:


Docker CE(社区版)

Docker EE(企业版)

2.2 容器关键技术介绍

容器规范


容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt 。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker 、CoreOS 、Google 在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目的是制定开放的容器规范。

c7077b7630b64ba88db9a6ceabbed64f.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 介绍


b033f28c16e34359a2067f2f7d9c7349.png



Docker 架构


6454b5c6c1754911a594e406a0334682.png



Docker 内部构建


Docker 镜像(Image)

Docker 镜像就是一个只读模板,镜像可以用来创建 Docker 容器。另外 Dccker 提供了一个很简单的机制来创建镜像活着更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

Dcoker 容器(Container)

Docker 利用容器来运行应用。容器是从镜像创建的运行实例,它可以被启动、开始、停止、删除、每个容器都是相互隔离的、保证安全的平台。

Docker 仓库(Repository)

仓库是集中存放镜像文件的场所。仓库注册服务器上往往存放着很多仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签。


Docker 容器实现原理


  • Docker 容器通过 namespace 技术实现进程隔离,通过 cgroup 技术实现容器进程可用资源的限制。Docker 启动一个容器时,实际是创建了包含多个 namespace 参数的进程。

0836f6584f514678976cd39037b73f94.png


Namespace


  • Namespace:命名空间
  • 作用:资源隔离。
  • 原理:namespace 将内核的全局资源进行封装,使得每个 namespace 都有一份独立的资源。因此不同进程在各自 namespace 内对同一资源的使用不会相互干扰。


214bcf7be0b54347be49af860b5ce9f1.png


PID namespace 隔离示例


以交互模式启动一个 centos 容器,并在其中运行 /bin/bash 程序。执行 ps 命令查看到 “/bin/bash” 是 PID=1 的进程,即 Docker 将其隔离与宿主机中的其他进程之外。


eb5b85080bf24ae5af8a82ce33639f81.png

  • 打开另一个终端,使用 docker inspect 查看容器进程在宿主机上的真实 PID 。实际上,该容器上运行的 “/bin/bash” 在宿主机上的 PID=96745 的进程。


Cgroups


Cgroups:Linux Control Groups

作用:限制一个进程组对系统资源的使用上限,包括 CPU 、内存、Block I/O 等。

Cgroups 还可以设置进程优先级,对进程进行挂起和恢复等操作。

原理:将一组进程放在一个 Cgroup 中,通过给这个 Cgroup 分配指定的可用资源,达到控制这一组进程可用资源的目的。

实现:在 Linux 中,Cgroups 以文件和目录的方式组织在操作系统的 /sys/fs/cgroup 路径下。该路径中所有的资源种类均可被 Cgroup 限制。


31fbf752670a4172a477e04f292d81ca.png

容器镜像

  • 容器镜像是容器的模板,容器时镜像的运行实例,runtime 根据容器镜像创建容器。

0edb4d9f639b4ae4b05605cc6b7f3703.png

容器镜像挂载在容器根目录下,为容器中的应用提供执行环境的文件系统。


容器镜像打包了整个操作系统的文件和目录,也包括应用本身,即应用及其运行所需的所有依赖都被封装在容器镜像中。

容器镜像采用分层结构:


所有容器共享宿主机 Kernel ,并且不能修改宿主机 Kernel 。即容器运行过程中使用容器镜像中的文件,使用宿主机 OS 上的 Kernel 。


37bc91406fdd473a8e248ef997e837ad.png


UnionFS 联合文件系统



  • UnionFS 主要的功能是将多个不同位置的目录联合挂载到同一个目录下。
  • 每一个镜像层都是 Linux 操作系统文件与目录的一部分。在使用镜像时,docker 会将所有的镜像层联合挂载到一个统一的挂载点上,表现为一个完整的 Linux 操作系统提供容器使用。


83516989e9dd476fb2ea3b9cb0a3c9c1.png


容器数据卷


卷就是目录或文件,存在于一个或多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System 提供一些用于持续存储或共享数据的特性。卷的设计目的就是数据的持久化,完全独立与容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。


启动容器的时候直接使用 -v 命令就可以进行数据卷的挂载。

还可以在 Dockerfile 中使用 VOLUME 指令来个镜像添加一个或多个数据卷。



6e18431cd1f5412e9a71425fcc87d15d.png

容器 copy-on-write 特性

对容器的增删改查操作:

4c9f8f8bfc764cfeb772381fa565d6d5.png


Registry


Registry 是存放容器镜像的仓库,用户可以进行镜像下载和访问,分为公有和私有两类。


公有镜像仓库


Docker Hub 是 Docker 公司为公众提供的托管 Registry 。

Quay.io 现为 Red Hat 下的公共托管 Registy 。

acdd9573456e4c5c9fde62069d309be2.png


私有镜像仓库


企业可以用 Docker Registry 构建私有的 Registry 。

0339c384964941c6b6086dbc6f73cc13.png


Docker Hub

  • Docker Hub 是目前世界上最大的容器镜像仓库,由 Docker 公司维护,并提供官方镜像及大量用户上传的镜像。



596720addc3c4f7eac771d5baba89ae6.png


2.3 如何使用 Dockerfile 构建镜像

如何构建镜像

  • Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

42d0d7ae7c41487584014bfe16609050.png

Dockerfile


Dockerfile :文件指令集,描述如何自动创建 Docker 镜像。

Dockerfile 是包含若干指令的文本文件,可以通过这些指令创建出 docker image 。

Dockerfile 文件中的指令执行后,会创建一个个新的镜像层。

Dockerfile 文件中的注释以"#"开始。

Dockerfile 一般由 4 部分组成“

基础镜像信息

维护者信息

镜像操作指令

容器启动指令

build context :为镜像构建提供所需的文件或目录。


Dockerfile 常用指令


f7c489e782f946d298331db99aa9c4f5.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 。


bfe6426de92d4b938617fd2af09b4f52.png


Dockerfile 示例 (2)

7a955d70e6454e0e8d0bb9f99c49f29f.png

镜像命名


  • 镜像名称格式
  • image name = repository:tag
  • tag 一般用于描述镜像版本,若未指定 tag ,则默认为 “latest” 。


5555f8e52c684a53845e238934d49b65.png

搭建私有 Registry 示例 (1)


使用 “registry" 镜像构建本地镜像仓库。registry 是 docker hub 上维护的镜像,其服务端口是 5000 。-v 参数将宿主机的 /root/myregistry 目录映射到容器的 /var/lib/registry 目录,用于存放镜像数据。

8ab9e8f6e6514ff1a9fb1f14fa470214.png



使用 docker tag 命令修改镜像名称,使其符合 registry 上的格式要求。若要将镜像上传到 registry ,镜像名称需要符合其命名格式要求:[Registry-host]:[port]/[username]/[repository:tag] 。

e48f05b4db57433882450b1945144cb0.png



上传容器镜像到私有 Registry 。


480277bde3a1410ab20f21d015000d71.png

搭建私有 Registry 示例 (2)


  • 在 Linux 下,若使用如 “192.168.137.99:1000” 这样的内网地址作为私有仓库地址,则需要在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在需新建该文件),然后重启 Docker 服务。

上传 SWR 镜像仓库

  • 连接容器镜像服务。登录容器镜像服务控制台,复制登陆指令,在安装容器引擎的机器中执行。


  • 在安装容器引擎的机器上执行以下命令,为 nginx 镜像打标签。

  • 上传镜像至镜像仓库。


  • 终端显示如下信息,表明上传镜像成功。

2.4 容器生命周期管理


查看 Docker 服务状态

  • 查看 Docker engine 状态

运行一个容器 (1)


  • 执行 docker run 命令运行一个容器。
  • “-d” 参数可在后台运行容器;“-p” 参数将宿主机 8080 端口映射到容器 80 端口。

运行一个容器 (2)


  • 使用 docker images 查看下载的镜像。

  • 使用 docker ps 命令查看容器运行状态,

  • 在浏览器上输入 “宿主机IP:端口” ,验证容器的可用性。


8a1f99987dab4326b13bb74cef0392ec.png


容器生命周期管理 (1)

  • 使用 docker stop 命令停止一个容器。


870d9ce09b65466387aff27ed62067e1.png


  • 使用 docker ps -a 查看所有状态的容器,状态是 Exited 。

  • 使用命令 docker start 命令启动一个容器。




  • 使用命令 docker start 命令启动一个容器,状态是 Up 。

容器生命周期管理 (2)


  • 使用 docker pause 命令暂停一个容器。

  • 使用命令 docker ps - a 查看所有状态的容器,状态是 Paused 。




  • 使用命令 docker unpause 恢复启动一个容器。

  • 使用命令 docker unpause 命令恢复一个容器,状态是 Up 。

容器生命周期管理 (3)

  • 使用 docker rm 命令删除一个容器。

  • 使用命令 docker ps -a 查看所有状态的容器,该容器已删除。

  • docker rm 一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令。

进入一个容器

  • 使用 docker attach 命令进入一个容器

  • 使用 docker exec 命令进入同一个容器


a5ec8a2ca21f4fc5bab03ffd6b4b7599.png


其他常见命令

  • 使用 docker inspect 获取容器/镜像元数据。
  • 使用 docker top 命令查看容器中运行的进程信息。

  • 使用 docker events 从服务器获取实时事件。

96713014092e45cd83f8f07969f0e70e.png


  • 使用 docker port 列出指定的容器的端口映射。

  • 使用 docker cp 与主机之间进行数据拷贝。

bdc0fd3afbda4c1e9fa3ec4d67828961.png


思考题

19732ab5ae154f28ad968ea2a70f05e0.png


答案:ABCD

914915bcd15041c59fe9b7850ae0374f.png


答案: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 ,不同虚拟化环境的虚拟机之间互相迁移、转换。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
19天前
|
运维 Cloud Native 安全
云原生技术在现代企业中的应用与挑战####
本文探讨了云原生技术在现代企业IT架构中的关键作用,分析了其带来的优势和面临的主要挑战。通过实际案例分析,揭示了如何有效应对这些挑战,以实现业务敏捷性和技术创新的平衡。 ####
|
16天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
15天前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
21天前
|
Kubernetes Cloud Native 物联网
云原生技术在现代软件开发中的应用与挑战####
本文探讨了云原生技术的兴起背景、核心理念及其在现代软件开发中的广泛应用。通过具体案例分析,揭示了云原生架构如何促进企业数字化转型,并指出了在实施过程中面临的主要挑战及应对策略。 ####
|
5天前
|
Cloud Native
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
|
16天前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
15天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
17天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器化到微服务
本文将带领读者踏上云原生的旅程,深入探讨容器化和微服务架构的概念、优势以及它们如何共同推动现代软件的发展。我们将通过实际代码示例,展示如何在Kubernetes集群上部署一个简单的微服务应用,并解释相关的配置和操作。无论你是云原生新手还是希望深化理解,这篇文章都将为你提供有价值的见解和实操指南。
|
18天前
|
运维 Cloud Native 开发者
云原生技术入门与实践
在云计算的浪潮中,云原生技术以其独特的优势和魅力吸引了越来越多的开发者和企业。本文将从云原生技术的基本概念、核心组件以及实际应用三个方面进行详细介绍,帮助读者更好地理解和掌握这一新兴技术。同时,文章还将分享一些实际案例和经验教训,让读者能够更深入地了解云原生技术的应用场景和发展趋势。
34 5
|
16天前
|
Cloud Native 持续交付 云计算
云原生技术的崛起与未来展望
本文探讨了云原生技术的核心概念、发展历程及其在现代IT架构中的关键作用。随着云计算的普及,云原生作为一种优化云应用构建和部署的方法,正逐渐成为企业数字化转型的重要推力。文章分析了容器化、微服务、持续集成/持续部署(CI/CD)等关键技术如何支撑起灵活、高效、可扩展的云原生架构,并讨论了面临的挑战与未来的发展趋势。
30 2

热门文章

最新文章

下一篇
DataWorks