Docker应用容器引擎
li_zliang·济南
一、关于Docker理论
1.1容器和虚拟机
我们在理解docker之前,首先我们得先区分清楚两个概念,容器和虚拟机。
虚拟机:
我们用的传统虚拟机如VMware,VisualBox之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用。每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
容器:
容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。
容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。
1.2什么是docker
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的Linux容器解决方案。
Docker将应用程序与该程序的依赖,打包在一个文件系统里面。运行这个文件系统,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了Docker,就不用担心环境问题。
总体来说,Docker的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
1.3Docker的基本概念
从上图我们可以看到,Docker中包括三个基本的概念:
Image(镜像)
Container(容器)
Repository(仓库)
镜像是Docker运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。
1.3.1Image(镜像)
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
1.3.2Container(容器)
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
由于容器的定义并没有提及是否要运行容器,所以实际上,容器=镜像+读写层。
1.3.3Repository(仓库)
Docker仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,DockerRegistry(仓库注册服务器)就是这样的服务。
仓库又可以分为两种形式:
public(公有仓库)
private(私有仓库)
DockerRegistry公有仓库是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
除了使用公开服务外,用户还可以在本地搭建私有DockerRegistry。Docker官方提供了DockerRegistry镜像,可以直接使用做为私有Registry服务。当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上pull下来就可以了。
1.3.4镜像标签(tag)
为区分一个仓库中的不同镜像(不同镜像版本),DockerHub引入标签。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过仓库名:标签的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签.。
为了方便镜像的查找,同一个镜像可以存在不同的标签。如ubuntu:latest与ubuntu:16.04可能具有相同的镜像ID,镜像ID才是镜像的唯一标识。
1.4Docker的架构
Docker使用C/S结构,即客户端/服务器体系结构。Docker客户端与Docker服务器进行交互,Docker服务端负责构建、运行和分发Docker镜像。Docker客户端和服务端可以运行在一台机器上,也可以通过RESTful、stock或网络接口与远程Docker服务端进行通信。
这张图展示了Docker客户端、服务端和Docker仓库(即DockerHub和DockerCloud),默认情况下Docker会在Docker中央仓库寻找镜像文件,这种利用仓库管理镜像的设计理念类似于Git,当然这个仓库是可以通过修改配置来指定的,甚至我们可以创建我们自己的私有仓库。
Docker的核心组件包括:
DockerClient
Dockerdaemon
DockerImage
DockerRegistry
DockerContainer
1.4.1DockerClient
DockerClient,也称Docker客户端。它其实就是Docker提供命令行界面(CLI)工具,是许多Docker用户与Docker进行交互的主要方式。客户端可以构建,运行和停止应用程序,还可以远程与Docker_Host进行交互。最常用的Docker客户端就是docker命令,我们可以通过docker命令很方便地在host上构建和运行docker容器。
1.4.2Dockerdaemon
Dockerdaemon是服务器组件,以Linux后台服务的方式运行,是Docker最核心的后台进程,我们也把它称为守护进程。它负责响应来自DockerClient的请求,然后将这些请求翻译成系统调用完成容器管理操作。该进程会在后台启动一个APIServer,负责接收由DockerClient发送的请求,接收到的请求将通过Dockerdaemon内部的一个路由分发调度,由具体的函数来执行请求。
dockerdaemon包含以下三部分:
DockerServer
Engine
Job
DockerDaemon可以认为是通过DockerServer模块接受DockerClient的请求,并在Engine中处理请求,然后根据请求类型,创建出指定的Job并运行。DockerDaemon运行在Dockerhost上,负责创建、运行、监控容器,构建、存储镜像。
1.4.3DockerImage
Docker镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。我们可将Docker镜像看成只读模板,通过它可以创建Docker容器。
镜像有多种生成方法:
从无到有开始创建镜像
下载并使用别人创建好的现成的镜像
在现有镜像上创建新的镜像
我们可以将镜像的内容和创建步骤描述在一个文本文件中,这个文件被称作Dockerfile,通过执行dockerbuilddocker-file命令可以构建出Docker镜像。
1.4.4DockerRegistry
Dockerregistry是存储dockerimage的仓库,它在docker生态环境中的位置如下图所示:
运行dockerpush、dockerpull、dockersearch时,实际上是通过dockerdaemon与dockerregistry通信。
1.4.5DockerContainer
Docker容器就是Docker镜像的运行实例,是真正运行项目程序、消耗系统资源、提供服务的地方。DockerContainer提供了系统硬件环境,我们可以使用DockerImages这些制作好的系统盘,再加上我们所编写好的项目代码,run一下就可以提供服务啦。
1.4.6Docker组件是如何协作运行容器
看到这里,我相信各位读者朋友们应该已经对Docker基础架构已经熟悉的差不多了,我们还记得运行的第一个容器吗?现在我们再通过hello-world这个例子来体会一下Docker各个组件是如何协作的。
容器启动过程如下:
Docker客户端执行dockerrun命令
Dockerdaemon发现本地没有hello-world镜像
daemon从DockerHub下载镜像
下载完成,镜像hello-world被保存到本地
Dockerdaemon启动容器
具体过程可以看如下这幅演示图:
我们可以通过dockerimages可以查看到hello-world已经下载到本地
我们可以通过dockerps或者dockercontainerls显示正在运行的容器,我们可以看到,hello-world在输出提示信息以后就会停止运行,容器自动终止,所以我们在查看的时候没有发现有容器在运行。
我们把Docker容器的工作流程剖析的十分清楚了,我们大体可以知道Docker组件协作运行容器可以分为以下几个过程:
Docker客户端执行dockerrun命令
Dockerdaemon发现本地没有我们需要的镜像
daemon从DockerHub下载镜像
下载完成后,镜像被保存到本地
Dockerdaemon启动容器
二、docker安装(在线安装)
docker版本
Docker分为CE和EE两大版本。CE即社区版(免费,支持周期7个月),EE即企业版,强调安全,付费使用,支持周期24个月。
DockerCE的安装请参考官方文档:
MacOS: