一、容器与镜像
-
什么是容器?
-
进程的特点
进程可以相互看到、相互通信;
使用的是同一个文件系统,可以对同一个文件进行读写操作;
这些进程会使用相同的系统资源
-
如何为进程提供一个独立的运行环境
针对不同进程使用同一个文件系统所造成的问题而言,Linux 和 Unix 操作系统可以通过 chroot 系统调用将子目录变成根目录,达到视图级别的隔离;进程在 chroot 的帮助下可以具有独立的文件系统,对于这样的文件系统进行增删改查不会影响到其他进程;
因为进程之间相互可见并且可以相互通信,使用 Namespace 技术来实现进程在资源的视图上进行隔离。在 chroot 和 Namespace 的帮助下,进程就能够运行在一个独立的环境下了;
在独立的环境下,进程所使用的还是同一个操作系统的资源,一些进程可能会侵蚀掉整个系统的资源。为了减少进程彼此之间的影响,可以通过 Cgroup 来限制其资源使用率,设置其能够使用的 CPU 以及内存量。
-
如何定义这样的进程集合
容器就是一个视图隔离、资源可限制、独立文件系统的进程集合
容器具有一个独立的文件系统,我们只需要提供容器所需的二进制文件、配置文件以及依赖即可运行
-
-
什么是镜像?
镜像是指容器运行所需要的所有文件的集合
-
如何构建镜像
通常采用Dockerfile来构建镜像,每个构建步骤都会对已有的文件系统进行操作,从而带来文件系统内容的变化,这些变化称之为changeset。当我们把构建步骤所产生的变化依次作用在一个空文件夹,就能得到一个完整的镜像。
-
changeset 的分层以及复用特点能够带来几点优势
提高分发效率
数据共享
节约磁盘空间
-
构建镜像步骤示例
如图所示:
- FROM 行表示以下的构建步骤基于什么镜像进行构建,正如前面所提到的,镜像是可以复用的;
- WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,其起到的作用类似于 Shell 里面的 cd;
- COPY 行表示的是可以将宿主机上的文件拷贝到容器镜像内;
- RUN 行表示在具体的文件系统内执行相应的动作。当我们运行完毕之后就可以得到一个应用了;
- CMD 行表示使用镜像时的默认程序名字。
当有了 Dockerfile 之后,就可以通过 docker build 命令构建出所需要的应用,构建结果存储在本地。
docker registry,镜像仓库,负责存储所有产生的镜像数据。通过 docker push 就能够将本地镜像推动到镜像仓库中,这样一来,就能够在生产环境上或者测试环境上将相应的数据下载下来并运行了。
-
如何运行容器
1.从镜像仓库中将相应的镜像下载下来
2.当镜像下载完成之后就通过 docker images 来查看本地镜像,会给出一个完整的列表,可以在列表中选中想要的镜像
3.选中镜像之后,就可以通过 docker run 来运行这个镜像得到想要的容器。一个镜像就相当于是一个模板,一个容器就像是一 个具体的运行实例,因此镜像就具有了一次构建、到处运行的特点
-
-
容器的生命周期
使用 docker run 的时候会选择一个镜像来提供独立的文件系统并指定相应的运行程序,指定的运行程序称为initial进程,initial启动时,容器即开始启动,initial退出时容器也退出。
容器能够直接将数据持久化到指定的目录上,这个目录就称之为数据卷。
数据卷的生命周期是独立于容器的生命周期的
数据卷管理主要有两种方式:
-
通过 bind 的方式,将宿主机的目录直接挂载到容器内。这种方式比较简单,但是会带来运维成本,因为其依赖于宿主机的目录,需要对于所有的宿主机进行统一管理。
-
将目录管理交给运行引擎
-
-
容器的项目架构
moby 容器引擎架构
moby daemon 会对上提供有关于容器、镜像、网络以及 Volume的管理。moby daemon 所依赖的最重要的组件就是 containerd,containerd 是一个容器运行时管理引擎,其独立于 moby daemon ,可以对上提供容器、镜像的相关管理。
-
容器 VS VM
VM即虚拟机,可以在宿主机建立Guest OS,可以提供一个更好的隔离效果,但是需要占用大量的磁盘空间。
容器是针对于进程而言的,因此无需 Guest OS,只需要一个独立的文件系统提供其所需要文件集合即可。所有的文件隔离都是进程级别的,因此启动时间快于 VM,并且所需的磁盘空间也小于 VM。隔离效果相比 VM 要差很多。
总结:
- 容器是一个进程集合,具有自己独特的视图视角;
- 镜像是容器所需要的所有文件集合,其具备一次构建、到处运行的特点;
- 容器的生命周期和 initial 进程的生命周期是一样的;
- 容器和 VM 相比,各有优劣,容器技术在向着强隔离方向发展。