传送门
docker系列1:docker安装
docker系列2:阿里云镜像加速器
docker系列3:docker镜像基本命令
docker系列4:docker容器基本命令
docker系列5:docker安装nginx
docker系列6:docker安装redis
docker系列7:docker安装ES
docker系列8:容器卷挂载(上)
docker系列9:容器卷挂载(下)
容器卷挂载简单回顾
通过前面2节初步接触了容器卷,也从整体了解容器卷!
docker系列8:容器卷挂载(上)
docker系列9:容器卷挂载(下)
这里还是有必要再回顾一下:
什么是容器卷?
从传统的磁盘挂载说起类比到容器卷挂载,所谓的容器卷就是为解决容器数据持久化而将外部设备(目录)挂载到容器(目录)的技术!
解决了什么问题?
这样既解决了容器应用在有状态的应用下的场景,也达到了容器数据共享的目的。所谓的有状态应用典型场景就是docker运行Mysql,里面的数据需要进行持久化,不能因为容器停止而消失
容器卷管理
容器卷的管理也可以像平时开发那样(CRUD-boy)归纳为C-创建、R-读取、D-删除:
C-创建:
# my-vol为卷名称
docker volume create my-vol
R-读取:
docker volume ls
D-删除
docker volume rm my-vol
当然还有其它的一些参数,可以查看docker volume
具名与匿名挂载
通过上面的卷创建命令:docker volume create 卷名称 创建出来的卷进行手动挂载,这种称为具名挂载!反之通过容器启动命令-v挂载的称为匿名挂载:
docker run -v ./content:/content -w /content -i -t ubuntu pwd
比如下面命令查看的卷列表:
容器卷的读写控制
回顾卷挂载的命令:-v 宿主机路径:容器内路径:权限
- 在容器内路径后面,接着指定权限
- r-代表读,w-代表写,ro-代表只读(read only),rw-代表可读可写
关于-v与--mount的选择
卷挂载除了通过-v来使用以外还可以通过--mount方式:
docker run -d \-it \--name devtest \--mount type=bind,source="$(pwd)"/target,target=/app \nginx:latest
关于-v与--mount的选择可以参考Choose the -v or --mount flag
官方推荐的是用mount方式:
New users should use the
--mount
syntax. Experienced users may be more familiar with the-v
or--volume
syntax, but are encouraged to use--mount
, because research has shown it to be easier to use.
手动挂载的烦恼
无论是通过运行容器自动挂载容器卷,还是通过手动管理的方式先创建好容器卷再进行绑定,可以预料的是这样的方式都不是一种理想方式:需要运行镜像在容器启动之后再手动挂载,如果容器实例一多,管理起来在操作上也是件麻烦事情(容器的编排先不去考虑探讨),这是原因这一。
再一个原因是,理论上一般镜像的提供者与使用者并不是同一个人(或团队),如果镜像的提供者在发布的镜像里面要指定卷挂载,或者说要规定一些默认的目录,肯定是不能用上面的方式来设定。
通过Dockerfile文件挂载容器卷
所以Docker提供了专门的方式,让镜像提供者在编写Dockerfile文件时指定卷挂载:
VOLUME ["/data"]
Dockerfile卷挂载命令
命令的具体详情可以查看VOLUME,该命令的表示 :创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。
其中VOLUME命令后参数表示卷挂载的目录,其中["/data"]就是一个普通的json数组,表示可以挂载多个目录;也可以配置多个字符串,VOLUME /var/log
or VOLUME /var/log /var/db。
一个例子
来看一个官方给的例子,Dockerfile文件如下:
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
首先在Linux机器上创建一个文件,比如名字为Dockerfile,该命令的大概意思就是:
- FROM表示,从标准的ubuntu镜像为准
- RUN表示执行shell命令,创建一个文件目录/myvol
- 执行命令,打印"hello world"字符串到greeting文件
- 最后VOLUME,就是这节要讲到卷挂载!
touch Dockerfile
将上面的命令粘贴到该文件中,如下:
然后运行该Dockerfile文件,进行镜像构建:
docker build -t getting-started .
执行之后如果构建成功应该会显示如下结果:
既然是构建了镜像那就先查看一下在没有在镜像列表里面:docker images
接着运行一下这个自己构建的镜像试试:
会发现通过编写Dockerfile构建的镜像,在启动时自动的挂载了对应的卷。可以在宿主机上面查看该目录文件及容器的卷挂载信息:docker inspect 容器ID
这样对应找到该卷的名称之后,再用:docker volume ls里面查询一下,就可以看到卷的信息了,然后再查看该卷信息即可:
宿主机看下存储的目录内容,跟容器里面一致,说明卷也挂载成功!
更多Dockerfile介绍
关于Dockerfile的更多介绍,可以看看这里