一、Docker 技术介绍
1、Docker 简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
Docker 的开源项目诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc 。
2、虚拟化技术
在计算机技术中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以用比原本的组态更好的方式来应用这些资源。
3、Docker 优势
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
具体说来,Docker 在如下几个方面具有较大的优势:
更快速的交付和部署: Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间;
更高效的虚拟化:Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率;
更轻松的迁移和扩展:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个;
更简单的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
二、Docker 的基本概念
1、Docker 组成部分
Docker 的架构图:
一个完整的 Docker 主要由以下几部分构成:
2、Docker 镜像
Linux 操作系统包括 Linux 内核和用户空间两部分,当 Linux 系统启动后,会挂载 root 文件系统为其提供用户空间支持。Docker 镜像就类似于这样一个 root 文件系统,Docker 镜像中含有启动容器所需要的文件系统及所需内容,因此镜像主要用于创建并启动 Docker 容器。
Docker 镜像里包含一层层的文件系统,叫做 Union File System(Union FS,联合文件系统)。联合文件系统可以将多个目录挂载到一起,从而形成一整个虚拟文件系统,该虚拟文件系统的目录结构就像是普通的 Linux 目录结构一样。Docker 通过这些文件系统,再加上宿主机的内核就构成了一个 Linux 的虚拟环境。
在联合文件系统中,每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置只读(readonly)、读写(readwrite)和写出(writeout-able)三种权限。
但是 Docker 镜像中每一层的文件系统都是只读的,构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做了一层的修改,增加了一层文件系统,这样一层一层的网上叠加,上层的修改会覆盖底层该位置的可见性。当我们使用镜像的时候,只会看到一个完整的整体,而不知道也无需知道里面有几层文件系统。
3、Docker 容器
Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。
4、Docker仓库
Docker 仓库是一个集中存储、分发 Docker 镜像的仓库,客户端的 docker pull 和 docker push 命令都是直接与 Docker 仓库发生交互的。
一个 Docker 仓库可以包含多个仓库,每个仓库可以包含多个标签,这些标签对应每一个镜像。一般情况下,一个仓库可能会包含同一个软件的不同版本(例如 Nginx 1.18 和 1.20 版本等)镜像,标签就类似于该软件的不容版本,客户端可以通过 <仓库名>:<标签> 的格式来指定具体版本的软件镜像,如不指定,默认会以 latest 作为标签。
按照镜像是否公开,Docker 仓库可分为公共仓库和私有仓库两种。Docker hub 作为 Docker 官方的公共仓库,已经保存了大量的常用镜像,可以方便用户直接使用;如果不想使用公共仓库,也可使用 Image registry 这一 Docker 官方提供的私有仓库部署工具。