容器和K8S基础概念(上)| 学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习容器和K8S基础概念(上)

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:容器和 K8S 基础概念(上) 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14490


容器和 K8S 基础概念(上)

课程介绍

本课程是云原生方向学习领域的基础课程,是成为云原生运维和实践工程师的必修课程。课程将从最基础的云原生概念开始讲起,帮助学员正确认识和理解云原生和K8s 的发展历程、原理、相关组件和基本操作,掌握如何定义应用的资源需求、创建和使用。

 

课程纲要

第一章:云原生和 k8s 基础入门

第二章:阿里云容器技术深入介绍

第三章:kubernetes 集群原理深度解析

第四章:ack 集群管理

第一章 云原生和 K8s 基础入门

本章目标

Ÿ 了解云原生主流技术容器、容器镜像、镜像仓库、Kubernetes 等基本概念,理解 Kubernetes 的架构、集群与部署、Service、Pod 等概念与基本操作;

Ÿ 理解 Pod 和容器设计模式,理解应用编排模式;

Ÿ 掌握如何定义应用的资源需求、创建和使用;

Ÿ 理解应用存储和持久化数据卷中的存储快照与拓扑调度的基本概念、操作使用,以及内部工作机制;

Ÿ 理解 Kubernetes 基本网络模型与原理。


本章目录

Ÿ 容器和 K8s 基础概念

Ÿ 理解 Pod 和容器

Ÿ kubectl 客户端使用方法

Ÿ 如何创建应用和暴露服务

Ÿ kubernetes 存储

Ÿ kubernetes 网络

Ÿ 实验一:从 0 开始创建云原生应用

 

第一章第1讲 容器和 K8s 基础概念(上)

视频地址 https://developer.aliyun.com/learning/course/913/detail/14490

本讲主要介绍容器基础知识,包括:容器的特征、容器与虚拟机的区别、容器怎么制作、dockerfile 和 docker 常用命令、容器和镜像及仓库之间的关系等。

 

一、容器是什么

谈到容器、K8s 或者云原生、微服务,它们之间的关系是什么?对容器的第一印象又是什么?

什么是容器,什么是容器镜像?怎么制作容器镜像?如何运行容器镜像?什么是镜像仓库?希望在学完本节课后,能够对如上问题有自己的回答和了解。

image.png

1. 思考:容器的本质是什么?

 image.png

容器的第一概念可以类比为装水的杯子、盛饭的碗。容器( Container )的中文解释为集装箱,集装箱有如下特点:

Ÿ 集装箱是有一定标准长宽高的长方体;

Ÿ 集装箱关注点不在装载地点和卸载地点,而注重运行的货物是否正常;

Ÿ 集装箱有隔离的作用;

Ÿ 集装箱不关心装载的内容,只需要产品能装进去。

而容器也有类似的特点。

image.png

2. 容器的四个特点:

Ÿ 容器运行需要特定运行环境,如 Docker、Containerd;

Ÿ 容器支持不同的底层操作系统,如主流 Linux 操作系统,阿里云 Ack 支持 Windows 操作系统,即对于阿里云 Ack 容器可以部署到 Windows 操作系统上;

Ÿ 容器之间是相互隔离的,利用 Cgroup 技术对相关资源的限制和 Namespace 命名空间的隔离;

Ÿ 轻量便捷性,使应用可以更快速部署和迁移。

3. 容器技术可以解决什么问题?

image.png

Ÿ 在生产环境开发中,开发者首先要在测试环境中完成开发、测试并符合一定测试条件和测试结果后,才可以在生产环境中发布。但是在发布过程中,常常会遇到在测试环境可以正常运行、但生产环境却无法运行的问题。

Ÿ 这种问题一般是由于底层操作系统不一致、导致环境变量或环境库的不一致造成的,而开发者却需要花费大量时间,去解决这种测试环境和生产环境不一致的问题,而开发者的重心不在底层操作系统,如何才能让开发者把精力花费在上层应用上,而不是关注底层操作系统的不一致问题呢?

Ÿ 容器技术解决了上述这个问题。

4. 虚拟机和容器对比

虚拟机是一项虚拟化技术,同样具有隔离性,它与容器有什么区别呢?

a. 什么是虚拟机

Ÿ 虚拟机的基本原理

虚拟机基于物理级别的 CPU、Memory、IO,利用 Hypervisor 虚拟化技术转化为虚拟的 CPU、Memory、IO,上层的虚拟机基于虚拟的 CPU、Memory、IO 安装操作系统,然后在该操作系统上安装应用和必要的运行库。

Ÿ 当前比较流行的虚拟机

VMware 虚拟机、微软 Hyper-V 虚拟机、Linux 下 KVM 虚拟机等。

b. 虚拟机和容器架构对比

image.png

Ÿ  虚拟机架构:

在上图中,一个宿主机上可以装三个操作系统, A 可能是 Linux 操作系统,B 可能是 Windows 操作系统,C 可能是 Centos 操作系统,每个操作系统是相互隔离的,每个虚拟机都会认为自己是单独的机器,不仅需要对虚拟机维护,还需要关注客户机操作系统的维护。

Ÿ  容器架构:

容器与虚拟机基础架构是一致的,其主机操作系统可以是 Windows 或 Linux ,在主机操作系统上安装 Runtime ,可以为 Docker 或 Containerd 的运行环境,基于容器运行环境启动了三个容器,分别为容器 A、容器 B、容器 C,包含了各自的应用以及应用需要的相关库文件,而容器共用宿主机的操作系统;

Ÿ  对比:

ž  启动速度:启动虚拟机的是分钟级别,而容器启动是秒级别;

ž  迁移:如果需要将 VMware 虚拟机迁移到微软的 Hyper-V,则需要按照一定标准格式将虚拟机转换为镜像,然后将镜像转换为符合 Hyper-V 的格式,然后才能在微软 Hyper-V 的场景下运行;容器迁移非常简单,可以直接将镜像迁移到 Windows 系统或 Linux 系统容器环境下运行起来。

Ÿ 问题:

Q:容器 A、容器 B、容器 C 之间是如何实现隔离的?

A:它们是通过 Cgroup 和 Namespace 技术隔离的。

Q:容器 A、容器 B、容器 C 能否通过主机操作系统 ps -ef 看到 A、B、C 三个应用呢?

A:当然是可以看到的,三个应用实现了命名空间级别的隔离。

 

二、什么是容器镜像

容器启动是基于容器镜像,怎么理解容器镜像呢?

image.png

1. 定义

容器镜像是运行容器所需要的所有文件集合。容器镜像可以抽象为一个安装包,而安装包具有只读特点(如钉钉安装包 exe 文件),当安装包被执行后就具有可写的功能。

2. 容器镜像的特点

容器镜像是基于 Linux UniFileSystem 联合文件系统,具有分层结构,最基础层是 bootfs 层,其作用是启动时加载 Kernel,而后 bootfs 就会退出并将控制权交给 rootfs,rootfs 基于镜像加载。

image.png

如图,基于 Debian 操作系统、emacs、Apache 一层层叠加,然后运行成容器后才是可读可写的,在此之前都是只读层。

Ÿ 通过 docker search 命令,可以查找镜像,如查找 nginx 镜像:

docker search nginx

Ÿ 通过 docker pull 命令,可以拉取镜像,如从镜像仓库拉取 centos 镜像:

docker pull centos

如果存在多个镜像,如镜像1:centos、apache、redis,镜像2:centos、nginx、mysql,镜像只读保证了镜像的唯一性,可以实现镜像的复用,节省空间,在拉取镜像时如果本地已存在,节省了拉取时间和带宽。

3. 如何构建镜像?

构建镜像有如下两个命令:

Ÿ docker commit:把正在运行的一个容器制作镜像;

Ÿ docker build:基于 dockerfile 文件构建镜像;

不推荐使用 docker commit 构建镜像,推荐使用 Dockerfile 文件和 docker build命令来构建镜像,更具备可重复性、透明性以及幂等性。

命令示例:docker build -t zuorong:v1 .

参数说明:

build:主要命令,告诉 Docker 服务端以 Dockerfile 文件构建镜像;

-t:--tag 指定镜像的名称和标签;

zuorong:仓库及镜像名称(可多级目录)

v1:镜像版本号;

.:代表上下文路径,docker 会把上下文路径下面的文件和目录上传到 Docker 守护进程,一般是 Dockerfile 文件所在目录。

Docker 基础命令:

docker create:创建一个停止的容器;

docker ps -a:类似 Linux 环境下 ps -ef 可以看哪些程序在运行;

docker start:启动容器。

示例:创建一个基于 centos 的 Tomcat 的镜像文件

a. 实现途径

Ÿ 有一个基本的 centos

Ÿ 自己本地要有个 tomcat

Ÿ jdk 程序

Ÿ 设置好环境变量

Ÿ 暴露出端口

Ÿ 工作目录设置

Ÿ 自己要启动 tomcat

b. 编写 Dockerfile 示例

FROM centos

LABEL yanche<dddeaIiyun.com>

#把宿主机当前上下文的c.txt拷贝到容器 /usr/local/ 路径下

COPY a.txt /usr/local/cincontainer.txt

#把 java 与 tomcat 添加到容器中

ADD jdk-8u311-linux-x64.tar.gz /usr/1oca1/

ADD apache-tomcat-9.0.33.tar.gz /usr/local/

#安装 vim 编辑器

RUN yum -y install vim

#设置工作访问时候的 WORKDIR 路径,登录落脚点

ENV MYPATH /usr/local

WORKDIR $MYPATH

#配置 java 与 tomcat 环境变量

ENV JAVA_HOME/usr/1oca1/idk1.8.0311

ENV CLASSPATH $JAVAHOME/1ib/dt.jar:$JAVAHOME/lib/tools.jar

ENV CATALINA HOME /usr/local/apache-tomcat-9.0.33

ENV CATALINABASE /usr/local/apache-tomcat-9.0.33

ENV PATH SPATH:$JAVA_HOME/bin:SCATALINA HOME/1ib:SCATALINA_HOME/bin

#容器运行时监听的端口

EXPOSE 8080

#启动时运行 tomcat

CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh&&tail - F /usr/local/apache-tomcat-9.0.33/log/catalina.out

Dockerfile 指令简单介绍

Ÿ FROM:指定基于的基础镜像;

Ÿ MAINTAINER:表明作者身份已被弃用,现在使用 LABEL 替代;

Ÿ  ADD和 COPY 类似,ADD 具有解压缩功能,COPY 没有解压缩功能;

Ÿ WORKDIR:指定工作目录;

Ÿ EXPOSE:指定开放端口;

Ÿ RUN 运行 Linux 下的命令,如安装 vim  命令 RUN yum -y install vim;

Ÿ VOLUME:定义存储挂载功能;

Ÿ ENTRYPOINT:容器启动时执行的默认命令;

Ÿ CMD:用于启动应用程序,如 CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh&&tail - F /usr/local/apache-tomcat-9.0.33/log/catalina.out,启动 tomcat 服务并打印 tomcat 日志。

Dockerfile 指令官方文档参考:

https://docs.docker.com/engine/reference/builder/

基于如上 Dockerfile ,在服务器上执行 docker build 命令创建出镜像,创建镜像时要基于原始镜像如 ubuntu:14.04 ,进行相关步骤操作,然后经过 Docker 镜像,执行 run 命令进行容器的运行,VOLUME 挂载卷将在后面讲解。

image.png

 

三、如何运行容器?

image.png

1. 运行容器步骤

Ÿ 第一步:从镜像仓库中将相应的镜像下载下来;

Ÿ 第二步:当镜像下载完成之后,就可以通过 docker images 来查看本地镜像,这里会给出一个完整的列表,可以在列表中选中想要的镜像;

Ÿ 第三步:当选中镜像之后,就可以通过 docker run 来运行这个镜像得到想要的容器,当然可以通过多次运行得到多个容器。一个镜像就相当于是一个模板,一个容器就像是一个具体的运行实例,因此镜像就具有了一次构建、到处运行的特点。

2. Docker 常用命令

image.png

docker images:列出所有镜像

docker rmi 镜像 ID:删除镜像

docker history:查看镜像历史

docker tag:给镜像打标签

docker run:运行容器

docker create:创建一个 stop 状态容器,可以进行 start、pause、kil、stop、unpause 等操作

docker commit:从容器创建一个新镜像

diff:镜像和容器可以使用 diff 进行对比

build:创建镜像

pull:拉取镜像

push:推送镜像

login、logout 登录和退出仓库

docker logs 容器 Id:查看容器日志

docker logs -f:查看容器实时日志

文件和宿主机之间传输类似 scp 方式,如将 a.txt 复制到容器/tmp 目录下:docker cp a.txt 运行容器 Id:/tmp

进入容器命令:docker exec -it 运行容器 Id sh

进入容器/tmp 目录下可以看到 a.txt 文件。

 

四、什么是镜像仓库

image.png

类似于代码仓库,镜像仓库是集中存放容器镜像的场所。

 

本讲小结

1、容器的三要素:

Ÿ 容器:容器可以用来装业务程序和依赖的环境。本质上就是一个加了限定参数的进程。

Ÿ 镜像:运行容器所需要的所有文件集合。

Ÿ 镜像仓库:镜像仓库是集中存放容器镜像的场所。

2、本节主要内容

Ÿ 容器的基本概念,容器几个特征,和虚拟机的区别,选择容器原因;

Ÿ 容器特征:快速部署、隔离、轻量化;

Ÿ 和虚拟机的区别:有自己操作系统,共用宿主机操作系统;

Ÿ 选择容器原因:不用关注底层的操作系统环境,只用关注应用层;

Ÿ 容器怎么制作,dockerfile 几个命令 ( add,from );

Ÿ 制作方式:dockerfile 和 Commit;

Ÿ docker 的命令 images,ps,exec,1ogs;

Ÿ 容器,镜像,仓库之间的联系。

思考:容器和 K8s 之间关系是什么?K8s 又是什么?K8s 基本组成,有什么特点,和容器及 Docker 之间的关系?这些问题将会在下一节进行讲解。

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
21天前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
10天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
72 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
22天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
8天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
21天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
84 24
|
23天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
存储 Kubernetes 监控
为容器和 Kubernetes 构建应用程序的7个最佳实践
为容器和 Kubernetes 构建应用程序的7个最佳实践
151 0
|
存储 Kubernetes 监控
为容器和 Kubernetes 构建应用程序的 7 个最佳实践
当容器和 Kubernetes 变得日益普及时,我们更需要做的是保持清醒,不要被欺骗,误认为应该使用它们来运行任何类型的应用程序。
|
6天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
39 12
|
10天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
28 2

相关产品

  • 容器服务Kubernetes版