Docker 入门与实践

Docker 入门与实践




Docker 是一个能让程序跑在一个它无法感知的、用于隔绝外界环境里的容器的工具。

1 Docker 简介

最初是 dotCloud 公司创始人 Solomon Hykes 发起的一个公司内部项目,并于 2013 年 3 月以 Apache 2.0 授权协议开源,代码主要在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)

Docker 使用 Google 推出的 Go 语言开发实现,基于 Linux 内核的 cgroupnamespace,以及 UnionFS 等技术。最初实现基于 LXC,从 0.7 版本后去除 LXC,转而开始使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runCcontainerd

在 2017 年 4 月 21 日 Pull Request #32691 将原有的 Docker 项目更名为 Moby,由 Moby 构建出 Docker CE(社区版),而新的 Docker 项目则构建出 Docker EE(企业版本)。

2 Docker 初步了解

2.1 Docker 容器与虚拟机的区别

2.1.1 原理不同

F932548E-8278-415E-B844-DD50B33500A8.png

上图是 Docker Doc 关于 Docker 和传统虚拟机区别的截图。

Docker 利用了 Linux 内核的 cgroup 和 namespace 为程序的执行创造一个隔离的环境,使得程序感知不到外界的存在,其本身仍然是跑在原有的内核上的;而虚拟机则是通过 Hypervisor 模拟了一整套系统环境,虚拟机里的程序是跑在虚拟机内核上的。由于虚拟机需要模拟一整套操作系统环境,因此开销比 Docker 容器要高很多很多。

你可以把跑在容器里的程序想象成楚门(楚门的世界男主),他并不知道自己生活在一个精心布置的超大影棚里,但是他仍然是活在现实世界里的,呼吸着现实世界中的空气,吃着和我们差不多的食物;跑在虚拟机里的程序就好像活在动画片里的小猪佩奇,他的一切都是虚拟的,虽然小猪佩奇并不知道自己活在动画片里,但是很显然的是它和我们完全不在一个世界(不是同一个系统内核)。

2.1.2 性能差异

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机上千个容器 一般几十个

2.2 Docker 基本概念

2.2.1 镜像

Docker 是一个包含操作系统完整 root 文件系统 的、只读的,由多层文件系统联合而成的打包文件。

Docker 为了让应用无感知的跑在容器中,提供了一套完整的 root 文件系统,比如官方镜像 library/ubuntu 就包含了一整套 root 文件系统。像 apache、nginx 都是基于该镜像构建的,由于 library/ubuntu 本身很大,所以 Docker 采用了分层存储的方式。

F8A2BBF4-F35D-4AC5-A897-8CDC0349E945.png

本文假装你已经安装了 Docker,上图通过 docker pull nginx官方 Registry(下面会提到这是啥)拉取 nginx 镜像,拉取 nginx 相当于 library/nginx:latest,library 表示 nginx 是官方镜像,因此可以省略,:latest 表示拉取标签为 latest 的镜像。拉取后可以看到存在两个镜像,因为 nginx 镜像本身就是基于 library:ubuntu:16.04 镜像的。

3BFBA27D-6B51-445C-8D02-00F02A9A747A.png

上图通过 docker pull httpd 拉取了 apache 镜像,由于 ubuntu:16.04 镜像已经在本地存在了,因此拉取的时候不会重复拉取。从而节约拉取时间。这就是 Docker 分层存储的意义。

镜像的只读可以理解成以前的光盘 CD,是不可更改的。为了模拟实现对光盘 CD 的写的功能,会建立两层文件系统,一层是光盘 CD 的只读文件系统;另外一层是存放更改数据的可写的文件系统。从而实现模拟更改镜像的作用。Docker 也是采用这种类似的分层的方式。

018E0260-D613-4098-A1E0-D0E6EC133014.png

如图,可以看出 ubuntu:15.04 是由很多层文件系统(镜像)堆叠形成的,最底层是 root 文件系统(d3a1f33e8a5a)。这几层文件系统都被设置成只读的。多层文件系统利用了上面提到的 UnionFS、AUFS、OverlayFS,这是一类文件系统,这种联合挂载文件系统最早就是用于解决 CD 这种只读文件系统的修改问题,Docker 之前使用 AUFS,但是由于 AUFS 不被 linus 喜欢(被 linus 评价为稠密、不可读,无注释)导致 AUFS 一直没有被合并到 Linux 的主分支中。Docker 在 1.12 以后已经将默认的文件系统从 AUFS 替换成 OverlayFS2。因为 OverlayFS2 已经被合并进了 Linux 的主干分支中。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

扫码二维码快速访问本页

Docker 入门与实践 – 起航天空