Docker 是开源应用容器引擎,轻量级容器技术。Docker 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
作为一种新兴的虚拟化技术,Docker 跟传统的虚拟机相比具有众多的优势。
-
一致的运行环境:Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境的一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题。
-
更快速的启动时间:可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
-
隔离性:避免公用的服务器,资源会容易受到其他用户的影响。
-
弹性伸缩,快速扩展:善于处理集中爆发的服务器使用压力。
-
更轻松的迁移:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
-
持续交付和部署:使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。
不同公司的应用场景不同,常见的应用场景有
-
Web 应用的自动化打包,自动化测试和持续集成、快速部署。
-
弹性的云服务:因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
-
提供一致性的环境:同步开发环境和生产环境等
其他的应用场景可以参考:8 个 Docker 真实应用场景
Docker 包括三个基本概念
-
镜像(Image)
-
容器(Container)
-
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。
Docker 三个关键动作:Build、Ship、 Run。
-
Build(构建镜像):镜像就像是集装箱包括文件以及运行环境等资源
-
Ship(运输镜像):主机和仓库间运输,这里的仓库就像是超级码头一样
-
Run (运行镜像):正在运行的镜像就是一个容器,容器就是运行程序的地方
以上内容部分引自:《Docker 技术入门与实战》
docker 镜像(image)
-
一个只读模板,可以用来创建容器,一个镜像可以创建多个容器
-
Docker 提供了一个很简单的机制来创建和更新现有的镜像,甚至可以直接从其他人那里获取做好的镜像直接使用
docker 容器(container)
-
容器是从镜像创建的运行实例,也就是镜像启动后的一个实例称为容器,是独立运行的一个或一组应用。
-
docker 利用容器来运行应用,他可以被启动、开始、停止、删除,每个容器都是相互隔离的、保证安全的平台。
-
可以把容器看做是一个简易版的 Linux(包括 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
docker 仓库(resoisitory)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push
命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull
下来就可以了。
注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
底层原理
docker
底层使用了一些 linux
内核的特性,大概有 namespace
,cgroups
和 ufs
namespace
docker
使用 linux namespace
构建隔离的环境,它由以下 namespace
组成
-
pid
:隔离进程 -
net
:隔离网络 -
ipc
:隔离 IPC -
mnt
:隔离文件系统挂载 -
uts
:隔离hostname -
user
: 隔离uid/gid
control groups
也叫 cgroups
,限制资源配额,比如某个容器只能使用 100M
内存
union file systems
UnionFS
是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加。docker
的镜像与容器就是分层存储,可用的存储引擎有 aufs
,overlay
等。
docker
的镜像和容器都使用了 unionFS
做分层存储,镜像作为只读层是共享的,而容器在镜像之上附加了一层可写层,最大程度地减少了空间的浪费。
关于分层存储的详细内容可以查看官方文档 docker: About storage drivers
Docker 引擎
Docker 引擎是一个 Client-Server 应用程序,有以下主要组件:
-
Server 是一个长期运行的程序,成为守护进程(Docker 命令)
-
REST API,可以用来与守护进程进行通信并指示其操作的接口
-
命令行界面(CLI)客户端(Docker 命令)