Docker-容器数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷
可以在容器之间共享和重用- 对
数据卷
的修改会立马生效 - 对
数据卷
的更新,不会影响镜像 数据卷
默认会一直存在,即使容器被删除
用户可以通过docker run
的--volume/-v
或--mount
选项来创建带有数据卷的容器,但这两个选项有些微妙的差异,在这里总结梳理一下。
注意:
数据卷
的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。
--volume(-v)
参数--volume
(或简写为-v
)只能创建bind mount。
docker run -v 主机目录:容器内目录
示例:
docker run --name nginx02 -d -p 8888:80 \
-v /data01/tmp/docker_nginx/log:/var/log/nginx \
-v /data01/tmp/docker_nginx/nginx.conf:/etc/nginx/nginx.conf:rw \
-v /data01/tmp/docker_nginx/conf.d:/etc/nginx/conf.d:ro \
-v /data01/tmp/docker_nginx/html:/usr/share/nginx/html \
nginx
docker run --name mysql001 -p 13306:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
--mount
参数--mount
默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。如果不指定type
选项,则默认为挂载volume,volume是一种更为灵活的数据管理方式,volume可以通过docker volume
命令集被管理。
创建一个数据卷
docker volume create my-vol
查看所有的 数据卷
docker volume ls
查看指定 数据卷
的信息
docker volume inspect my-vol
启动一个挂载数据卷的容器
实例1:
docker run --name mysql001 -p 13306:3306 \
# -v /home/mysql/data:/var/lib/mysql \
--mount source=my-vol,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
上面的命令加载主机的 my-vol
目录到容器的 /var/lib/mysql
目录。
实例2:
docker run -d -P \
--name nginx_web \
# -v /home/webapp:/usr/share/nginx/html \
--mount type=bind,source=/home/webapp,target=/usr/share/nginx/html \
nginx:latest
上面的命令加载主机的 /home/webapp
目录到容器的 /usr/share/nginx/html
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v
参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount
参数时如果本地目录不存在,Docker 会报错。
挂载一个本地主机文件作为数据卷
--mount
标记也可以从主机挂载单个文件到容器中
docker run -it \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
--name mount_centos \
centos:7.9.2009 /bin/bash
505 cat .bash_history
506 history
507 ls
508 history
[root@76e955ef2c99 ~]#
这样就可以记录在容器输入过的命令了。
删除数据卷
docker volume rm my-vol
差异总结
创建bind mount(-v)和挂载volume(--mount)的比较
对比项 | bind mount(-v) | volume(--mount) |
---|---|---|
Source位置 | 用户指定 | /var/lib/docker/volumes/ |
Source为空 | 覆盖dest为空 | 保留dest内容 |
Source非空 | 覆盖dest内容 | 覆盖dest内容 |
Source种类 | 文件或目录 | 只能是目录 |
可移植性 | 一般(自行维护) | 强(docker托管) |
宿主直接访问 | 容易(仅需chown) | 受限(需登陆root用户)* |
创建bind mount时使用--volume
和--mount
的比较
对比项 | --volume 或 -v |
--mount type=bind |
---|---|---|
如果主机路径不存在 | 自动创建 | 命令报错 |
具名挂载和匿名挂载
具名挂载和匿名挂载的文件夹都默认放到:/var/lib/docker/volumes/
下
匿名挂载:
-v 容器内路径
创建一个匿名挂载列子:
docker run -d -P --name nginx01 -v /usr/share/nginx/html nginx:latest
# 查看所有的 volume情况
[root@gzbsc001 ~]# docker volume ls
DRIVER VOLUME NAME
local 22e3386afda151953d1d633f4e008af9dc438204be95b7cbd7fbdbfbc1a2c95d
这里发现,,这种就是匿名挂载,乱码形式...
具名挂载:
-v juming:容器内路径
创建一个具名挂载列子:
docker run -d -P --name juming_nginx -v juming_nginx:/usr/share/nginx/html nginx:latest
# 查看所有的 volume情况
[root@gzbsc001 ~]# docker volume ls
DRIVER VOLUME NAME
local juming_nginx
区分是具名挂载还是匿名挂载,或者是指定路径挂载
-v 容器内路径
--> 匿名挂载-v 具名:容器内路径
-->具名挂载-v /宿主机路径:容器内路径
-->指定路径挂载
挂载的可读可写权限设置
Docker 挂载主机目录的默认权限是 读写
,用户也可以通过增加 readonly
指定为 只读
。
ro readonly
-->只读rw readwrite
-->可读可写
一旦设置了容器权限,则容器对我们的挂载是做出了限制的
docker run -d -P --name juming_nginx -v juming_nginx:/usr/share/nginx/html:ro nginx:latest
docker run -d -P --name juming_nginx -v juming_nginx:/usr/share/nginx/html:rw nginx:latest