1. 简介
Docker使用Google公司推出的Go语言开发实现,基于Linux内核的cgroup, namespace以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离进程,因此也称其为容器。
Docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等,极大的简化了容器的创建和维护。使得Docker技术比虚拟机技术更为轻便。
Docker与传统虚拟化方式的不同之处:传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且没有进行硬件虚拟。
Docker相对传统虚拟化方式的优势:
1) 更高效地利用系统资源:不需要硬件虚拟化、也不需要运行完整操作系统,因此Docker对系统资源利用率高。相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
2) 更快速的启动时间:Docker容器应用,由于直接运行于宿主内核,无需启动完整操作系统,因此可以做到秒级、甚至毫秒级启动。
3) 一致的运行环境:由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。Docker镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
4) 持续交付和部署:Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可通过Dockerfile进行镜像构建,并结合持续集成(CI)系统进行集成测试,运维人员可以直接在生产环境快速部署该镜像,甚至结合持续部署(CD)系统进行自动部署。
5) 更轻松的迁移:由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。
6) 更轻松地维护和扩展:Docker使用分层存储以及镜像技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。Docker团队也维护了大批高质量的官方镜像,既可在生产环境使用,也可作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
对比传统虚拟机技术总结:
特性 | 容器 | 虚拟机 |
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为MB | 一般为GB |
性能 | 接近原生 | 弱于原生 |
系统支持量 | 单机支持上千个容器 | 单机一般支持几十个 |
2. 基本概念
Docker包括了三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)
2.1 Docker镜像
对于Linux操作系统而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像,就相当于一个root文件系统。如官方镜像ubuntu:16.04,就包含了一套Ubuntu16.04最小系统的root文件系统。
(1) 分层存储
Docker设计时,充分利用UnionFS技术,将其设计为分层存储架构。严格意义上,镜像是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改版,后一层上的任何改变只发生在自己这一层。在构建镜像时,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征使得镜像的复用、定制变得更为容易。可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需内容,构建新镜像。
2.2 Docker容器
镜像和容器的关系,就像面向对象程序设计中的类和实例一样。镜像时静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行在属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、网络配置、进程空间、甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境中,运行时好像是在独立于宿主的操作系统一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
容器与镜像一样,也是分层存储。容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,该容器存储层可理解成为容器运行时读写而准备的存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此任何保存于容器存储层的信息都会随容器删除而丢失。
按照Docker最佳实践要求,容器不应该向其存储层写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume),或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此使用数据卷后,容器删除或者重新运行之后,数据不会丢失。
2.3 Docker Registry
Docker Registry是一个集中存储、分发镜像的服务。一个Docker Registry可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果忽略了标签,则默认标签为latest。
仓库名经常以两段式形式出现,比如jwilder/nging-proxy,前者往往意味着Docker Registry多用户环境下的用户名,后者则往往对应软件名,但这并非绝对。
(1) Docker Registry公开服务
Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务,一般这类公开服务允许用户免费上传、下载公开的镜像。
最常用的公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量高质量的官方镜像。
国内的一些云服务商提供了针对 Docker Hub的镜像服务,这些镜像服务也被称为加速器,如阿里云加速器、DaoCloud加速器等。
如何配置国内加速器:
a. 对于systemd系统,如Ubuntu16.04+、Debian8+、CentOs7,将/etc/docker/daemon.json中的改为{"registry-mirrors":["https://registry.docker-cn.com"]},然后执行sudo systemctl daemon-reload; sudo systemctl restart docker重启docker
b. 对于upstart系统,如Ubuntu14.04、Debian 7 Wheezy,编辑/etc/default/docker文件,在其中的DOCKER_OPTS添加DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com",然后执行sudo service docker restart重启docker。
(2) 私有Docker Registry
除了使用公开服务外,用户也可在本地搭建私有的Docker Registry。
开源的Docker Registry镜像只提供了Docker Registry API的服务端实现,足以支持docker命令,但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。
3. 安装
docker的安装可以参考https://docs.docker.com/engine/installation,支持64位的Mac OS, Linux, Win10等操作系统。