前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Docker核心:深入理解Docker容器数据卷

Docker核心:深入理解Docker容器数据卷

作者头像
百思不得小赵
发布2022-12-01 15:06:01
9920
发布2022-12-01 15:06:01
举报
文章被收录于专栏:小赵Java总结

目录

容器数据卷介绍

Docker容器运行时产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。例如:容器中部署了MYSQL数据库,如果有一天将部署MySQL数据库的容器删除了,存放的数据也就丢失。为了能保存数据在Docker中我们使用卷来实现容器内数据与我们指定的目录文件同步,当某一方数据发生修改时,另一方也随之改变。

因此,容器的持久化和同步操作!容器间数据也是可以共享的!

使用数据卷

方式一:使用命令进行挂载数据 -v

代码语言:javascript
复制
docker run -it -v 主机目录:容器内目录

测试一下: 将主机/home/ceshi与容器中的/home目录进行绑定

查看当前容器的详细信息:docker inspect 容器ID

① 在容器内创建了一个test.java文件,自动同步到了主机内:

② 在主机内创建了一个haha.java然后自动同步到容器内:

③ 退出容器,此时容器停止运行

修改主机上的test.java文件,添加如下内容

重新启动容器

查看容器中的test.java文件,发现数据依然同步成功!

这时就实现了主机与容器数据的同步和共享!!

MySQL 数据同步

① 拉取MySQL镜像到本地

② 运行容器挂载数据

代码语言:javascript
复制
 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

③ 启动成功,使用数据库连接工具进行连接

连接成功

④ 查看本地主机,数据挂载成功

⑤ 使用数据库连接工具创建数据库

主机数据同步成功

⑥ 测试删除容器,数据是否存在

数据依旧存在:

MySQL数据本地持久化测试成功!!

具名挂载和匿名挂载

匿名挂载

-v 容器内路径 (不指定主机名,只指定容器内路径)

代码语言:javascript
复制
docker run -d -P --name nginxtest -v /etc/nginx nginx

查看所有 volume 信息

代码语言:javascript
复制
docker volume ls

在之前只指定容器内路径,没有写容器外路径,这就是匿名数据卷,类似于上图的格式。

具名挂载

-v 卷名:容器内路径

代码语言:javascript
复制
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

查看数据卷具体的位置

代码语言:javascript
复制
docker volume inspect 名称

Docker中所有的数据卷,如果没有指定目录的情况下,都在/var/lib/docker/volumes/ 目录下。

如何确定是具名挂载匿名挂载指定路径挂载

-v 容器内路径 匿名挂载 -v 卷名:容器内路径 具名挂载 -v /主机路径:容器内路径 指定路径挂载

拓展

通过 -v 容器内路径:ro ( rw ) 改变读写权限 ro readonly 只读 rw readwrite 可读可写 一旦设置容器权限,容器对挂载出的内容就有限定

代码语言:javascript
复制
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

初始Dockerfile

方式二:Dockerfile挂载数据卷

Dockerfile就是用来构建docke镜像的构建文件,是一段命令脚本,通过脚本可以生成镜像,镜像是一层一层的,脚本是一行一行的命令,每个命令都是一层!!

① 编写dockerfile脚本 (指令都是大写)

代码语言:javascript
复制
FROM centos

VOLUME ["volume1","volume2"]

CMD echo "-----end-----"

CMD /bin/bash

② 构建镜像

代码语言:javascript
复制
docker build -f dockerfile全路径 -t 镜像名称 .

构建成功,生成镜像

③ 启动容器

代码语言:javascript
复制
docker run -it 8eb8e022a7af /bin/bash

生成的数据卷与外部一定有一个同步的目录。

在容器中创建一个文件`container.txt

查看数据卷挂载的路径:

查看在容器中创建的 文件是否同步到主机

发现数据同步成功!!

数据卷容器

容器和容器之间的数据进行同步!

① 启动3个容器 启动docker01

启动docker02

② 在docker01中volume1目录下创建docker01文件

③ 查看docker02中volume1目录下是否存在docker01文件

docker01中的数据挂载到了docker02上,实现数据同步,docker01叫做数据卷容器!

④ 启动docker03容器挂载docker01

⑤ 在docker03中创建数据,在docker01中查看也是存在的。

⑥ 删除docker01容器,数据依旧可以访问!

⑦ 多个mysql实现数据共享

代码语言:javascript
复制
 docker run -d -p 3306:3306  -v /etc/mysql/conf.d
 -v /var/lib/mysql 
 -e MYSQL_ROOT_PASSWORD=123456 
   --name mysql01 mysql:5.7

 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 mysql02 --volumes-from mysql01 mysql:5.7

最后总结

  • 容器数据卷的本质就是实现数据的持久化、数据的共享!
  • 三种实现方式:1.手动-v 命令。2.使用Dockerfile构建镜像,自动挂载数据。3.使用--volumes-from实现容器之间的数据共享,数据同步
  • 容器之间配置信息的传递,数据卷容器的生命后期一直持续到没有容器为止!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 容器数据卷介绍
  • 使用数据卷
    • MySQL 数据同步
      • 具名挂载和匿名挂载
        • 初始Dockerfile
          • 数据卷容器
          • 最后总结
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档