-
6. changeset 的分层以及复用特点能够带来几点优势
-
7. 如何构建镜像?
-
8. 如何运行容器?
-
二、容器的生命周期
-
三、容器项目架构
-
四、容器 对比 VM
===========================================================================
补充
操作系统是如何管理进程 的
。首先,当我们登录到操作系统之后,可以通过 ps 等操作看到各式各样的进程
,这些进程包括系统自带的服务和用户的应用进程。
第一,这些进程可以相互看到、相互通信;
第二,它们使用的是同一个文件系统,可以对同一个文件进行读写操 作;
第三,这些进程会使用相同的系统资源。
- 因为这些进程能够相互看到并且进行通信,高级权限的进程可以攻击 其他进程;
- 因为它们使用的是同一个文件系统,因此会带来两个问题:
这些进程可以对于已有的数据进行增删改查,具有高级权限的进程可能会将其 他进程的数据删除掉,破坏掉其他进程的正常运行;
此外,进程与进程之间的依赖可能会存在冲突,如此一来就会给运维带来很大的压力;
- 因为这些进程使用的是同一个宿主机的资源,应用之间可能会存在资 源抢占的问题,当一个应用需要消耗大量 CPU 和内存资源的时候, 就可能会破坏其他应用的运行,导致其他应用无法正常地提供服务。
- 针 对 不 同 进 程 使 用 同 一 个 文 件 系 统 所 造 成 的 问 题 而 言 , Linux 和 Unix 操作系统可以通过 chroot 系统调用将子目录变成根目 录,达到视图级别的隔离;进程在 chroot 的帮助下可以具有独立的文件系统,对于这样的文件系统进行增删改查不会影响到其他进程;
- 因为进程之间相互可见并且可以相互通信,使用 Namespace 技术来实现进程在资源的视图上进行隔离。在 chroot 和 Namespace 的帮助 下,进程就能够运行在一个独立的环境下了;
- 但在独立的环境下,进程所使用的还是同一个操作系统的资源,一些 进程可能会侵蚀掉整个系统的资源。为了减少进程彼此之间的影响, 可以通过 Cgroup 来限制其资源使用率,设置其能够使用的 CPU 以 及内存量。
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合
。 所谓“视图隔离”就是能够看到部分进程以及具有独立的主机名等;
控制资源使用率则是可以对于内存大小以及 CPU 使用个数等进行限制。
容器就 是一个进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视 图。
容器具有一个独立的文件系统,因为使用的是系统的资源,所以在独立的 文件系统内不需要具备内核相关的代码或者工具,我们只需要提供容器所 需的二进制文件、配置文件以及依赖即可。
只要容器运行时所需的文件集 合都能够具备,那么这个容器就能够运行起来
综上所述,我们将这些容器运行时所需要的所有的文件集合称之为容器镜 像。
那么,一般都是通过什么样的方式来构建镜像的呢?通常情况下,我们会 采用 Dockerfile
来构建镜像,这是因为 Dockerfile 提供了非常便利的语法,能够帮助我们很好地描述构建的每个步骤。
当然,每个构建步骤都会对已有的文件系统进行操作,这样就会带来文件系统内容的变化,我们将 这些变化称之为 changeset
。当我们把构建步骤所产生的变化依次作用到 一个空文件夹上
,就能够得到一个完整的镜像。
6. changeset 的分层以及复用特点能够带来几点优势
第一,能够提高分发效率,简单试想一下,对于大的镜像而言,如果 将其拆分成各个小块就能够提高镜像的分发效率,这是因为镜像拆分 之后就可以并行下载这些数据;
第二,因为这些数据是相互共享的,也就意味着当本地存储上包含了 一些数据的时候,只需要下载本地没有的数据即可,举个简单的例子 就是 golang 镜像是基于 alpine 镜像进行构建的,当本地已经具有 了 alpine 镜 像 之 后 , 在 下 载 golang 镜 像 的 时 候 只 需 要 下 载 本 地 alpine 镜像中没有的部分即可;
第三,因为镜像数据是共享的,因此可以节约大量的磁盘空间,简单 设想一下,当本地存储具有了 alpine 镜像和 golang 镜像,在没有复 用的能力之前,alpine 镜像具有 5M 大小,golang 镜像有 300M 大小, 因 此 就 会 占 用 305M 空 间 ; 而 当 具 有 了 复 用 能 力 之 后 , 只 需 要 300M 空间即可。
如下图所示的 Dockerfile 适用于描述如何构建 golang 应用的
-
FROM 行表示以下的构建步骤基于什么镜像进行构建,正如前面所提 到的,镜像是可以复用的;
-
WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目 录下进行,其起到的作用类似于 Shell 里面的 cd;
-
COPY 行表示的是可以将宿主机上的文件拷贝到容器镜像内;
-
RUN 行表示在具体的文件系统内执行相应的动作。当我们运行完毕 之后就可以得到一个应用了;
-
CMD 行表示使用镜像时的默认程序名字。
那么,这些镜像如何运行在生产环境或者测试环境上呢?
这时候就需要一 个中转站或者中心存储,我们称之为 docker registry
,也就是镜像仓库, 其负责存储所有产生的镜像数据。我们只需要通过 docker push 就能够将本地镜像推动到镜像仓库中,这样一来,就能够在生产环境上或者测试环 境上将相应的数据下载下来并运行了。
第一步:从镜像仓库中将相应的镜像下载
下来;
第二步:当镜像下载完成之后就可以通过 docker images 来查看本地 镜像,这里会给出一个完整的列表,我们可以在列表中选中想要的镜 像
;
第三步:当选中镜像之后,就可以通过 docker run 来运行这个镜像得 到想要的容器,当然可以通过多次运行得到多个容器
。一个镜像就相 当于是一个模板,一个容器就像是一个具体的运行实例,因此镜像就 具有了一次构建、到处运行的特点。
知其然不知其所以然,大厂常问面试技术如何复习?
1、热门面试题及答案大全
面试前做足功夫,让你面试成功率提升一截,这里一份热门350道一线互联网常问面试题及答案助你拿offer
2、多线程、高并发、缓存入门到实战项目pdf书籍
3、文中提到面试题答案整理
4、Java核心知识面试宝典
覆盖了JVM 、JAVA集合、JAVA多线程并发、JAVA基础、Spring原理、微服务、Netty与RPC、网络、日志、Zookeeper、Kafka、RabbitMQ、Hbase、MongoDB 、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入
、Cassandra、设计模式、负载均衡、数据库、一致性算法 、JAVA算法、数据结构、算法、分布式缓存、Hadoop、Spark、Storm的大量技术点且讲解的非常深入**
[外链图片转存中…(img-ylkcMm8X-1718920525433)]
[外链图片转存中…(img-DEGQfLsh-1718920525433)]
[外链图片转存中…(img-0vMqMAoz-1718920525434)]