Docker 容器数据卷

容器数据卷

一、什么是容器数据卷

我们知道,Docker是把应用和环境一起打包成一个镜像发布出去。如果我们的数据都在容器中,那么我们把容器删除之后,数据就会丢失。所以我们想要数据持久化。假如我们搞了个MySQL容器,如果一不小心将MySQL容器删除了,就会很危险。所以我们需要MySQL的数据可以存储在本地。于是基于上述两种需求,我们就出现了容器数据卷的技术,容器之间有一个数据共享的技术。Docker容器产生的数据同步到本地。说白了就是目录的挂载,将我们容器的目录挂载到Linux上面。

二、使用数据卷

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

命令

docker run -it -v 宿主机目录:容器内目录

测试

docker run -it -v /home/ceshi:/home centos /bin/bash
docker ps     # 查看容器id
docker inspect 87e46c7dd4df

测试文件的同步。

再来测试

停止容器,在宿主机修改文件,就算容器内关闭了,也会同步修改。

修改宿主机上的文件。

再次启动centos镜像查看文件是否改变。

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

三、实战MySQL数据同步

思考:MySQL的数据持久化的问题!

1、获取镜像

docker search mysql       # 搜索MySQL

docker pull mysql:5.7     # 拉取MySQL5.7

2、运行容器,需要做数据挂载! 安装启动mysql 需要配置密码

官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

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 mysql:5.7

-d 后台运行
-p 端口映射
-v 卷挂载 可配置多个 -v
-e 环境配置
--name 容器名字

测试连接(Navicat)

在本地测试创建一个test数据库,在本地查看是否存在。

即使容器删除,宿主机数据依旧存在,这就实现了容器数据持久化功能!

四、具名和匿名挂载

1、匿名挂载

-v 容器内路径!

docker run -d -P --name nginx01 -v /etc/nginx nginx

docker volume ls             # 查看所有的 volume 的情况

 

2、具名挂载

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx         # -v 容器内路径

查看宿主机

Docker 容器中所有的卷,在没有指定目录的情况下,都在"var/lib/docker/volumes/xxxxx/_data"

我们可以通过具名挂载找到卷的位置,大多数情况下,我们使用具名挂载。

关于docker的挂载问题,有三个比较容易混淆的概念: (区分的方式)

(1)具名挂载:-v 参数 卷名:容器内路径
(2)匿名挂载:-v 参数后面 没有写上容器之外的地址, docker 自己会在docker内部给你找个位置
(3)指定路径挂载: -v /宿主机路径::容器内路径

拓展:

-v 容器内路径:ro/rw 改变读写权限

ro  readonly     # 只读
rw  readwrite    # 可读可写

设置权限之后,容器对我们挂载出来的内容就有限定(只能通过宿主机改变,容器内部无法改变)

例:
docker run -d  -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx        # 只能通过宿主机操作,容器内无法操作
docker run -d  -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx 

 五、通过 volumes-from 实现容器之间数据共享

图例:

1、使用之前DokerFile构建好的test-centos 启动第一个centos容器命名为centos01。

docker run -it --name centos01 test-centos

按ctrl+p+q 使centos01容器不停止退出。

2、启动第二个centos容器加 volumes-from 参数,继承centos01的volumes 命名为centos02。

docker run -it --name centos02 --volumes-from centos01 test-centos

3、新开xshell窗口,进入centos01容器,创建测试文件 docker01。

docker attach centos01  // 进入centos01容器

cd /volume01            // 进入volume01目录

ls                      // 查看volume01目录是否为空

touch docker01          // 创建docker01测试文件

 4、返回到centos02容器中,查看是否出现docker01文件。

5、启动第三个centos容器加 volumes-from 参数,同样继承centos01的volumes 命名为centos03。

docker run -it --name centos03 --volumes-from centos01 test-centos

cd /volume01    // 进入volume01目录

ls              // 查看是否存在docker01文件

touch centos03  // 创建centos03文件

6、进入到docker01容器中,查看刚刚创建的docker03文件是否存在。

docker attach centos01

cd /volume01

ls

7、停止并销毁centos01容器,查看刚刚创建的docker01、docker03文件是否还存在。

 8、使用centos镜像实现宿主机与容器 容器与容器 之间实现数据共享。

docker run -it -v /home/centos:/home --name centos01 centos    // 将宿主机home目录与centos01容器进行数据共享

docker run -it --name cnetos02 --volumes-from centos01 centos  // 创建启动centos02容器加 volumes-from 参数,继承centos01的volumes实现与cnetos01容器进行数据共享 从而达到与宿主机进行数据共享

结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,即使销毁容器这时候本地的数据是不会删除的!

posted @ 2022-05-23 10:19  荔枝的汁  阅读(26)  评论(0编辑  收藏  举报