本文简要介绍Docker。

一、 Doceker概述

Docker是一个用于开发,交付和运行应用程序的开放平台。Docker能够将应用程序与基础架构分开,从而可以快速交付软件。借助Docker,可以以与管理应用程序相同的方式来管理基础架构。通过利用Docker的方法来快速交付,测试和部署代码,可以大大减少编写代码和在生产环境中运行代码之间的延迟。

Docker具有以下特点:

二、 Docker平台

Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使我们可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。甚至可以在实际上是虚拟机的主机中运行Docker容器!

Docker提供了工具和平台来管理容器的生命周期:

三、 Docker引擎

Docker Engine 是具有以下主要组件的客户端-服务器应用程序:

CLI使用Docker REST API通过脚本或直接CLI命令来控制Docker守护程序或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。

守护进程创建和管理Docker对象,例如镜像(images),容器(containers),网络(networks)和卷(volumes)。

四、 Docker应用

1、 快速,一致地交付应用程序

Docker允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程。

2、 响应式部署和扩展

Docker基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑上,数据中心中的物理或虚拟机上,云提供商上或混合环境中运行。

Docker的可移植性和轻量级的特性还使您可以轻松地动态管理工作负载,并根据业务需求指示实时扩展或拆除应用程序和服务。

3、 在同一硬件上运行更多工作负载

Docker轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行,经济高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。

Docker非常适合于高密度环境以及中小型部署,而您需要用更少的资源做更多的事情。

五、Docker架构

Docker使用客户端-服务器架构。Docker 客户端与Docker守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。

Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程序。Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。

1、 Docker守护进程

Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。

2、 Docker客户端

Docker客户端(docker)是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的命令时docker run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker API。Docker客户端可以与多个守护程序通信。

3、 Docker仓库

Docker仓库存储Docker映像。Docker Hub是任何人都可以使用的公共仓库,并且默认情况下,Docker已配置为在Docker Hub上查找镜像。您甚至可以运行自己的私人仓库。如果使用Docker数据中心(DDC),则其中包括Docker可信仓库(DTR)。

使用docker pulldocker run命令时,所需的镜像将从配置的仓库中提取。使用该docker push命令时,会将镜像推送到配置的仓库。

4、 Docker对象

使用Docker时,创建和使用镜像(images),容器(containers),网络(networks)和卷(volumes),插件(plugins)和其他对象(other objects)。

本节是其中一些对象的简要概述。

IMAGES

Docker把应用程序及其依赖,打包在image文件里面。只有通过这个文件,才能生成Docker容器。image文件可以看作是容器的模板。Docker根据image文件生成容器的实例。同一个image文件,可以生成多个同时运行的容器实例。

image是二进制文件。实际开发中,一个image文件往往通过继承另一个image文件,加上一些个性化设置而生成。举例来说,你可以在Ubuntu的image基础上,往里面加入Apache服务器,形成你的image。

# 列出本机的所有 image 文件。
$ docker image ls

# 删除 image 文件
$ docker image rm [imageName]

image文件是通用的,一台机器的image文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的image文件,而不是自己制作。即使要定制,也应该基于别人的image文件进行加工,而不是从零开始制作。

为了方便共享,image文件制作完成后,可以上传到网上的仓库。Docker的官方仓库 Docker Hub 是最重要、最常用的image仓库。

CONTAINERS

容器是镜像(image)的可运行实例,本身也是一个文件,称为容器文件。也就是说,一旦容器生成,就会同时存在两个文件:image文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。

$ docker run -i -t ubuntu /bin/bash

当运行此命令时,会发生以下情况(假设您使用的是默认仓库配置):

  1. 如果在本地没有该镜像,则Docker将从您配置的仓库中自动提取该镜像,就像已经手动运行docker pull ubuntu命令一样。
  2. Docker会创建一个新容器,就像已经手动运行docker container create命令一样。
  3. Docker将一个读写文件系统分配给容器,作为其最后一层。这允许运行中的容器在其本地文件系统中创建或修改文件和目录。
  4. Docker创建了一个网络接口以将容器连接到默认网络,因为您未指定任何网络选项。这包括为容器分配IP地址。默认情况下,容器可以使用主机的网络连接连接到外部网络。
  5. Docker启动容器并执行/bin/bash。由于容器是交互式运行的,并且已附加到终端(由于-i和-t 标志),因此可以在输出记录到终端时使用键盘提供输入。
  6. 当输入exit以终止/bin/bash命令时,容器将停止但不会被删除。可以重新启动或删除它。
# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls -a

# 手动终止那些不会自动终止的容器
$ docker container kill [containID]

# 删除容器
$ docker container rm [containerID]

六、 底层技术

Docker使用Go语言编写,并利用Linux内核的多个功能来交付其功能。

Namespaces

Docker使用一种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组命名空间。

这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且对其的访问仅限于该命名空间。

Docker Engine在Linux上使用以下名称空间:

Control groups

Linux上的Docker引擎还依赖于另一种称为控制组 (cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。例如,您可以限制特定容器可用的内存。