何为数据卷
英文翻译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目录。
VOLUME /var/data
真实路径举例
/var/lib/docker/volumes/3f612bd9d0345246b652715a14a11da64ebd21528f4279eb6d79dd7d92edd780/_data
但是实际使用中只是相当于把/var/data做个标记。正常情况下一般运行如下参数,指定明确的目录。
docker run -v /var/mysql/data:/var/data
匿名数据卷(过时不要用)
这种生成卷名字是随机字符串:3f612bd9d0345246b652715a14a11da64ebd21528f4279eb6d79dd7d92edd780 的卷叫匿名数据卷。
下面命令和Dockerfile中的VOLUME等价都是创建匿名卷。
docker run -v /var/data
命名数据卷
# docker volume create foo// 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect foo // 查看指定容器卷详情信息
# docker volume rm edc-nginx-vol // 删除自定义数据卷
数据的覆盖问题
如果卷为空则容器覆盖卷,如果卷非空则卷覆盖容器。
Bind Mounts
docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx
宿主机目录直接覆盖容器里的目录的文件。