持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
基本介绍
Container layer是在image layer上面的一层封装。
容器层其实是可以写数据的,而镜像层是只读的。
但是容器层写的数据仅限于container,例如我们停掉某个容器删除,那么这个数据就没了。但是我们可能有一个数据库的container,这个数据库肯定要读写数据文件,是以文件形式存储在本地,如果我们不小心删掉容器,数据就没了。。。 -》 要保存住这个数据!
大的方块是容器,默认情况是写到container layer层,但是我们可以通过一种机制让其数据写到本地的一个外挂的存储,所以不会因为容器删除而丢失数据,形成数据持久化:
第二种实现方式要求高,没有这种环境。本章节主要介绍第一种方案。
\
我们希望容器里面数据不会随着container消失而消失,例如数据库容器。
1. 第一种实现 - Data Volume
Docerkfile有一个关键字Volume,可以指定容器某一个目录产生的数据挂载到另一个地方,这里我们已官方的mysql为例:
1.1 带有volume的容器创建
上述就是把mysql的数据挂载到/var/lib/mysql目录下面。
我们首先执行一个命令在后台启动mysql容器:
sudo doceker run -d --name mysql1 mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
上述加了一个环境变量,意味着mysql容器不需要密码:
现在会发现已经有一个docker volume了(因为Dockerfile里面配置了):
1.2 看一下volume细节
sudo docker volume inspect xxxx
这里我们再创建一个mysql容器:
这里其实我们把某一个容器停掉并移除掉,这个volume还是存在的:
sudo docker stop mysql1 mysql2
sudo docker rm mysql1 mysql2
1.3 volume别名
volume的名字太长了,能不能自己起一个别名?
我们把之前的volume删除。然后重新创建一个容器,加一个参数 -v [name]:[path]:
sudo doceker run -d -v mysql:/var/lib/mysql --name mysql1 mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
可以看到此时volume名称变为mysql了。
1.4 验证volume
这里我们先进入一个mysql容器,在里面创建一些数据,然后删除重建,看看数据还在不在:
sudo docker exec -it mysql1 /bin/bash
然后退出容器并删除重建:
此时volume还在:
我们新建了一个mysql2容器,进去看看:
这个docker数据库还在。验证成功。