在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:
- volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)
- bind mounts:意为着可以存储在宿主机系统的任意位置;(比较常用的方式)
但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。 - tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式)
Volumes
创建数据卷
docker volume create edc-nginx-vol # 创建一个自定义容器卷
docker volume ls # 查看所有容器卷
docker volume inspect edc-nginx-vol # 查看指定容器卷详情信息
启动容器时挂载数据卷
docker run -d -it --name=edc-nginx -p 8800:80 -v edc-nginx-vol:/usr/share/nginx/html nginx
其中,edc-nginx-vol
指的是创建数据卷的名称,/usr/share/nginx/html
指的是要挂载到的容器中的路径名,如果不填写edc-nginx-vol:
即省略数据卷名称,则会分配一个匿名的数据卷。
需要注意的是:
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷
- 如果目录不存在,会自动创建
清理卷
docker stop edc-nginx # 暂停容器实例
docker rm edc-nginx # 移除容器实例
docker volume rm edc-nginx-vol # 删除自定义数据卷
bind mounts
bind mounts可以挂载宿主机的任意位置,语法:
docker run -d -it --name=edc-nginx -v /app/wwwroot:/usr/share/nginx/html nginx
其中/app/wwwroot
指的是宿主机中的路径,/usr/share/nginx/html
指的是要挂载到容器中的路径。
注意: 必须是绝对路径
通过docker inspect edc-nginx
可以看到容器相关信息,包括binds信息。
数据卷挂载的另一个应用是可以多个容器挂载同一个数据卷从而实现容器间的数据交换。
数据卷容器
为了有效地维护多容器的数据共享,可以维护一个数据卷容器,挂载数据卷,其他容器通过--volumes-from
从该容器获取数据卷配置。

例:
docker run –it --name=c3 –v /volume centos:7 /bin/bash
docker run –it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run –it --name=c2 --volumes-from c3 centos:7 /bin/bash
有点像继承c3的数据卷配置,当c3的数据卷配置修改时c1和c2也会修改。
原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/docker%e6%95%b0%e6%8d%ae%e6%8c%82%e8%bd%bd-%e6%95%b0%e6%8d%ae%e5%8d%b7%e4%bb%8b%e7%bb%8d/