Docker时一个能够把开发的应用程序自动部署到容器的开源引擎。Docker的核心组件:Docker客户端和服务器(也称为Docker引擎),Docker镜像,Registry,Docker容器。

Docker客户端和服务器

Docker是一个客户端/服务器架构的程序。Docker客户端只需向Docker服务器或守护进程发出请求,服务器或守护进程将完成所有工作并返回结果。Docker守护进程有时也称为Docker引擎。Docker提取了一个命令行工具docker以及一整套RESTful API来与守护进程交互。用户可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

读书笔记-第一本Docker书:Docker简介_客户端

Docker容器

Docker可以帮用户构建和部署容器,用户只需要把自己的应用程序或服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。镜像是Docker生命周期中的构建或打包阶段,而容器则是启动或执行阶段。Docker容器就是一个镜像格式、一系列标准的操作、一个执行环境。每个容器都包含一个软件镜像,也就是容器的货物。容器里的软件镜像可以进行一些操作,例如,镜像可以被创建、启动、关闭、重启以及销毁。

Docker镜像

镜像是构建Docker世界的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式的结构,由一系列指令一步一步构建出来。例如:添加一个文件,执行一个命令,打开一个端口。也可以把镜像当作容器的“源代码”。镜像体积很小,易于分享、存储和更新。

Registry

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营的公共Registry叫做Docker Hub。用户也可以在Docker Hub上保存自己的私有镜像。例如,包含源代码或专利信息等需要保密的镜像,或者只在团队或组织内部可见的镜像。用户甚至可以架设自己的私有Registry。

读书笔记-第一本Docker书:Docker简介_守护进程_02

概念

说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker Registry

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Machine

Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。

Docker与配置管理

Docker包含一套镜像构建和镜像管理的解决方案。镜像是分层的,可以对其进行迅速的迭代。Docker的特性能够帮助减轻许多传统镜像管理中的麻烦。虽然现在还难以确定Docker是否可以完全取代配置管理工具,但是从幂等性和内省性来看,Docker确实能够获得非常好的效果。Docker本身还是需要在主机上进行安装、管理和部署的。而主机也需要被管理起来。Docker容器需要编配、管理和部署,也经常需要与外部服务和工具进行通信,而这些恰恰是配置管理工具所擅长的。

Docker技术组件包括:一个原生的Linux容器格式(Docker中称为libcontainer);Linux内核的命令空间(namespace),用于隔离文件系统、进程和网络;文件系统隔离(每个容器都有自己的root文件系统);进程隔离(每个容器都运行在自己的进程环境中);网络隔离(容器间的虚拟网络接口和IP地址都是分开的);资源隔离和分组(使用cgroups将CPU和内存之类的资源独立分配给每个Docker容器);写时复制(文件系统都是通过写时复制创建的,意味着文件系统是分层的、快速的,而且占用的磁盘空间更小);日志(容器产生的STDOUT、STDERR和STDIN这些IO流都会被收集并记入日志,用来进行日志分析和故障排错);交互式shell(用户可以创建一个伪tty终端,将其连接到STDIN,为容器提供一个交互式的shell)