在容器中管理数据主要有两种方式:

  • 数据卷(Volumes)
  • 挂载主机目录 (Bind mounts)

数据卷

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

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

注意:数据卷的使用,类似于Linux下对目录或文件进行mount,镜像中的被指定为挂载点的目录中的文件会复制到数据卷中(仅数据卷为空时会复制)。

  1. # 创建数据卷
  2. $ docker volume create my-vol
  3. # 查看所有的数据卷
  4. $ docker volume ls
  5. DRIVER VOLUME NAME
  6. local my-vol
  7. # 查看指定数据卷
  8. $ docker volume inspect my-vol
  9. [
  10. {
  11. "Driver": "local",
  12. "Labels": {},
  13. "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
  14. "Name": "my-vol",
  15. "Options": {},
  16. "Scope": "local"
  17. }
  18. ]
  19. # 查看容器,数据卷信息在Mounts Key下
  20. "Mounts": [
  21. {
  22. "Type": "volume",
  23. "Name": "my-vol",
  24. "Source": "/var/lib/docker/volumes/my-vol/_data",
  25. "Destination": "/usr/share/nginx/html",
  26. "Driver": "local",
  27. "Mode": "",
  28. "RW": true,
  29. "Propagation": ""
  30. }
  31. ],
  32. # 在启动容器时挂载数据卷,mount参数表示使用数据卷,source参数用于指定数据卷名称
  33. # target参数用于指定数据卷要挂载到的容器中的目录
  34. $ docker run -d -P \
  35. --name web \
  36. --mount source=my-vol,target=/usr/share/nginx/html \
  37. nginx:alpine
  38. # 删除数据卷
  39. $ docker volume rm my-vol
  40. # 删除容器的同时移除数据卷
  41. $ docker rm -v
  42. # 批量清理没有被挂载的数据卷
  43. $ docker volume prune

挂载主机目录

下面的命令加载主机的 /src/webapp 目录到容器的 /usr/share/nginx/html目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 —mount 参数时如果本地目录不存在,Docker 会报错。此外,也可以通过这种方式挂载单个文件。

  1. $ docker run -d -P \
  2. --name web \
  3. # -v /src/webapp:/usr/share/nginx/html \
  4. --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
  5. nginx:alpine

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

  1. $ docker run -d -P \
  2. --name web \
  3. # -v /src/webapp:/usr/share/nginx/html:ro \
  4. --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html,readonly \
  5. nginx:alpine

-v/—volumn参数和—mount参数的差异

-v(—volume)参数只能建立bind mount,—mount参数在不指定type选项时候,默认为挂载volume,但也可以通过指定type选项来建立bind mount和tmpfs。

建立bind mount和挂载volume的区别

对比项 bind mount volume
Source位置 用户指定 /var/lib/docker/volumes/
Source为空 覆盖dest为空 保留dest内容
Source非空 覆盖dest内容 覆盖dest内容
Source种类 文件或目录 只能是目录
可移植性 通常(自行维护) 强(docker托管)
宿主直接访问 容易(仅需chown) 受限(需登录root用户)*

参考文献

Docker数据卷挂载命令volume(-v)与mount的总结 http://www.javashuo.com/article/p-vzzffnob-np.html