Docker之容器数据卷

一、什么是容器卷

数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化

MySQL,容器删除了,删库跑路!需求:MySQL数据可以存储在本地!

容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!

这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

目的:容器的持久化和同步操作,容器间可以数据共享

Docker之容器数据卷_mysql

二、使用数据卷

方式一:直接使用命令来挂载

-v, --volume list                    Bind mount a volume

docker run -it -v 主机目录:容器内目录 -p 主机端口:容器内端口
➜ ~ docker run -it -v /home/ceshi:/home centos /bin/bash
#通过 docker inspect 容器id 查看

Docker之容器数据卷_linux_02


测试文件的同步

1、停止容器

2、宿主机修改文件

3、启动容器

4、容器内的数据依旧是同步的

5.容器删掉,宿主机也还有数据

以后修改只需要在本地修改即可,容器内会自动同步!

三、实战:安装mysql

MySQL的数据持久化命令

# 运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,这是要注意点!
# 参考官网hub
docker search mysql

# 拉取
docker pull mysql:5.7

# 挂载
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql5.7

-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置 安装启动mysql需要配置密码
--name 容器名字

# 在本地测试创建一个数据库,查看一下我们映射的路径是否ok!

我们将容器删除 ,发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。

四、具名和匿名挂载

# 匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 查看所有的volume的情况
➜ ~ docker volume ls
DRIVER VOLUME NAME
local 9948f0d3d123c9d45c442ac7728cb85599c2657e50d
local
# 这里发现,这种就是匿名挂载,我们在 -v只写了容器内的路径,没有写容器外的路劲!

# 具名挂载
➜ ~ docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
➜ ~ docker volume ls
DRIVER VOLUME NAME
local juming-nginx

# 通过 -v 卷名:容器内路径
# 查看一下这个卷

发现:所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data下
如果指定了目录,docker volume ls 是查看不到的。

# 三种挂载: 匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载 docker volume ls 是查看不到的

扩展:

# 通过 -v 容器内路径: ro rw 改变读写权限
ro #readonly 只读
rw #readwrite 可读可写
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx05 -v juming:/etc/nginx:rw nginx
# ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

五、初识Dockerfile

DockerFile使用来构建docker镜像的文件

# 创建一个dockerfile文件,名字可以随便 建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash
#这里的每个命令,就是镜像的一层!
yum install vim # 编辑文件的,没有装一下

安装完之后就可以运行这个命令了

六、多个容器数据共享

多个MySQL同步数据!

命名的容器挂载数据卷

Docker之容器数据卷_linux_03

--volumes-from list              Mount volumes from the specified container(s)
# 测试,我们通过刚才启动的

启动docker01

docker run -it --name docker01 latteitcjz/centos:1.0 # 1.0必须写

当前这个ctrl+p+q不停止退出

依次启动docker02、docker03

docker run -it --name docker02 --volumes-from docker01 latteitcjz/centos:1.0

docker02继承docker01的volumes

可以验证,在docker01下加一个数据,在docker02下也会出现

创建docker03,同样继承docker01

docker run -it --name docker03 --volumes-from docker01 latteit/centos:1.0

在docker03的volume01下建立文件,在docker01的volume01下同样也有

即通过–volumes-from 可以实现不同容器间的数据共享

删除docker01,数据还在

docker rm -f

可以看到,删除docker01,进入docker02,数据依然在

多个mysql实现数据共享

➜  ~ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
➜ ~ docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,可以实现两个容器数据同步!

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用位置

但是如果持久化到了本地,即使所有容器删除了,本地数据是不会删除的

Docker之容器数据卷_mysql_04