Docker使用Go语言开发,基于Linux内核的cgroup、namespace以及AUFS等技术对进程进行封装隔离,是一种操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
Docker则使用宿主机内核提供的隔离机制创建沙盒环境,容器内的应用进程直接运行于宿主的内核。 因为容器内没有虚拟硬件和内核,容器在启动时间、执行效率、内存占用以及镜像大小等方面相对于传统虚拟机都拥有很大优势。
Docker容器将程序及其运行环境打包在一起,镜像创建后可以在任何安装了Docker的系统上运行,无需配置运行环境, 加之较小的镜像体积极大方便了协作开发和部署。
使用Dockerfile将镜像构建过程透明化,也便于开发和运维人员理解程序的运行环境。
Docker相对于虚拟机的优势来源于它运行与宿主内核而减少了开销,这使得Docker不能虚拟不同的内核环境。也就是说我们可以很容易地在Windows操作系统上启动一个Linux虚拟机,但是在Windows上启动一个基于Linux的Docker容器则是很困难的事情。
docker官方已经发布了docker for mac及docker for windows。目前docker for mac使用MAC OS内核提供的HyperKit虚拟化技术代替了docker-toolbox采用的使用Linux虚拟机提供支持的方式。
What's Dockercgroup和namespace是Linux内核提供的两种隔离机制,是Docker虚拟化的技术基础:
cgroup: 全名Control Groups, Linux内核提供的用于监控和管理进程组占用资源的机制。 这里的资源包括CPU,内存和IO等硬件资源。
namespace: 为某个进程提供独立的空间,包括独立的:
进程树: 进程拥有独立的init进程及其下进程树
文件系统: 进程拥有独立的根目录/及其下目录树
用户: 进程可以定义自己的用户,组和权限系统
协议栈: 进程可以拥有独立的ip地址及tcp/udp端口空间
其它
在了解隔离机制之后我们可以了解Docker中的两个核心概念:
容器:容器的本质是进程,它拥有独立的命名空间。因此容器表现很像一个虚拟操作系统,拥有自己的进程树,文件系统等。
镜像:镜像是容器运行依赖的文件系统,就像每个Linux操作系统时都需要挂载root文件系统/,镜像就是容器的root文件系统。
Docker采用服务端/客户端架构:
Docker采用UnionFS技术将镜像设计为分层结构,即一个镜像分为多层,每一层在上一层的基础上构建(即存储增量)。在容器中只能看到所有层叠加后的结果,隐藏了分层的结构。因为镜像层会被其它层依赖,为了保证下层能正常工作, 镜像层在创建后就无法进行修改。
Get StartedDocker目前分为免费的社区版(CE)和付费的商业版(EE)两种, 这里我们选用社区版。 Docker官网上提供了各种常用操作系统的安装说明:
下面看一个简单的示例:
finley@mbp:$ uname Darwin finley@mbp:$ docker run -it Ubuntu root@528ab91753d6:/# uname Linux在执行docker run命令后发现我们已经从宿主机Mac的终端进入到了Linux终端中。 这个运行中的"Linux"就是容器,启动这个虚拟的Linux环境所需的文件即是镜像。
上面的示例中我们使用docker代替了ubuntu虚拟机,对比之下docker在镜像大小,启动时间和运行内存占用方面都具有巨大的优势。
因为启动docker容器的开销和启动相应进程的开销基本相同, 因此完全可以使用docker代替原生进程, 避免复杂的编译安装配置过程。
$ docker run -p 6379:6379 -d redis 3a5748eef653 $ redis-cli 127.0.0.1:6379> keys * (empty list or set)
这个示例中我们一键安装并启动了redis-server。
在终端中输入docker命令则会显示所有命令和使用帮助, 在docker命令后添加--help选项可以查看该命令的帮助信息, 如docker run --help可以查看run命令的帮助。
镜像本节将简单介绍如何搜索和管理镜像, 为介绍容器做准备。更多关于镜像的构建和共享的内容将在下文中介绍。
docker imagesdocker images命令用于显示本地所有镜像:
REPOSITORYTAGIMAGE IDCREATEDSIZEubuntu latest 00fd29ccc6f1 3 weeks ago 111MB
redis latest 1e70071f4af4 4 weeks ago 107MB
和其它软件一样docker镜像也可以演进出不同版本,tag用于标识镜像的版本。
repository代表同一镜像多个版本的集合, 它的值是一个URI用于全局唯一标识一组镜像,如"registry.cn-hangzhou.aliyuncs.com/acs/agent"。
对于DockerHub中的镜像则会省略仓库的地址,诸如dorowu/ubuntu-desktop-lxde-vnc和ubuntu就是DockerHub中的镜像。
由此可见,repository和tag可以唯一标识docker镜像。
除此之外每个镜像还拥有一个摘要(DIGEST),docker images --digest可以显示镜像的摘要。
docker searchDockerHub是docker官方提供的公有仓库,docker search命令用于根据关键字搜索DockerHub中的镜像: