本文目录
1. 为什么要使用数据卷(Data Volumes)
- 当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时会一起删除。比如,我们启动了一个
mysql容器,如果哪天我们把这个mysql容器给删除了,那数据也就一起删除了。使用Docker数据卷可以把这个mysql容器的数据保存到宿主主机。数据不会随着容器的删除而删除。 - 实现容器之间的数据共享。比如,我们想要两个Nginx之间共同使用一个配置文件。
数据卷(Data Volumes) 是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进 容器。可以简单的理解为docker容器数据卷就是我们使用的移动硬件,它存在于一个或多个的容器中,由 docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
2 .数据卷类型(Data Volumes)
Docker提供了三种数据卷类型:
- 宿主机数据卷(bind mount): 直接在宿主机的文件系统中但是容器可以访问,这种类型是比较常用的一种类型。
- 命名的数据卷: 由Docker管理的数据卷,创建的容器的时候指定数据卷名称,docker数据卷默认目录为:
/var/lib/docker/volumes。 - 匿名数据卷: 由Docker管理的数据卷,创建的容器的时候不需要指定数据卷名称,由Docker随机生成,docker数据卷默认目录为:
/var/lib/docker/volumes。
3. 宿主机数据卷
容器内的数据可以存放到宿主机文件系统的任意位置,除了docker之外的进程也可以任意对他们进行修改。
docker run -v /宿主机绝对路径目录:/容器内目录 镜像名
注意事项
- 挂载数据卷,最好是通过run而非create/start创建启动容器,create/start命令创建启动容器 后,再挂载数据卷相当麻烦,要修改很多配置文件。
- docker官网推荐尽量进行目录挂载,不要进行文件挂载。
3.1. 示例 1
把Mysql数据,保存到宿主机的指定目录下。
Mysql镜像地址:https://hub.docker.com/_/mysql
-
拉取mysql镜像
docker pull mysql:5.7.36 -
运行镜像
把Mysql容器数据存放到宿主主机
-v /usr/data/mysql:/var/lib/mysql目录。docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -eMYSQL_ROOT_PASSWORD=123456 -v /usr/data/mysql:/var/lib/mysql mysql:5.7.36 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci启动成功后,可以进入到
/usr/data/mysql目录,里面存放着Mysql的数据。在Mysql中创建一张表,然后删除容器后在启动容器,查看刚才创建的表是否还在
3.2. 示例2
把tomcat容器webapps数据存放到宿主主机-v /usr/data/tomcat8/:/usr/local/tomcat/webapps/目录。
docker run -itd --name tomcat8.5 -v /usr/data/tomcat8/:/usr/local/tomcat/webapps/ -p 8080:8080 tomcat:8.5.45-jdk8-corretto
3.3 数据覆盖问题
- 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。
- 如 果原来容器中的目录有数据,那么原始数据会被隐藏掉
4. 命名和匿名数据卷
由Docker管理的数据卷,创建的容器的时候指定数据卷名称(不需要指定具体的路径),docker数据卷默认目录为:/var/lib/docker/volumes。
-
运行镜像
# 拉取镜像 docker pull nginx:1.21.4-perl # 启动nginx容器,把nginx配置目录挂载到nginx-volume数据卷 docker run -itd --name nginx -v nginx-volume:/etc/nginx/ -p 80:80 nginx:1.21.4-perl -
查看数据卷
docker volume ls #使用inspect查看数据卷详细信息 docker volume inspect nginx-volume[root@localhost volumes]# docker volume inspect nginx-volume [ { "CreatedAt": "2021-12-25T01:41:27+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data", "Name": "nginx-volume", "Options": null, "Scope": "local" } ] -
清理数据卷
删除上面创建的容器后会,发现数据卷仍然存在,我们就需要去清理它,不然会占用我们的资源
# 清理数据卷 docker volume prune
5.匿名数据卷
由Docker管理的数据卷,创建的容器的时候不需要指定数据卷名称,由Docker随机生成,比如启动一个Nginx容器
docker run -itd --name nginx -v /etc/nginx/ -p 80:80 nginx:1.21.4-perl
-v /etc/nginx/ 没有指定数据卷名称,docker会随机生成一个。
6. 数据卷容器(Data Volume Containers)
如果需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器(Data Volume Containers)。数据卷容器 也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。

-
基础镜像
docker pull centos:7.8.2003 docker pull nginx:1.21.4-perl -
创建数据卷容器
使用
centos:7.8创建一个名为data-volume数据卷容器,把nginx的/usr/share/nginx/html目录和 宿主主机/usr/data/nginx目录做关联。docker run -d --name data-volume -v /usr/data/nginx:/usr/share/nginx/html centos:7.8.2003创建好的数据卷容器是处于停止运行的状态,因为使用
—volumes-from参数所挂载数据卷的容器 自己并不需要保持在运行状态。 -
启动两个Nginx
使用
--volumes-from参数挂载到data-volume数据卷。这样两个nginx就可以共享使用同一个数据目录了。docker run -itd --name nginx01 -p 8080:80 --volumes-from data-volume nginx:1.21.4-perl docker run -itd --name nginx01 -p 8081:80 --volumes-from data-volume nginx:1.21.4-perl
参考文档:
https://docs.docker.com/storage/volumes/
680

被折叠的 条评论
为什么被折叠?



