购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 容器概述

什么是容器?什么是docker?容器和docker之间有什么关系?本节将对这些问题展开详细的解答。

2.1.1 容器技术简介

容器技术是一种沙盒技术,主要是为了将应用运行在容器中从而做到与外界隔离,同时可以方便地将此沙盒转移到其他机器中。从本质上讲,容器是一个特殊的进程,通过命名空间(Namespace)、控制组(Control Groups)和Chroot技术,将文件、设备、状态和配置划分到一个独立的空间中。简单来说,容器像是一个箱子,箱子里面有软件运行所需要的依赖和配置,开发运维人员可以将此箱子搬到任何一台机器上,而不会影响内部的程序运行。

那么,容器技术是为了解决什么问题呢?在实际的软件开发过程中,比如开发人员在Windows平台上开发、调试代码,当到了部署环节,一般情况下都要部署到Linux系统上,此时可能存在操作系统之间不兼容的问题。再比如,开发人员在开发代码时,在引入依赖库的时候,各种开发语言一般都有自己的依赖管理工具,而依赖管理工具则是根据当前的操纵系统以及开发语言的版本对依赖包进行下载安装,这就带来一个问题:部署环境的时候,很可能下载的依赖包版本号与开发人员使用的不一致,从而带来一些兼容性的问题。此类问题在开发测试部署环节是非常常见的,比如开发人员常常抱怨软件在自己的测试环境上是好的,为什么到对方的测试环境就不行了?容器技术的出现,可以从很大程度上解决这个问题。开发人员在完成代码开发后,在容器中部署调试测试。开发人员在自己的容器中测试完成,直接将容器打包成镜像,将镜像交付给测试人员,测试人员通过镜像启动容器,则可以保证测试的环境跟开发调测的环境是完全一样的。测试人员测试完成后,同样将通过测试的镜像交付给运维人员,运维人员在部署上线的时候,同样不会有之前的各种环境相关的问题。

其实在使用容器技术之前,开发人员已经可以从一个操作系统中通过虚拟化技术虚拟出若干个虚拟机,容器化与虚拟机的区别如图2-1所示。虚拟化技术是在一个物理机的操作系统中虚拟出多个虚拟机,在每个虚拟机中又安装了操作系统。换言之,图2-1的虚拟化技术存在4个操作系统,即一个宿主机(Host Operating System)和3个客户机(Guest OS)。在容器技术中只有1个操作系统(Operating System),而一个个容器都是在操作系统中的一个进程(App1、App2、App3)。虚拟机无论是安装过程还是启动过程,都是比较耗时的,一般都是分钟级别的,而容器启动则是秒级的。因此,容器显然是更加轻量级的,拥有更快的启停速度、更小的资源占用、更便捷的创建与销毁操作。

图2-1 虚拟化技术与容器技术

提到容器,现在大家首先想到的就是docker。其实容器的具体实现是有许多技术的,比如docker、containerd、podman、lxd、cri-o、runc、kata-containers、gVisor、rkt等。在这些容器技术中,当前最为流行的是docker,因此大家在平时的交流中,多数情况下提到的容器就是指docker。

2.1.2 docker技术简介

docker是一个开源的应用容器引擎,让开发者可以打包其依赖包及应用程序到一个可移植的镜像中,即可在支持docker容器的机器上通过镜像启动容器,从而做到部署应用和具体环境解耦。

一个完整的docker由docker client、docker daemon、docker images、docker containers、docker registries几个部分组成。

图2-2为docker的架构图,下面结合docker的架构图简要介绍docker运行容器的工作流程。

图2-2 docker架构图

docker架构中各个组件的作用介绍如下。

1.docker daemon

docker daemon是docker的服务端守护进程(dockerd),它监听docker api请求,并且可以对docker对象进行操作,比如镜像、容器、网络和存储等。我们平常使用的docker命令,实际就是docker client向docker daemon发送的rest api请求的过程。此外,docker daemon还可以通过与其他的docker daemon进程通信,进而去管理docker对象资源。

2.docker client

docker client就是平时使用的docker命令。当我们执行docker命令时,实际上就是docker client向docker daemon服务发送docker api请求的过程。当然docker client也是可以向多个docker daemon服务进程发送请求的。

3.docker registries

docker registries是一个镜像存储服务,目前公共的公开docker镜像存储服务为docker hub。执行docker pull、docker push等操作时,就是从docker hub上拉取镜像或者将本地镜像推送到docker hub服务。当然,在企业内部也可以通过一些开源工具进行私有hub服务的搭建,常见的Harbor就是用于搭建私有部署的docker hub。

4.docker images

docker images是用来启动docker容器使用的模板文件。通常情况下,docker镜像都是基于其他基础镜像制作的,通过在dockerfile文件中增加自定义的内容,比如安装自定义软件和构建自定义应用程序等。因为docker镜像是根据dockerfile中自定义语句进行分层的,每次会根据dockerfile的变更情况进行重新编译。只对dockerfile中有变更的层进行重新编译,而对于没有变化的层,不需要重新编译。这也是docker轻量级且快速的一个重要原因。

5.docker containers

docker containers容器可以理解为docker image的一个实例,通过docker命令行或者docker api可以对docker容器进行创建、启动、停止、迁移或者删除等操作。容器与容器之间以及与宿主机之间都是隔离的。通过设置docker网络可以做到同一个网络下的容器互通,而不同网络下的容器是不通的。此外,还可以通过存储挂载技术将容器中的目录挂载到宿主机上,这样当容器被删除,挂载的目录存储在宿主机上的数据不会丢失。对于数据库、存储文件等,一般都是需要进行存储目录挂载的。 xQB09euiq3Lyd6I9fp7pINusW/Dbnu/HTr6Kv9EHaIBwhoAG1Zmchyxz66Ejei0Y

点击中间区域
呼出菜单
上一章
目录
下一章
×