「走进k8s」Docke数据共享和持久化(五)
原创文章,欢迎转载。转载请注明:转载自IT人故事会,谢谢!
原文链接地址:「走进k8s」Docke数据共享和持久化(五)
上次说了如何使用dockerhub和如何搭建私有仓库,上次给大家留了个悬念,就是关于-v,如果容器删除了如何保存数据,就是通过挂载主机目录和数据卷的概念。
(一)数据卷
看下redis对应的Dockerfile,里面有个VOLUME,VOLUME就是数据存储的标识。
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS(UNIX文件系统的)
- ①运行redis容器
docker run --name some-redis -d -p 6379:6379 redis
docker volume ls
docker volume ls 发现有很多个,不知道那个是具体刚创建的关联的数据卷
- ②查看redis容器描述,找到对应的volume的ID
docker inspect some-redis
这个是数据卷,跟刚才的docker volume中的第二个是一样的ID
查看volume单独的描述
docker volume inspect ID
- ③再次运行redis容器
docker run --name some-redis -d -p 6380:6379 redis
发现增加了一个volume。每次创建都有增加一个volume
- ④删除一个容器,看看volume会不会变化
结论不会发生任何的变化,原来4条还是4条。
- ⑤删除数据卷
docker volume rm <volumeID>
- ⑥ 数据卷的名字是ID真的不太友好,换个方式
创建了一个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电脑内存太低了。容器启动后影响电脑的速度,不用就删除,用的时候启动,反正数据都在主机的目录下。
(三)Flocker:容器的分布式存储平台
原生的 Docker volume 不具备可移植性。于是,出现了Docker 的分布式卷解决方案 Flocker。这次不做详解,以后k8s的时候会重点说的。
- 好处
1.容器的数据会被写入 Flocker 后端存储而不是主机上,因此,在主机出现故障时可以保证数据不丢失。
2.在容器迁移时,Flocker 会自动地将卷从一个 host 移植到另一个 host。
Flocker 的结构:
PS:数据卷在容器管理平台使用非常频繁,如果是本机安装一个软件的话,建议使用主机目录,因为自己来管理,目录还是比较方便的。