1. 数据卷可以在容器之间共享和重用。
  2. 对数据卷的更改会立即生效。
  3. 对数据卷的更新不会影响镜像。
  4. 数据卷会一直存在,直到没有容器使用。
  1. $ docker volume create my-data //创建一个自定义数据卷
  2. $ docker volume ls //查看所有数据卷
  3. $ docker volume inspect my-dat //查看指定数据卷的详细信息
  4. [
  5. {
  6. "CreatedAt": "2021-04-06T01:20:50Z",
  7. "Driver": "local",
  8. "Labels": {},
  9. "Mountpoint": "/var/lib/docker/volumes/my-data/_data",
  10. "Name": "my-data",
  11. "Options": {},
  12. "Scope": "local"
  13. }
  14. ]
  15. //启动一个 nginx 容器并设置容器使用我们刚才创建的 my-data 数据卷
  16. $ docker run -d -it --name=my-nginx -p 8888:80 -v my-data:/usr/share/nginx/html nginx
  17. //之后我们删除 my-nginx 容器,但是其对应的数据卷并没有删除,再创建另外一个 nginx 容器的时候依然可以继续使用 my-data 数据卷,则以前的数据依然保留。而且我们还可以启动多个nginx 容器,共享同一个数据卷。

由于在 mac 和 windows 系统上,docker 的运行方式不太一样(在win、mac 上安装 docker,实际上是安装了一个 docker 虚拟机,而我们创建的容器都是跑在 docker 虚拟机中的)。
macOS 下进入虚拟机

  1. $ screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
  2. //docker 版本小于18.06 则使用如下命令
  3. $ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

清理数据卷

  1. // 删除自定义数据卷
  2. $ docker volume rm my-data

挂载目录(可以使用多个-v)

  1. $ docker run -it -v 宿主机目录绝对路径:容器内目录绝对路径 镜像名

匿名挂载(只指定容器内的目录)

  1. //docker 会自动创建一个 随机名字的 volume,并和centos 的 home 目录绑定
  2. $ docker run -d -v /home centos

具名挂载(设置 volume 具体名称进行挂载)

  1. //docker 会自动创建一个名字为 abc 的 volume,并和centos 的 home 目录绑定
  2. $ docker run -v abc:/home centos

数据卷容器

数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
_

  1. //创建一个数据卷容器dbdata
  2. $ docker run -it -v /dbdata --name dbdata ubuntu
  3. //然后,可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷.
  4. //例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:
  5. $ docker run -it --volumes-from dbdata --name db1 ubuntu
  6. $ docker run -it --volumes-from dbdata --name db2 ubuntu
  • 容器 db1 和 db2 都挂载同一个数据卷到相同的 /dbdata 目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。
  • 可以多次使用 —volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
  • 使用 —volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
  • 如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v 命令来指定同时删除关联的容器。