在前一篇文章 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
镜像。查看本地已有镜像、容器信息的
images
、inspect
和ps
命令。删除本地镜像和容器的
rmi
和rm
命令。基于已有容器创建镜像的
commit
命令和基于Dockerfile创建镜像build
命令。运行、进入容器的
run
、exec
和attach
命令。镜像的保存和导入命令
save
和load
,容器的导出导入命令export
和import
具体命令的使用方法使用命令docker --help
查看所有命令列表,使用docker COMMAND --help
查看具体命令的信息。下面是我用一张图总结的Docker的基础命令,供大家参考。
关于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
镜像操作指令
RUN
、EVN
、ADD
和WORKDIR
等容器启动时的执行指令
CMD
、ENTRYPOINT
和USER
等
这些指令的使用方法可以参考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/
目录下创建一个特殊目录,供容器挂载使用,而挂载了这个数据卷的容器便可以称为数据卷容器。我们将这种方式,称为在容器里创建一个数据卷,此外,我们还可以指定挂载一个宿主机的本地目录到容器中作为数据卷。
如上图所示,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等分布式存储技术来的达到数据的安全性和高可用性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。