1. Docker理念
Docker是基于Go语言开发的云开源项目。
Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。
Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
总之一句话,解决了运行环境和配置问题软件容器,方便做持续集成并且有助于整体发布的容器虚拟化技术。
2. Docker引擎
Docker Engine 是具有以下主要组件的客户端和服务端应用程序:
- 服务器时一种长期运行的程序,称为守护程序进程(dockerd 命令)
- REST API ,它指定程序可以用来与守护进程进行通信并指示其操作的接口
- 命令行界面(CLI)客户端(docker 命令)
CLI使用Docker REST API 通过脚本或者直接CLI 命令来控制Docker守护程序与Docker守护程序进行交互。
3. Docker架构
Docker使用C-S 架构。Docker客户端与守护进程进行通信,该守护进程完成了构建,运行和分发Docker容器的任务。Docker客户端和守护程序可以在同一操作系统上运行,也可以将Docker客户端连接到远程Docker守护程序。
3.1. Docker守护程序
Docker守护程序侦听Docker API请求并管理Docker对象,例如镜像,容器,数据卷等。守护程序还可以与其他守护程序通信以管理Docker服务。
3.2. Docker客户端
Docker客户端是许多Docker用户与Docker交互的主要方式。同时,Docker客户端可以与多个守护程序通信。
3.3. Docker仓库
Docker仓库存储着Docker镜像。其中,Docker Hub 是任何人都可以使用的Docker仓库,并且默认情况下,当你在使用docker pull 的命令时,会从Docker Hub上下载你所需要的镜像,但是,我们也可以自己搭建私人的Docker镜像仓库。
3.4. Docker镜像
Docker镜像是用来创建Docker容器的。通常,一个镜像基于另一个镜像,并进行了一下其他自定义操作。
除了在使用镜像仓库里的镜像外,我们也可以构建自己的镜像,例如我们可以使用docker build命令来构建自己的镜像,也可以使用简单的语法创建一个DockerFile来构建自己的镜像,其中DockerFile中的每个指令都会在镜像中创建一个层。当需要更改Docker并重建镜像时,仅需要重建那些已更改的层。与其他虚拟化技术相比,这是使镜像如此轻巧,小型和快速的部分原因。
3.5. Docker容器
Docker容器是Docker镜像运行的实例。我们可以使用Docker客户端来创建、启动、停止、删除容器,也可以将容器连接到一个或者多个网络,将存储连接到,甚至根据当前的状态来创建新镜像(docker build)
其中,值得注意的是,如果删除容器后,没有存储在磁盘中的数据将会永久消失。
综上,其他Docker 仓库、镜像和容器之间的关系可以类比Java中的面向对象。
其中,Docker仓库就是我们的大脑,当我们需要一个User类或者Tiger类时,我们就会从我们的大脑仓库中去寻找,当找到是,我们就是在我们的程序中写出User类和Tiger类,这些类就是Docker中的镜像,而当我们使用这些类时,我们就需要new出这些类的实例来,这些类的实例就是Docker中的容器。这样,我们就能简单的区分Docker中这三个重要的概念。
4. Docker原理
4.1. Docker的容器隔离
Docker使用一种称为 namespaces 来提供容器的隔离技术,运行容器时,Docker会为该容器创建一组 namespaces。这些 namespaces 提供了一层隔离。
4.2. 为什么Docker比VM快
(1)docker有着比虚拟机更少的抽象层。由亍docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
(2)docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个docker容器只需要几秒钟。