Docker 学习之 Docker 容器数据卷

容器数据卷

什么是容器数据卷

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站 遇见狂神说

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章