Docker快速入门指南

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 Docker

cgroup和namespace是Linux内核提供的两种隔离机制,是Docker虚拟化的技术基础:

cgroup: 全名Control Groups, Linux内核提供的用于监控和管理进程组占用资源的机制。 这里的资源包括CPU,内存和IO等硬件资源。

namespace: 为某个进程提供独立的空间,包括独立的:

进程树: 进程拥有独立的init进程及其下进程树

文件系统: 进程拥有独立的根目录/及其下目录树

用户: 进程可以定义自己的用户,组和权限系统

协议栈: 进程可以拥有独立的ip地址及tcp/udp端口空间

其它

在了解隔离机制之后我们可以了解Docker中的两个核心概念:

容器:容器的本质是进程,它拥有独立的命名空间。因此容器表现很像一个虚拟操作系统,拥有自己的进程树,文件系统等。

镜像:镜像是容器运行依赖的文件系统,就像每个Linux操作系统时都需要挂载root文件系统/,镜像就是容器的root文件系统。

Docker采用服务端/客户端架构:

Docker采用UnionFS技术将镜像设计为分层结构,即一个镜像分为多层,每一层在上一层的基础上构建(即存储增量)。在容器中只能看到所有层叠加后的结果,隐藏了分层的结构。因为镜像层会被其它层依赖,为了保证下层能正常工作, 镜像层在创建后就无法进行修改。

Get Started

Docker目前分为免费的社区版(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 images

docker images命令用于显示本地所有镜像:

REPOSITORYTAGIMAGE IDCREATEDSIZE
ubuntu   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 search

DockerHub是docker官方提供的公有仓库,docker search命令用于根据关键字搜索DockerHub中的镜像:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/3ca3f0b8ec255e6a4b4a35f1c7319039.html