容器数据卷
什么是容器数据卷
docker 理念回顾
将应用和环境打包成一个镜像!
问题:数据?如果数据都在容器中,那么我们删除容器,数据就会丢失!需求:数据可以持久化!
容器之前可以有一个数据共享技术! Docker 容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们的容器内的目录,挂载到 Linux 上
总结:容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器目录
# 测试
[root@zhujixiang home]# docker run -it -v /home/cesi:/home centos /bin/bash
# 启动起来之后我们可以通过 docker inspect 容器id
测试文件的同步
再次测试:
# 1、先关闭容器
# 2、修改本地文件
# 3、打开容器,进入容器查看
# 4、发现同步到了容器内部的文件
好处:只在本地修改即可,会自动同步到容器内部!
实战:安装MySQL
# 1、获取镜像
[root@zhujixiang /]# docker pull mysql:5.7
# 2、运行容器,需要做数据挂载 安装启动 mysql 需要配置密码
# 启动MySQL
-d 后台运行
-p 端口暴露
-v 卷挂载
-e 环境配置
--name 容器名字
[root@zhujixiang /]# 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
# 3、本地测试,可以连接到MySQL服务器
# 4、在本地建立一个数据库,发现可以同步到映射的文件夹
# 5、即使删除容器,本地依旧存在 实现了容器数据持久化
[root@zhujixiang data]# ls
auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys
ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem test_zjx
具名挂载和匿名挂载
# 匿名挂载
docker run -d -P /etc/nginx ngin
# 查看所有的 volume 的情况
[root@zhujixiang /]# docker volume ls
DRIVER VOLUME NAME
local 1f53f4e57b5c9a933e1982266f4d59bf24ffc75a13eed0a922284fe178356c2d
# 这里发现,这种就是匿名挂载,我们在 -v 的时候只写了容器内的路径,没有写容器外的路径!
# 具名挂载
[root@zhujixiang home]# docker run -d -P -v juming-nginx:/etc/nginx nginx
[root@zhujixiang home]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
所有的 docker 容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx 目录下
我们通过具名挂载可以更方便的找到一个卷,大多是情况下使用具名挂载
# 如何确定是匿名挂载还是具名挂载,还是指定路径挂载
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读
rw readwrite # 可读可写
# 一旦这个设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
# 只要看到 ro 就说明只能通过宿主机来操作,容器内部没有办法操作,默认是 rw
初识Dockerfile
Dockerfile 就是用来构建 Docker 镜像的创建文件!命令脚本!体验一下!
# 创建一个 dockerfile 文件,名字可以随机 建议使用 dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
# 这里面每一个命令,就是镜像的一层
# 启动自己写的容器
这个卷和外部一定有一个同步的目录!
查看一下卷挂载的路径
测试一下刚才的文件是否同步出去了!
这种方式我我们未来使用的十分多,因为我们通常会构建自己的镜像!
假设构建镜像的时候我们没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
[root@zhujixiang home]# cd /var/lib/docker/volumes/60449cb067e6ca8d7f1185b2393f4f9a90d7edf0c8335a92267c5657d181496a/_data
[root@zhujixiang _data]# ls
container.txt
数据卷容器
两个 MySQL 同步数据!
# 启动3个容器,通过我们自己刚才写的镜像启动
# 测试:删除 docker01 ,查看一下 docker02 和 docker03 是否还可以访问这个文件
# 测试依旧可以访问文件
多个 mysql 实现数据共享
[root@zhujixiang /]# docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@zhujixiang /]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
# 这个时候,就可以实现两个容器数据同步!
结论
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的!
PS:我只是一个刚刚开始学习 Docker 的小白,学习源自B站 遇见狂神说