Docker-容器数据卷 – 记忆角落

Docker-容器数据卷

/ 0评 / 0

Docker-容器数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  1. 数据卷 可以在容器之间共享和重用
  2. 数据卷 的修改会立马生效
  3. 数据卷 的更新,不会影响镜像
  4. 数据卷 默认会一直存在,即使容器被删除

用户可以通过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

区分是具名挂载还是匿名挂载,或者是指定路径挂载

  1. -v 容器内路径--> 匿名挂载
  2. -v 具名:容器内路径-->具名挂载
  3. -v /宿主机路径:容器内路径-->指定路径挂载

挂载的可读可写权限设置

Docker 挂载主机目录的默认权限是 读写,用户也可以通过增加 readonly 指定为 只读

一旦设置了容器权限,则容器对我们的挂载是做出了限制的

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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注