Docker数据卷
Docker Data Volume
作用:用来实现容器中数据和宿主机中数据进行映射同步
注意:数据卷使用必须在容器首次启动时设置
数据卷的使用
设置数据卷在docker run时使用-v选项,多个数据卷挂载使用多个-v选项
一、使用绝对路径设置数据卷
# 语法
docker run -v 宿主机路径:容器内路径:权限 ...
# 注意:当本地路径目录存在且目录内有文件时,宿主机的该目录会直接覆盖容器内目录内容,参考示例3。如不想被覆盖,应该指定空目录挂载。
# 示例,将本地的/test目录挂载到容器的/test目录,宿主机和容器中原本没有/test目录都会被直接创建,权限可缺省,默认rw(可读写)
docker run -tid --name v-centos -v /test:/test centos:7
# 示例2,创建容器时指定ro权限,则容器内针对该目录只读,不可写,只能在宿主机上修改该目录内的文件
docker run -tid --name v-centos2 -v /test:/test:ro centos:7
# 示例3,容器内该目录存在,则就是将本地/apps目录内容挂载(覆盖)到容器内的webapps/,不会在容器内创建apps目录
docker run -tid --name test—tomcat -v /root/apps/:/usr/local/tomcat/webapps/ tomcat:8.0
# 示例4,除了目录,还可以挂载文件,如下将history的历史记录文件挂载到容器中了
docker run -it -v $HOME/.bash_history:/root/.bash_history centos:7 /bin/sh
二、使用别名方式设置数据卷
# 语法,和使用绝对路径的方式一致,只是将宿主机绝对路径改为了别名,这个别名就是数据卷,不存在会被创建
# 注意:别名不能使用路径,如果使用路径那就是绝对路径的挂载方式了,本地不存在那个目录也会在该路径下直接创建一个
docker run -v 别名:容器内路径:权限 ...
# 示例
docker run -d -p 8083:8080 --name tomcat04 -v aaaa:/usr/local/tomcat/webapps tomcat:8.0
创建数据卷
docker run的时候直接指定不存在也会自动创建的。
docker volume create 数据卷名
查看所有数据卷名称(绝对路径挂载的不在其中)
docker volume ls
查看指定数据卷具体信息
docker inspect 数据卷名
删除数据卷
docker volume rm my-vol
清空所有无主(未被挂载)的数据卷
docker volume prune
三、数据卷的存储位置(别名方式)
默认是在 /var/lib/docker/volumes 下,我在 /etc/docker/daemon.json 中修改了数据目录,所以是在 /data/volumes/ 下。
如 docker volume create my-vol 命令创建一个数据卷,会在/data/volumes/下创建一个 my-vol 目录,其中又会有一个 _data 目录,这个目录实际上才是容器内挂载目录的真实数据,所以使用数据卷的方式挂载不会覆盖容器中目录的内容,除非这个数据卷已经被修改过数据了又被二次挂载到了其它的容器上。
--mount标记
--mount参数用作挂载本地目录到容器(可直接被-v参数替代,作用类似于-v参数的第一种方式)。
--mount 参数时如果本地目录不存在,Docker 会报错,而使用 -v 参数时如果本地目录不存在 Docker 会自动创建一个文件夹。
# 示例
$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
# 使用--mount挂载时指定权限
$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html:ro \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly \
nginx:alpine