kubernetes入门到进阶(3)

2023-12-22 07:42:18

容器的应用

会了这些你就是容器高手

#本篇的镜像可能会有拉取的问题,大家可以以同样的方式拉取别的镜像来实验,效果相同。

在上一个章节当中,我们了解了容器技术中最核心的概念,容器,知道他就是一个系统中被隔离的特殊环境,进程可以在其中不收干扰的运行,我们也可以把这段描述再简化一点:容器就是被隔离的进程

相比笨重的虚拟机,容器有许多有点,那我们应该如何创建并运行容器呢?是要用Linux内核里的namespace、cgroup、chroot三件套吗?

当然不会,那样的方式实在是太原始了,所以今天,我们就以docker为例,来看看什么是容器化的应用,那么来操纵容器化的应用

什么是容器化的应用

之前我们运行容器的时候,显然不是从零开始的,而是要拉去一个镜像(image),再从这个镜像来启动容器,像第一个章节里写的一样【kubernetes入门到进阶-1-CSDN博客

那么这个镜像到底是什么东西呢?他和容器有什么关系呢?

其实我么在其他场合中也曾经见到过镜像这个词,比如常见的光盘镜像,重装电脑时使用的硬盘镜像,还有虚拟机系统镜像,这些镜像都有一些相同点,只读,不允许修改,以标准格式存储了一系列的文件,然后在需要的时候再从中提取出数据运行起来

容器技术里的镜像也是同样的道理,因为容器是有操作系统动态创建的,那么必然就可以用一种办法把他的初始化环境给固化下来,保存成一个静态文件,相当于是把容器给拍扁了,这样就可以非常方便的存放、传输。版本化管理了。

如果还拿之前的小板房来做比喻的话,那么镜像就可以说是一个样板间,把运行进程所需要的文件系统,依赖库,环境变量,启动参数等所有信息打包整合到了一起,之后镜像文件无论放在哪里,操作系统都能根据这个样板间快速重建容器,应用程序看到的就会是一致的运行环境了

从功能上来看,镜像和常见的tar、rpm、deb、等安装包一样,都打包了应用程序,但最大的不同点在于它里面不仅有基本的可执行文件,还有应用运行时的整个系统环境,这就让镜像具有了非常好的跨平台便携性和兼容性,能够让开发者在一个系统上开发,然后打包成镜像,再去另一个系统上运行(例如centos),完全不需要考虑环境依赖的问题,是一种更高级的应用打包方式

理解了这一点,我们在回过头来看看本章节里运行的docker命令

docker?pull?busybox,这就是获取了一个打包的busybox应用的镜像,里面固化了busybox程序和它所需的完整运行环境

docker?run?busybox?echo?hello?world?,就是提取镜像里的各种信息,运用namespace,cgroup,chroot技术创建出隔离环境,然后再运行busybox的echo命令,输出hello?world?的字符串

这两个步骤,由于是基于标准的Linux系统调和和只读的镜像文件,所以,无论是哪种操作系统上,或者是使用哪种容器实现技术,都会得到完全一致的结果

推而广之,任何应用都能够用这种形式打包再分发后运行,这也是无数开发者梦寐以求的“一次编写到处运行”(Build?once,Run?anywhere)的至高境界,所以,所谓的“容器化的应用,或者应用的容器化”,就是指应用程序不在直接和操作系统打交道,而是封装成镜像,再交给容器环境去运行.

现在你就应该知道了,竞相就是静态的应用容器,容器就是动态的应用镜像,两者互相依存,互相转化,密不可分

之前的那张docker官方架构图大家都还有印象吧,我们在第一节课曾经简单的介绍过,可以看到,在docker里的核心处理对象就是镜像(image)和容器(container)

理解了什么是容器化的应用,接下来我们再来学习怎么操纵容器化的应用,因为竟像是容器运行的根本,先走镜像才有容器,所以先来看看关于镜像的一些常用命令。

常用的镜像操作有哪些

在前面的章节里你应该已经了解了两个基本命令,docker?pull?从远端仓库拉取镜像,docker?images?列出当前本地已有的镜像

docker?pull?的用法还是比较简单的,和普通的下载非常像,不过我们需要知道镜像的命名规则,这样才能更准确的获取到我们想要的容器镜像

镜像的完成名字有两个部分组成,名字和标签,中间用:连接起来

名字表名了应用的身份,比如busybox,Alpine,Nginx,Redis等等,标签(tag)则可以理解成为是为了区分不同版本的应用而坐的额外标记,任何字符串都可以,比如3.15是纯数字的版本号,jammy是项目代号,1.21-alpine是版本号加操作系统名等等,其中有一个比较特殊的标签叫latest,他是默认的标签如果只提供名字没有附带标签,那么就会使用这个默认的latest标签。

那么现在,你就可以把名字和标签组合起来,使用docker?pull?来拉取一些镜像了

docker?pull?alpine:3.15

docker?pull?nginx:1.21-alpine

docker?pull?nginx:alpine

docker?pull?redis?

有了这些镜像以后,我们再用docker?images命令来看看他们的具体信息

在这个列表里,你可以看到REPOSITORY列就是镜像的名字,TAG就是这个镜像的标签,那么第三列IMAGE?ID?又是什么意思呢?

他可以说是镜像的唯一标识,就好像是身份证号一样,比如这里我么你可以用ubuntu:lammy来表示ubuntu22.04镜像,同样也可以用它的ID来表示

IMAGE?ID还有一个好处,因为他是16进制形式且唯一,docker?特意为他提供了短路操作,在本地使用镜像的时候,我们不用像名字那样要完全写出来这一长串数字,通常只需要写出前三位就能够快速定位,在镜像数量比较少的时候用两位甚至以为数字也许就可以了

来看另一个镜像操作命令,docker?rmi,他用来删除不再使用的镜像,可以节约磁盘空间,注意命令rmi,实际上是remov?image的简写

下面我们就来试验一下,使用名字和IMAGE?ID来删除镜像

docker?rmi?nginx:1.21-alpine

?docker?rmi?01

这里的第一个rmi删除了nginx镜像,在不写标签的时候,默认删除的就是latest,第二个rmi没有给出名字,而是直接使用了IMAGE?ID的前两位,也就是01,docker就会直接找个这个ID前缀的镜像然后删除

docker里与镜像相关的命令还有很多,不过以上的docker?pull、docker?images、docker?rmi?

就是最常用的三个了,其他的命令我们后面的章节里会陆续介绍

常用的容器操作有哪些

现在我们已经本地存放了镜像,就可以使用docker?run?命令把这些静态的应用运行起来,变成动态的容器了

基本的格式是docker?run设置参数,在跟上“镜像名或ID”,后面可能还会有附加的“运行命令”

比如:

docker?run?-h?srv?alpine?hostname?

这里的-h?srv就是容器的运行参数,alpine是镜像名,他后面的hostname表示要在容器里运行的hostname这个程序,输出主机名

docker?run?是最复杂的一个容器操作命令,有非常多的额外参数用来调整容器的运行状态,你可以加上--help来看他的帮助信息,今天我只说了几个最常见的参数

-it?表示开启一个交互式操作的shell,这样可以直接进入容器内部,就好像是登录虚拟机一样(它实际上是-i?和?-t?两个参数的组合形式)

-d?表示让容器在后台运行,这在我们启动nginx,redis等服务器程序的时候非常有用

--name可以为容器起一个名字,方便我么你查看,不过他不是必须的,如果不用这个参数,docker会分配一个随机的名字

下面我们就来看看这三个参数,分别运行nginx,redis,等等

docker?run?-d?nginx:alpine????????????#?后台运行Nginx

docker?run?-d?--name?red_srv?redis????#?后台运行Redis

docker?run?-it?--name?ubuntu?2e6?sh???#?使用IMAGE?ID,登录Ubuntu18.04

因为第三个命令使用的是-it而不是-d?,所以他就会进入容器里的ubuntu系统,我们需要另外开一个终端窗口,使用docker?ps命令来查看容器运行的状态

这里我就不去演示了,交给大家来操作增加印象

对于正在运行中的容器,我们可以使用?docker?exec?命令在里面执行另一个程序,效果和?docker?run?很类似,但因为容器已经存在,所以不会创建新的容器。它最常见的用法是使用?-it?参数打开一个Shell,从而进入容器内部,例如:

docker?exec?-it?red_srv?sh?

这样我们就登录进了redis容器,可以很方便的来查看服务的运行状态或者日志

运行中的容器还可以使用docker?stop?命令来强制停止,这里我们仍然可以使用容器名字,不过或许用CONTAINER?ID?的前三位数字会更加方便?

docker?stop?f8c?fa1?01c

容器被停止后使用docker?ps?命令就看不到了,不过容器并没有被彻底销毁,我们可以使用docker?ps?-a?命令查看系统里的所有的容器,当然也包括已经停止运行的容器

这里大家可以去操作一下看看

这个停止运行的容器可以用docker?start?再次启动运行,如果你确定不再需要他们,可以使用?docker?rm?命令来彻底删除

注意:这个命令与docker?rmi非常像,却别在于它没有后面的字母i,座椅只会删除容器,不删除镜像

下面我们就来运行docker?rm?命令,使用?CONTAINER?ID的前两位数字来删除这些容器?

docker?rm?f8c?fa1?01c?

执行删除命令后,再用docker?ps?-a查看列表就会发现这些容器已经彻底消失了

你可能会感觉这样的容器管理方式很麻烦,启动后要ps看ID再删除,如果汕尾不注意,系统就会遗留非常多的“死”容器,占用系统资源。有没有什么办法能够让docker?自动删除不需要的容器呢?

办法当然有,就是在执行docker?run?命令的时候加上一个?--rm参数,这就会高速docker不保存容器,只要运行完毕就自动清除,省去了我们手工管理容器的麻烦

我们还是用刚才的nginx,redis,ubuntu这三个容器来试验一下,加上--rm参数(省略了那么参数):

docker?run?-d?--rm?nginx:alpine

docker?run?-d?--rm?redis

docker?run?-it?--rm?2e6?sh

然后我们用docker?stop?停止容器,再用docker??ps?-a?,就会发现不需要我们再手动执行docker?rm?,docker?已经自动删除了这三个容器

小结

这里呢,算是学习了容器化的应用,然后使用docker实际操作了镜像和容器,运行了被容器化的一些应用

镜像是容器的静态形式,他打包了应用程序的所有运行依赖项,方便保存和传输,使用容器技术运行镜像,就形成了动态的容器,由于镜像只读不可修改,多以应用程序的运行环境总是一致的,而容器化的应用就是指以镜像的形式打包应用程序,然后在容器环境里从镜像启动容器

由于docker的命令比较多,而且每个命令还有许多参数,一个章节里很难全部都讲清楚,本人的话还有手头的工作要处理,希望你可以参考一下官方的文档来帮助你一下:https://docs.docker.com/reference,再加上多多的实操练习噢!!

这里就做个镜像操作和容器操作的小结

1-常用的镜像操作有docker?pull?,docker?images,docker?rmi?,分别是拉取镜像,查看镜像和删除镜像

2-用来启动容器的docker?run?是最常用的命令,他有很多参数用来调整容器的运行状态,对于后台服务来说应该使用?-d

3-docker?exec?命令可以在容器内部执行任意程序,对于调试排错特别有用

4-其他常用的荣哪个区操作还有docker?ps?,docker?stop,docker?rm?,用来查看容器,停止容器和删除容器

这里呢,我还是继续问大家几个,看看本领学没学到家:

  1. 说一说你怼容器镜像的理解,他与rpm、deb安装包有哪些不同和优缺点?
  2. 你觉得docker?run?和docker?exec?的区别在哪里,应该怎么使用他们?

好了,本章节就到这里了,在写的时候断断续续的,也没有去捋清晰,如果有错误的话大家可以提出来,或者自行修改加深一下记忆

文章来源:https://blog.csdn.net/pengpeng0121/article/details/135123288
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。