Docker技术入门与实战

Docker是基于Go语言实现的开源容器项目。简单地讲,读者可以将Docker容器理解为一种轻量级的沙盒(sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。

Docker容器虚拟化的好处

Docker提供了一种更为聪明的方式,通过容器来打包应用,解耦应用和运行平台。意味着迁移的时候,只需要在新的服务器上启动需要的容器就可以了,无论新旧服务器是否是同一类型的平台。这无疑将节约大量的宝贵时间,并降低部署过程出现问题的风险。

作为一种轻量级的虚拟化方式,Docker在运行应用上与传统的虚拟机方式相比具有显著优势:

·Docker容器很快,启动和停止可以在秒级实现,而传统的虚拟机方式需要数分钟。

·Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器(在IBM服务器上已经实现了同时运行10K量级的容器实例)。

·Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新。

·Docker通过Dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化。Docker容器除了运行其中应用外,基本不消耗额外的系统资源,保证应用性能的同时,尽量减小系统开销。传统虚拟机方式运行N个不同的应用就要起N个虚拟机(每个虚拟机需要单独分配独占的内存、磁盘等资源),而Docker只需要启动N个隔离的“很薄的”容器,并将应用放进容器内即可。应用获得的是接近原生的运行性能。

Docker技术入门与实战_第1张图片
Docker容器技术与传统虚拟机技术的特性比较

Docker与虚拟化

传统方式是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层。Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级。

Docker技术入门与实战_第2张图片
Docker和传统的虚拟化方式的不同之处


Docker镜像

Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。例如,一个镜像可以包含一个基本的操作系统环境,里面仅安装了Apache应用程序(或用户需要的其他软件)。可以把它称为一个Apache镜像。

镜像是创建Docker容器的基础。通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像,用户甚至可以从网上下载一个已经做好的应用镜像,并直接使用。

Docker容器

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例。可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。

可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

注意:镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

Docker仓库

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。

Docker技术入门与实战_第3张图片
仓库注册服务器与仓库的区别

根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库(Public)和私有仓库(Private)两种形式。目前,最大的公开仓库是官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。

当用户创建了自己的镜像之后就可以使用push命令将它上传到指定的公有或者私有仓库。这样用户下次在另外一台机器上使用该镜像时,只需要将其从仓库上pull下来就可以了。

提示:可以看出,Docker利用仓库管理镜像的设计理念与Git非常相似,实际上在理念设计上借鉴了Git的很多优秀思想。

安装Docker

在Get Docker页面,我们可以看到目前Docker支持Docker Platform、Docker Hub、Docker Cloud和Docker DataCenter。

·Docker Platform:支持在桌面系统或云平台安装Docker;

·DockerHub:官方提供的云托管服务,可以提供公有或私有的镜像仓库;

·DockerCloud:官方提供的容器云服务,可以完成容器的部署与管理,可以完整地支持容器化项目,还有CI、CD功能;

·Docker DataCenter:提供企业级的简单安全弹性的容器集群编排和管理。

笔者推荐尽量使用Linux操作系统来运行Docker,因为目前Linux操作系统对Docker的支持是原生的,使用体验最好。

Ubuntu环境下安装Docker

Docker目前只能运行在64位平台上,并且要求内核版本不低于3.10,实际上内核越新越好,过低的内核版本容易造成功能不稳定。

Docker目前支持的最低Ubuntu版本为12.04 LTS,但实际上从稳定性上考虑,推荐至少使用14.04 LTS版本。

注意:Ubuntu发行版中,LTS(Long-Term-Support)意味着更稳定的功能和更长期(目前为5年)的升级支持,生产环境中尽量使用LTS版本。

CentOS环境下安装Docker

系统的要求与Ubuntu情况下类似:64位操作系统,内核版本至少为3.10。

Docker目前支持CentOS 6.5及以后的版本,推荐使用CentOS 7系统。

使用Docker镜像

镜像(image)是Docker三大核心概念中最为重要的。Docker运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

Docker命令(镜像相关)

docker pull NAME[:TAG]  直接从Docker Hub镜像源来下载镜像,NAME是镜像仓库的名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)
docker images  列出本地主机上已有镜像的基本信息
docker tag 为本地镜像任意添加新的标签
docker inspect 获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等
docker search 搜索远端仓库中␀享的镜像,默认搜索官方仓库中的镜像
docker history  查看镜像历史
docker rmi [-f]  删除镜像,无需担心当同一个镜像拥有多个标签的时候,docker rmi命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像2fa927b5cdd3的一个标签而已

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]  基于已有镜像的容器创建
docker import[OPTIONS]file|URL|-[REPOSITORY[:TAG]]  基于本地模板导入

docker save 导出镜像到本地文件
docker load 将导出的tar文件再导入到本地镜像库
docker push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]  上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)

docker import 和 docker load区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。

操作Docker容器

容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

Docker命令(容器相关)

docker ps -a  可以看到本机上存在的所有容器
docker create 新建一个容器
docker start 启动一个已经创建的容器
docker restart 将一个运行态的容器先终止,然后再重新启动它
docker run  直接新建并启动容器,等价于先执行docker create命令,再执行docker start命令docker daemon 执行出错,例如指定了不支持的Docker命令参数
docker logs 要获取容器的输出信息
docker stop 来终止一个运行中的容器,首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器
docker kill 会直接发送SIGKILL信号来强行终止容器
docker attach/docker exec 进入容器进行操
docker rm 删除处于终止或退出状态的容器,默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器
docker export 导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态

使用Dockerfile创建镜像

Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile来快速创建自定义的镜像。

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。

一般而言,Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

其中,一开始必须指明所基于的镜像名称,接下来一般是说明维护者信息。后面则是镜像操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像就添加新的一层,并提交。最后是CMD指令,用来指定运行容器时的操作命令。

指令说明

1.FROM 指定所创建镜像的基础镜像,如果本地不存在,则默认会去Docker Hub下载指定镜像。格式为FROM 或FROM :或FROM @。任何Dockerfile中的第一条指令必须为FROM指令。并且,如果在同一个Dockerfile中创建多个镜像,可以使用多个FROM指令(每个镜像一次)。
2.MAINTAINER 指定维护者信息,格式为MAINTAINER ,该信息会写入生成镜像的Author属性域中。
3.RUN 运行指定命令。格式为RUN或RUN["executable","param1","param2"]。注意,后一个指令会被解析为Json数组,因此必须用双引号。前者默认将在shell终端中运行命令,即/ bin/sh-c;后者则使用exec执行,不会启动shell环境。每条RUN指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用\来换行。
4.CMD 用来指定启动容器时默认执行的命令。它支持三种格式:CMD ["executable","param1","param2"]使用exec执行,是推荐使用的方式;CMD command param1 param2在/bin/sh中执行,提供给需要交互的应用;CMD ["param1","param2"]提供给 ENTRYPOINT的默认参数。每个Dockerfile只能有一条CMD命令。如果指定了多条命令,只有最后一条会被执行。
5.LABEL LABEL指令用来指定生成镜像的元数据标签信息。
6.EXPOSE 声明镜像内服务所监听的端口。
7.ENV 指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。
8.ADD 该命令将复制指定的路径下的内容到容器中的路径下。格式为ADD 。其中可以是Dockerfile所在目录的一个相对路径(文件或目录),也可以是一个URL,还可以是一个tar文件(如果为tar文件,会自动解压到路径下)。可以是镜像内的绝对路径,或者相对于工作目录(WORKDIR)的相对路径,路径支持正则格式。9.ENTRYPOINT 指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数。每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个有效。
10.VOLUME 创建一个数据卷挂载点。格式为VOLUME["/data"]。可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保存的数据等。
11.USER 指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。12.WORKDIR 为后续的RUN、CMD和ENTRYPOINT指令配置工作目录。格式为WORKDIR/path/to/workdir。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
13.ARG 指定镜像内使用的参数(例如版本号信息等)。
14.ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令。15.STOPSIGNAL 容器退出的信号值。
16.HEALTHCHECK 如何进行健康检查。
17.SHELL 指定其他命令使用shell时的默认shell类型。

你可能感兴趣的:(Docker技术入门与实战)