企业级运维之云原生与Kubernetes实战课程 - 第一章第1讲 容器和K8s基础概念(上)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本课程是云原生方向学习领域的基础课程,是成为云原生运维和实践工程师的必修课程。课程将从最基础的云原生概念开始讲起,帮助学员正确认识和理解云原生和K8s的发展历程、原理、相关组件和基本操作,掌握如何定义应用的资源需求、创建和使用。

企业级运维之云原生与Kubernetes实战课程

 

 

课程介绍

 

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

 

课程纲要

 

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

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

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

第四章:ack集群管理

 

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

 

本章目标

 

  • 了解云原生主流技术容器、容器镜像、镜像仓库、Kubernetes等基本概念,理解Kubernetes的架构、集群与部署、ServicePod等概念与基本操作;
  • 理解Pod和容器设计模式,理解应用编排模式;
  • 掌握如何定义应用的资源需求、创建和使用;
  • 理解应用存储和持久化数据卷中的存储快照与拓扑调度的基本概念、操作使用,以及内部工作机制;
  • 理解Kubernetes基本网络模型与原理。

 

本章目录

 

  • 容器和K8s基础概念
  • 理解Pod和容器
  • kubectl客户端使用方法
  • 如何创建应用和暴露服务
  • kubernetes存储
  • kubernetes网络
  • 实验一:从0开始创建云原生应用

 

 

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

 

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

 

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

 

一、容器是什么

 

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


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

 image.png

 

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

 image.png

 

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

  • 集装箱是有一定标准长宽高的长方体;
  • 集装箱关注点不在装载地点和卸载地点,而注重运行的货物是否正常;
  • 集装箱有隔离的作用;
  • 集装箱不关心装载的内容,只需要产品能装进去。

 

而容器也有类似的特点。

 image.png

 

2. 容器的四个特点:

 

  • 容器运行需要特定运行环境,如DockerContainerd
  • 容器支持不同的底层操作系统,如主流Linux操作系统,阿里云Ack支持Windows操作系统,即对于阿里云Ack容器可以部署到Windows操作系统上;
  • 容器之间是相互隔离的,利用Cgroup技术对相关资源的限制和Namespace命名空间的隔离;
  • 轻量便捷性,使应用可以更快速部署和迁移。

 

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

 image.png

 

  • 在生产环境开发中,开发者首先要在测试环境中完成开发、测试并符合一定测试条件和测试结果后,才可以在生产环境中发布。但是在发布过程中,常常会遇到在测试环境可以正常运行、但生产环境却无法运行的问题。
  • 这种问题一般是由于底层操作系统不一致、导致环境变量或环境库的不一致造成的,而开发者却需要花费大量时间,去解决这种测试环境和生产环境不一致的问题,而开发者的重心不在底层操作系统,如何才能让开发者把精力花费在上层应用上,而不是关注底层操作系统的不一致问题呢?
  • 容器技术解决了上述这个问题。

 

4. 虚拟机和容器对比

 

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

 

a.  什么是虚拟机

 

  • 虚拟机的基本原理

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

 

  • 当前比较流行的虚拟机

VMware虚拟机、微软Hyper-V虚拟机、LinuxKVM虚拟机等。

 

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

 image.png

 

  • 虚拟机架构:

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

 

  • 容器架构:

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

 

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

 

  • 问题:

 

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

A:它们是通过CgroupNamespace技术隔离的。

 

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

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

 

二、什么是容器镜像

 

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

 image.png

 

1.  定义

 

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

 

2.  容器镜像的特点

 

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

 image.png

 

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

 

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

     docker search nginx

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

     docker pull centos

 

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

 

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:启动容器。

 

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

 

a.  实现途径

 

  • 有一个基本的centos
  • 自己本地要有个tomcat
  • jdk程序
  • 设置好环境变量
  • 暴露出端口
  • 工作目录设置
  • 自己要启动tomcat

 

b.  编写Dockerfile示例

 

FROM centos

LABEL yanche

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

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

#javatomcat添加到容器中

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

 

#配置javatomcat环境变量

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/1ibSCATALINA_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替代;
  • ADDCOPY类似,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状态容器,可以进行startpausekilstopunpause等操作

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

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

build:创建镜像

pull:拉取镜像

push:推送镜像

loginlogout登录和退出仓库

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几个命令 (addfrom)
  • 制作方式:dockerfileCommit
  • docker的命令imagespsexec1ogs
  • 容器,镜像,仓库之间的联系。

 

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

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible实战应用
【9月更文挑战第33天】本文将带你深入理解Ansible,一个强大的自动化运维工具。我们将从基础概念开始,逐步探索其配置管理、任务调度等功能,并通过实际案例演示其在自动化部署和批量操作中的应用。文章旨在通过浅显易懂的语言和实例,为读者揭开Ansible的神秘面纱,展示其在简化运维工作中的强大能力。
170 64
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
162 3
|
29天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
326 11
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
12天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
43 5
|
24天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
48 4
|
26天前
|
消息中间件 运维 UED
消息队列运维实战:攻克消息丢失、重复与积压难题
消息队列(MQ)作为分布式系统中的核心组件,承担着解耦、异步处理和流量削峰等功能。然而,在实际应用中,消息丢失、重复和积压等问题时有发生,严重影响系统的稳定性和数据的一致性。本文将深入探讨这些问题的成因及其解决方案,帮助您在运维过程中有效应对这些挑战。
27 1
|
2月前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
2月前
|
运维 关系型数据库 MySQL
自动化运维工具Ansible的实战应用
【10月更文挑战第9天】在现代IT运维领域,效率和可靠性是衡量一个系统是否健康的重要指标。自动化运维工具Ansible因其简洁、易用的特性,成为了众多企业和开发者的首选。本文将通过实际案例,展示如何利用Ansible进行日常的运维任务,包括配置管理、软件部署以及批量操作等,帮助读者深入理解Ansible的应用场景及其带来的效益。
|
1月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
141 0
|
2月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
76 0

相关产品

  • 容器服务Kubernetes版