何为数据卷

英文翻译Volume。数据卷可以理解为宿主机的一个目录。这个机制使容器一个目录和宿主机目录进行绑定,容器使用宿主机目录中的数据。

为何需要数据卷

容器内数据持久化,容器消失数据还在,容器重启数据恢复。
举个例子:数据库中的数据要写入磁盘,就可以把容器中的数据转存到宿主机的/var/mysql/data目录下,这样MySQL升级版本重启,读取/var/mysql/data目录下的数据。保证之前的数据不丢失。

挂载volume

可以将自行或Docker创建的volume挂在到容器,也可以将宿主机目录或文件作为volume挂在到容器。

默认数据卷的数据存放目录如下:
/var/lib/docker/volumes/${volume_name}/_data

Dockerfile下面命令的作用就是把/var/lib/docker/volumes/${volume_name}/_data挂载到容器的/var/data目录。

  1. VOLUME /var/data

真实路径举例

/var/lib/docker/volumes/3f612bd9d0345246b652715a14a11da64ebd21528f4279eb6d79dd7d92edd780/_data

但是实际使用中只是相当于把/var/data做个标记。正常情况下一般运行如下参数,指定明确的目录。

  1. docker run -v /var/mysql/data:/var/data

匿名数据卷(过时不要用)

这种生成卷名字是随机字符串:3f612bd9d0345246b652715a14a11da64ebd21528f4279eb6d79dd7d92edd780 的卷叫匿名数据卷。
下面命令和Dockerfile中的VOLUME等价都是创建匿名卷。

  1. docker run -v /var/data

命名数据卷

  1. # docker volume create foo// 创建一个自定义容器卷
  2. # docker volume ls // 查看所有容器卷
  3. # docker volume inspect foo // 查看指定容器卷详情信息
  4. # docker volume rm edc-nginx-vol // 删除自定义数据卷

数据的覆盖问题

如果卷为空则容器覆盖卷,如果卷非空则卷覆盖容器。

Bind Mounts

  1. docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx

宿主机目录直接覆盖容器里的目录的文件。

Docker Swarm