Docker容器我们可以理解就是微型的linux系统,在使用容器的时候自然会产生一系列数据文件,当容器被我们删除的时候,数据也会一并删除,那么就会产生以下种种问题:
想要解决上述的相关问题,那么就引出了我们的Docker容器数据卷
数据卷(Data Volumes) 是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器。可以简单的理解为docker容器数据卷就是我们使用的移动硬件,它存在于一个或多个的容器中,由 docker挂载到容器,但不属于联合文件系统(Union FileSystem),Docker不会在容器删除时删除其挂载的数据卷。
它可以提供很多有用的特性:
我们之前在介绍常用命令dcoker run的时候应该看到了 -v 的一个参数,没错它就是用来指定数据卷的
docker run -d -v 主机目录:容器目录 镜像名称
我们本章将以redis为例,演示配置文件配置和防止redis缓存数据的丢失;
首先博主宿主机定义的数据卷目录如下(大家可以自行定义):
顺便复习一下上一章节dicker常用命令
#拉取镜像
docker pull redis
#查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 0ec8ab59a35f 6 days ago 117MB
因为我们用的latest版本,我们到github官网下载一份最新的redis配置文件,地址https://github.com/redis/redis/blob/unstable/redis.conf
保存至我们redis配置文件目录,即 /data/redis/redis.conf 大家按需修改配置文件即可
注意配置文件中一定要设置 否则会导致-d 冲突从而无法启动的问题
#关闭仅允许本机访问
# bind 127.0.0.1 ::1
#关闭后台启动
daemonize no
开始执行挂载数据卷,一个是配置文件,一个是redis数据文件
docker run -p 6379:6379 --name myredis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf
#查看容器
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32546e99aa31 redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp myredis
首先进入容器 myredis 是我们创建容器时定义的命名 --name myredis
docker exec -it myredis /bin/bash
我们知道配置文件中默认的 databases=16 ,则最大我们选择数据库最大只能15,如图
我们修改宿主机中的redis配置文件将数据库最大支持10个;
#修改配置文件
vim /data/redis/redis.conf
#修改databases最大支持数
databases 10
修改完成保存退出,我们重启我们的容器
#重启redis容器
docker restart myredis
#重新进入容器
docker exec -it myredis /bin/bash
#进入redis
redis-cli
#测试选择库
select 15
不出意外会得到下面的图
从而得出一个结论证明容器里redis读取的配置就是我宿主机中的配置;
为了验证数据丢失问题我们将redis容器删除,再次之前我们redis先设置几个key,我们现在有两个key
开始删除容器
#停止容器
docker stop myredis
#删除容器
docker rm -f myredis
重新安装新的redis容器,同样挂载相同的配置目录和data目录;
docker run -p 6379:6379 --name myredis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis redis-server /etc/redis/redis.conf
#重新进入容器
docker exec -it myredis /bin/bash
#进入redis
redis-cli
#查看key 注意之前测试插入key选择是哪个库,进行select
keys *
最终如下图:
OK我们也证明了容器里redis保存的数据已经和宿主机进行了挂载关联,容器删除只要宿主机数据还在,重新恢复容器数据依旧存在;
通过本章redis的操作实例,大家应该能明白容器数据卷使用的目的,如果你还不是很清楚,没关系可以点赞关注,后续章节将会有更多实操案例让大家巩固了解!
下一章:在Centos Stream 9上Docker的实操教程 - Docker公有仓库和私有仓库