上次说了如何使用dockerhub和如何搭建私有仓库,上次给大家留了个悬念,就是关于-v,如果容器删除了如何保存数据,就是通过挂载主机目录和数据卷的概念。
看下redis对应的Dockerfile,里面有个VOLUME,VOLUME就是数据存储的标识。数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS(UNIX文件系统的)
docker run --name some-redis -d -p 6379:6379 redis
docker volume ls
docker volume ls 发现有很多个,不知道那个是具体刚创建的关联的数据卷
docker inspect some-redis
这个是数据卷,跟刚才的docker volume中的第二个是一样的ID
查看volume单独的描述
docker volume inspect ID
docker run --name some-redis -d -p 6380:6379 redis
发现增加了一个volume。每次创建都有增加一个volume
结论不会发生任何的变化,原来4条还是4条。
docker volume rm <volumeID>
创建了一个volume的名称
docker volume create redis_volume
docker run --name some-redis3 -d -p 6380:6379 -v redis_volume:/usr/local/etc/redis/redis.conf redis
docker volume inspect redis_volume
1.数据卷 可以在容器之间共享和重用。2.对 数据卷 的修改会立马生效。3.对 数据卷 的更新,不会影响镜像。4.数据卷 默认会一直存在,即使容器被删除。保护数据不被删除。
主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。其实这种形式和第一种没有本质的区别,容器内对 /usr/local/etc/redis/redis.conf 的操作都会反映到主机上的 /root 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /root 目录挂载到新的容器内,这样就可以实现数据持久化的目标。
docker run --name some-redis4 -d -p 6381:6379 -v $(pwd):/usr/local/etc/redis/redis.conf redis
docker inspect some-redis4
$(pwd) 指的是当前目录(也还就是/root),也可以指定特定目录。一般来说常用的软件例如redis,mysql,nginx 里面的配置文件都在外边挂载的,但是redis,mysql可能特殊一点,经常把数据文件也挂载在指定的主机目录,我的mac电脑内存太低了。容器启动后影响电脑的速度,不用就删除,用的时候启动,反正数据都在主机的目录下。
原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。这次不做详解,以后k8s的时候会重点说的。
Flocker 的结构:
PS:数据卷在容器管理平台使用非常频繁,如果是本机安装一个软件的话,建议使用主机目录,因为自己来管理,目录还是比较方便的。