1. 前言
1.1 什么是Docker?
Docker
是一个用于开发
,发布
和运行
应用程序的开放平台。 Docker
使我们能够将应用程序
与基础架构
分开,从而可以快速交付
软件。 借助Docker
,我们能以管理应用程序相同的方式来管理基础架构。 通过利用Docker
的快速交付
,测试
和部署
代码的方法,我们可以大大减少编写代码和在生产环境中运行代码之间的延迟,即缩短开发、测试、部署的周期。
1.2 Docker 的优势
Flexible
(灵活的)
Lightweight
(轻量的)
Portable
(可移植的)
Loosly coupled
(松耦合的)
Scalable
(可扩展的)
Secure
(安全的)
Docker
能够在container(容器)
中打包和运行应用程序。隔离性
和安全性
允许我们在一台宿主机上同时运行多个container
。container
是轻量级
的,因为它们没有管理程序的额外负担,而是直接在宿主机的内核中运行。 这意味着与使用虚拟机相比,在给定的硬件组合上可以运行更多的容器。 我们甚至可以在实际上是虚拟机的主机中运行Docker
容器!
1.3 Docker Engine(Docker引擎)
Docker Engine是具有以下主要组件的client-server应用程序:
server
,它是一种长期运行的程序,称为守护进程
(dockerd
命令)。REST API
,它是一个其他程序与守护进程进行通信,并通过其进行某些操作的接口。- 命令行界面(
CLI
)客户端(docker
命令)。
CLI
使用Docker REST API
通过脚本或直接CLI
命令来控制或与Docker daemon
交互。
daemon
创建和管理Docker
对象,例如images
,containers
,networks
和volumes
。
1.4 Docker能用来干嘛?
-
快速、一致地交付你的应用程序。
开发人员可以在
containers
中进行开发等工作,简化了(缩短了)开发周期。containers
非常适合持续集成(continuous integration,简称CI)
和持续交付(continuous delivery,简称CD)
工作流程。 -
响应式部署和扩展
扫描二维码关注公众号,回复: 12683379 查看本文章Docker
是一个基于容器的平台,有很强的可移植性。Docker容器可以在开发人员的本地笔记本电脑上,数据中心中的物理或虚拟机,云提供商或以上的混合环境中运行。
Docker
的轻量级和可移植性使得我们可以根据业务需求动态地扩展或缩减应用程序和服务。 -
可在同一硬件上运行更多应用程序
Docker
轻巧快速。它是虚拟机(Virtual Machine,简称VM)
的可行、高效的替代方案。使得我们能够将更多的计算能力用到业务目标上。Docker
非常适合高密度环境以及中小型部署,在这些部署中我们可以用更少的资源做更多的事情。
2. Docker架构
Docker
使用client-server
架构。Docker client
与Docker daemon
交互,Docker daemon
完成了build(构建)、run(运行)distribute(分发)Docker containers
的工作。Docker client
和Docker daemon
可以在同一系统运行,也可以使用Docker client
连接远程的Docker daemon
。这二者通过REST API
进行交互。
3. 基本概念
3.1 Docker daemon(Docker守护进程)
Docker daemon(dockerd)
监听Docker API
的请求和管理Docker objects
(例如,images
,containers
,networks
和 volumes
)。一个daemon
还可以和其他daemon
进行同喜以管理Docker services
。
3.2 Docker client(Docker客户端)
Docker client(docker)
是Docker
用户和Docker
进行交互的主要方式。当我们使用 docker run
命令时,Docker client
会将这些命令发送给dockerd
,dockerd
负责执行它们。一个Docker client
可以和多个Docker daemon
通信。
3.3 Docker registries(Docker仓库)
一个Docker registry
可以存储许多的Docker images
。Docker Hub
是一个任何人都可以使用的公共库。默认情况下,Docker
会去Docker Hub
中搜索images
。我们也可以有自己的私有库。
当我们使用 docker pull
或 docker run
命令时,会从我们所配置的仓库中拉取所需的images
。当我们是用 docker push
命令时,会将我么的image
推送到我们所配置的仓库。
3.4 Docker objects(Docker对象)
当我们使用Docker
时,我们会创建和使用images(镜像
)、containers(容器)
、networks(网络)
、volumes(卷
)、plugins(插件)
和其他一些对象。
3.5 Images(镜像)
一个image
是一个包含创建Docker containers
说明的只读文件。它是创建containers
的模板。通常,image
是在其他image
的基础上做了一些自定义操作。例如,我们可以基于 ubuntu image
安装django
等相关依赖,成为了一个django web
的image
。
要构建一个自己的image,我们需要创建一个Dockerfile
文件,这个文件是用来定义如何构建
image和运行它的
。Dockerfile
中的每条指令都会在image中创建一个layer
。当我们改变Dockerfile
和重建这个image
时,只会重建那些已经改变的layer
。这是Docker
的images
如此轻量、快速的部分原因。
3.6 Containers(容器)
一个container
是一个可运行的image
实例。使用Docker API
或者CLI
可以create
、start
、stop
、move
或delete
一个container
。一个container
可以连接多个networks
、存储
,还可以基于当前的container
创建一个新的image
。
默认情况下,一个container
和该宿主机中的其他container
是高度隔离的。我们可以控制container 网络
、存储
或其他底层子系统与此宿主机中其他containers
的隔离程度。
3.7 Services(服务)
Services
允许我们能够在多个Docker daemon
之间扩展containers
,这些Docker daemon
形成一个多个管理员和工作人员一个工作的群。群里的每个成员都是Docker daemon
,daemon
之间通过Docker API
进行通信。一个service
允许我们定义期望的状态,例如,在任何指定时间必须可用的服务副本的数量。默认情况下,该serverice
在所有工作节点是负载均衡的。
3.8 底层技术
Docker
用Go
编写,并利用Linux
内核的多个功能来实现其功能。
3.9 Namespaces(命名空间)
Docker
使用namespaces
技术提供了隔离的工作空间(就是container
)。当我们运行一个container
时,Docker
会为该container
创建一组namespaces
。
namespaces
提供了一个隔离层(isolation layer)
。容器的每个方面都在单独的namespace
中运行,并且其访问仅限于该namespace
。
Docker Engine
在Linux
中使用了如下一些namespaces
:
pid namespace
。进程隔离(PID:进程ID)。net namespace
。管理网络接口(NET:网络)。ipc namespace
。管理对IPC资源的访问(IPC:进程间通信)。mnt namespace
。管理文件系统挂载点(MNT:挂载)。uts namespace
。隔离内核和版本标识符。 (UTS:Unix时间共享系统)
3.10 Control groups(控制组)
在Linux中,Docker Engine
还依赖一种叫做control group(cgroups)
的技术。cgroups限制应用程序对资源的访问
。control groups
允许Docker Engine
将可用的硬件资源共享给containers
,并对其进行一些限制和约束。例如,我们可以限制某container
可用的内存。
3.11 Unlon file systems
Union file systems
,也叫UnionFS
,是一种通过创建layers
来进行操作的文件系统。它很轻量和快速。Docker Engine
使用UnionFS为containers
提供构建块(building blocks
)。
3.12 Container format(容器格式)
Docker Engine
将namespaces
,control groups
和UnionFS
组合到一个称为容器格式的包装器中。 默认容器格式为libcontainer
。 将来,Docker
可以通过与BSD Jails
或Solaris Zones
等技术集成来支持其他容器格式。