在前一篇文章 Docker学习与和应用(一)_初步认识中,我们初步介绍了Docker解决了什么问题,Docker容器化技术与传统的虚拟化方式的区别,以及简要介绍了Docker的几大核心概念:镜像、容器和仓库。本文主要介绍Docker的使用,包括:

  • 使用Docker管理镜像、容器和仓库

  • 使用Dockerfile创建自定义镜像

  • 容器的数据管理

Docker的安装和基础命令

Docker是建立在Linux内核基础上的,在目前的主流Linux系统中,都已经原生支持了Docker且使用体验也最好,当然,在Windows平台和MacOS系统中也支持Docker,只是需要使用类似Boot2Docker等虚拟化工具来提供Linux支持。关于在各种平台上安装Docker的方法参考官网的Docker Docs,这里不再赘述。

Docker提供了很多命令来管理镜像、容器和仓库。包括:

  • 从Docker Hub仓库中查找search、上传push、下载pull镜像。

  • 查看本地已有镜像、容器信息的imagesinspectps命令。

  • 删除本地镜像和容器的rmirm命令。

  • 基于已有容器创建镜像的commit命令和基于Dockerfile创建镜像build命令。

  • 运行、进入容器的runexecattach命令。

  • 镜像的保存和导入命令saveload,容器的导出导入命令exportimport

具体命令的使用方法使用命令docker --help查看所有命令列表,使用docker COMMAND --help查看具体命令的信息。下面是我用一张图总结的Docker的基础命令,供大家参考。
Docker_command

关于Docker的使用,可以跟着官网提供的示例运行学习 Hello world in a container,另外所有的命令可以查阅官网The Docker commands

使用Dockerfile创建镜像

创建自定义镜像的方法有两种:

  • 从一个镜像启动容器后,对容器进行操作更新,然后使用docker commit命令将对镜像的操作提交。

  • 使用Dockerfile的方式创建自定义的镜像。

使用docker commit命令的方式构建自定义镜像(参考Creating our own images),简单但是不够方便,此外,由于创建镜像的过程不够透明,不利于将镜像共享给他人使用、同时还不利于团队审阅镜像的创建过程。

针对上述问题,docker提供了的Dockerfile,通过使用指令配置的方式来创建镜像。Dockerfile是由一行行的命令指令组成,通过指令来阐述镜像的创建过程。从这个角度来看,Dockerfile类似于Makefile等工具,用来自动化构建镜像。

Dockerfile大体由四部分组成:

  • 指明基础镜像指令FROM

  • 维护者信息指令MAINTAINER

  • 镜像操作指令RUNEVNADDWORKDIR

  • 容器启动时的执行指令CMDENTRYPOINTUSER
    Dockerfile

这些指令的使用方法可以参考Docker Tutorial:使用 Dockerfile 实现自动化和官方Docker Doc:Dockerfile reference。使用Dockerfile创建自定义镜像很简单,但是要编写一个高质量的Dockerfile并不容易,除了查阅官方文档以外,可以参考Docker Hub中社区提供的大量Dockerfile范例。

Docker容器的数据管理

在使用Docker的过程中,必然会涉及到容器的数据管理操作,例如查看容器内应用生成或更新的数据,容器内数据的备份/恢复,容器之间进行数据共享等操作。Docker中数据管理等方式主要有两种:

  • 数据卷(Data volumes)

  • 数据卷容器(Data volume containers)

数据卷和数据卷容器

数据卷是一个供容器使用的特殊目录,用来存放持久化或共享数据的地方,而数据卷容器其实就是一个普通容器,只是这个容器专门提供数据卷给其它容器挂载使用,因此,数据卷和数据卷容器之间有着密切的联系,并不是两个完全不相关的概念。

当使用docker run或者docker create命令时,使用-v就可以在容器内创建一个数据卷,默认情况下,Docker Engine会在宿主机上的/var/lib/docker/volumes/目录下创建一个特殊目录,供容器挂载使用,而挂载了这个数据卷的容器便可以称为数据卷容器。我们将这种方式,称为在容器里创建一个数据卷,此外,我们还可以指定挂载一个宿主机的本地目录到容器中作为数据卷。
Data volume&volume containers

如上图所示,volume container1分别挂载了容器内创建的数据卷/vol1以及指定挂载了一个宿主机中的本地目录作为数据卷/vol2。而volume container2则只挂载了数据卷/vol2。通过这样,当我们修改Docker默认数据目录以及修改挂载的本地宿主机目录时,数据卷容器中挂载的数据卷/vol1和数据卷vol2中的数据也都会进行变更,反之亦然。

除了上述创建数据卷的方式外,我们还可以使用--volume-from的方式,指定数据卷容器,从而挂载其中的数据卷。还是上图中,containerA和containerB在使用docker run创建容器时,通过--volume-from选项指定直接使用volume container2中的数据卷/vol2。

数据卷的特性

通过前面所述,我们理解了什么是数据卷和数据卷容器,接下来,简要总结数据卷的特性:

  • 当我们在创建容器时,数据卷就会自动初始化。

  • 数据卷可以在容器之间共享和复用。

  • 对数据卷的数据的更新,不会影响到镜像。

  • 对数据卷的修改会立刻生效。

  • 数据卷中的数据会一直存在,直到删除最后一个挂载该数据卷的容器被删除时,还需要显示指定删除关联的数据卷。

通过Docker提供的数据卷和数据卷容器的特性和机制,我们可以对容器内的数据进行共享、备份和恢复,增加了容器的容灾能力。即使容器在运行过程中发生故障也不用担心,只需要快速重新创建容器,挂载数据卷即可。当然,在实际生产环境中,还是需要配合支持诸如RAID、DRBD、以及ceph和HDFS等分布式存储技术来的达到数据的安全性和高可用性。

参考&引用


dinghb
71 声望1 粉丝