Docker数据卷
数据卷介绍
数据卷的技术可以理解为将宿主机上的一个目录与Docker中的目录数据共享的技术。
带来的好处:
- 数据的持久化( 备份)
- 方便的文件修改(从外部直接修改Docker内的文件)
- 容器间数据共享(多个容器共享数据卷)
数据卷的简单使用
命令直接挂载
1 | docker run -v 主机目录:容器内目录 |
还可以使用DockerFile进行挂载,这个下面介绍DockerFile会详细讲,现在知道有这个方式就行了。
匿名挂载和具名挂载
理解前先学习一个数据卷管理的命令
1 | docker volume |
了解了上面的命令之后,我们再来进行下面实战操作

当我们不选择指定本地挂在路径的时候,Docker会为我们创建一个Volume进行数据保存,匿名挂载就是不写明数据卷的名字,这时候就是以哈希值命名,而具名挂载就是指定挂载的名字,这时候可以看到,volume的名字就是我们指定的名字。
我们如果想要知道这个volume在宿主机上的具体路径时,可以通过docker volume inspect $VOLUME_ID
获取,如下图所示
1 | [root@ramon ~]# docker volume inspect nginx02 |
整理下挂载方式如下:
1 | -v 本地路径:Docker路径 # 指定目录挂载 |
容器间数据卷共享
1 | docker run --volumes-from $CONTAINER |
Docker镜像详解
什么是Docker镜像
概念:Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
我的理解:Docker镜像就可以理解为一个自带运行环境的软件包,运行这个文件就可以获取一个Docker容器。
Docker镜像基本操作
前面的文章中我们已经介绍了一些镜像的基本操作,比如镜像的查找(search)、下载(pull)、查看(images)、删除(rmi)等,今天对其他镜像相关的命令进行介绍。
1. 镜像提交
1 | docker commit |
2. 镜像导出
1 | docker save |
3. 镜像导入
1 | docker load |
4. 容器导出
1 | docker export |
5. 导入容器文件系统为镜像
1 | docker import |
6. 展示镜像制作流程
1 | docker history |

这里要说明下,可以看到镜像是一个命令一层的,在下面我们会对Dokcer镜像原理进行详细介绍,看完原理后再看这里就会有不一样的感觉。
##save-load、export-import的区别
这两对命令都是导入导出,官方介绍load-save是针对镜像导入导出,而export-import是针对容器进行导入导出,那我们能不能混用呢?当然不可以了,这里我们对比下导出的文件内容:

先看下右边export导出的文件,是一个完整的文件系统的内容,而左边save保存的内容则为一个一个的文件夹及配对的VERSION、json、layer.tar文件,这个就是我们下面要讲的Docker镜像内部了,一个分层的UnionFS(联合文件系统)。
Docker镜像原理
Docker镜像前面已经说了,就是一个自带运行环境的软件包,而Dokcer镜像底层使用的技术为UnionFS(联合文件系统),通过这个技术,Docker镜像实现分层的机制,大大减少镜像的存储。下面我们就先来介绍下UnionFS。
UnionFS
介绍
UnionFS的功能就像名字一样,联合文件系统 — 将多个目录内容(可以是物理位置分开)联合挂载到一个目录下,并且允许可读和可读写的目录并存,将可读目录的修改保存到可写目录下
实践
1 | 实践出真理,不过centos的联合文件系统overlay2显示不支持,这里就直接用我的ubuntu 16.04的机器测试了 |
layer
简单介绍了UnionFS,我们再看看下镜像的层次设计。
用户制作镜像时候的每个操作都会生成一个层,每个层都是一个增量的rootfs(目录),这里可以查看之前docker history $IMAGE_ID
的显示:
注:rootfs是操作系统所包含的文件、配置和目录,不包含操作系统内核,这也是容器体积小的原因

可以看到nginx镜像的制作流程和层级关系,通过UnionFS一层一层叠加联合最终得到我们的nginx镜像。
而对于一些相同操作的层是可以共享的,比如镜像A与镜像B都有centos和go的层级,就可以共享这些内容,这个在我们使用docker pull $IMAGE_ID
的时候看到过,这样大大减少了镜像的存储空间,加快了下载速度。
一个容器在启动的时候从下往上分为以下三个层:
- 只读层:只读目录,不可修改
- Init层:Dokcer项目的内部层,放置一些专属的初始化文件,
docker commit
的时候不会包含 - 可读写层:运行后的修改都会放在这一层(写时复制),相当于快照
具体文件可以通过docker inspect
查看。
1 | [root@ramon ~]# docker ps -a |
DockerFile
DokcerFile简介
DockerFile就是用来构建镜像的脚本文件。
构建步骤:
- 编写一个DockerFile文件
- docker build 构建一个镜像
- docker run 运行镜像
DockerFile语法
基础语法
- 每个保留关键字(指令)都是大写字母
- 执行从上到下顺序执行
- 注释使用
#
- 每个指令都会创建一个新的镜像层
Dokcer指令
(图片来源于网络)
1 | FROM # 选择使用的基础镜像 |
构建命令
1 | docker build |
DcokerFile实战
实战: 制作一个自己centos镜像
1 | 目标:对原有centos镜像安装vim与net-tools工具(练手) |
镜像发布
发布到DockerHub
步骤:
- 在官网注册账号
- 确认账号可以登录
- 在服务器登录账号
docker login
- 提交镜像
docker push
1 | 这里记得创建一个新的带上你id的镜像存储库 |
这个是外网,可能有点慢或者连不上,可以选择阿里云的镜像仓库,具体操作阿里云文档写的很全面了,这里就不介绍了。
对了,退出账号的话使用docker logout
就可以了。