4.我在B站学云原生之Docker容器数据持久化介绍与实践
全栈工程师修炼指南
2022年02月09日 14:58
收录于文集
共39篇

本章目录

  • 0x03 Docker 数据管理

    • 1.数据卷

    • 2.数据卷容器


0x03 Docker 数据管理

Data Management,在使用Docker时候必然会在容器内产生数据,或者需要将容器内的数据进行备份,甚至多个容器之间进行数据共享,这时数据管理变得尤为重要;

容器中管理数据的主要有两种方式:

  • 数据卷:Data Volumns

  • 数据卷容器:Data Volume Dontainers

数据管理共享的方式:

  • 使用数据卷容器在容器和主机

  • 容器和容器之间共享数据

1.数据卷

描述:是一个可供容器使用的数据目录,并且让文件系统提供很多有用的特性,数据卷的使用类似于Linux对目录或者文件进行mount操作;

特性:

  • 数据库可以在容器之间共享和重用

  • 数据卷修改后会立马生效

  • 对数据卷的更新不会影响镜像

  • 卷会一直存在,即使容器被删除

Q:如何在容器内创建一个数据卷?

代码块
Shell
自动换行
复制代码
#### 创建一个web容器并创建一个数据卷挂载到容器的/webapp目录下(默认将宿主机/根映射到容器中webapp目录中)
$ sudo docker run -d -P 5000 --name web(新建容器) -v /webapp(容器目录) training/webapp(镜像) python app.py
# --name 指定容器的名称
# -v:将镜像的存放位置放在本地指定的路径上.
# -P:是允许外部访问容器需要暴露的port
# -d:是容器的后台运行守护

#cp 把容器文件copy到宿主机,或者把宿主机的文件copy到容器
$docker cp 容器id或者name:/home/wwwroot/1.php /home/Lcy/ #把容器的1.php拷贝到宿主机家目录
$docker cp config.php 容器id或者name:/home/wwwroot/    #把宿主机的config.php拷贝到容器
复制成功

挂载主机目录/文件作为数据卷:

代码块
Shell
自动换行
复制代码
#挂载一个主机目录作为数据卷 /src/webapp[主机目录]:/opt/webapp[容器目录]:rw (权限)
$ sudo docker run -d -P --name web -v  /src/webapp:/opt/webapp:rw training/webapp python app.py
# Docker挂载数据卷的默认权限 rw,ro[只读]          //加入ro后数据卷的数据就无法修改了

#挂载一个本地文件作为数据卷(注意再挂载文件得时候尽量设置ro自读,防止inode不一致报错)
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
# --rm :当它退出自动移除容器 即docker ps -aq 不能查询到
复制成功

实践案例: 创建一个只有读取权限的数据卷到容器内部,此处利用--mount参数进行设置。

代码块
Shell
自动换行
复制代码
# 1.创建演示文件
echo "read only file" > /tmp/config.ini

# 2.创建并运行read-container容器,利用--mount参数将/tmp/config.ini文件挂载到容器/app/config.ini中
docker run -d --name read-container --workdir /app --mount type=bind,source=/tmp/config.ini,target=/app/config.ini,readonly alpine:latest top

# 3.进入read-only-container容器内部尝试编辑/app/config.ini在保存时会提示该文件 'config.ini' is read only.
docker exec -it read-container sh
/app # vi config.ini
config.ini [Readonly] 1/1 100%
复制成功

2.数据卷容器

描述:IF用户需要在容器之间共享一些持续的数据,最简单的方式就是使用数据卷容器(实际上就是一个普通容器); 使用数据卷容器可以让用户在容器之间自由地升级和移动数据卷;

首先创建一个数据卷容器dbdata并在其中创建一个数据卷挂载到/dbdata上;

代码块
Shell
自动换行
复制代码
$ sudo docker run -it -v /dbdate --name dbdate ubuntu

#然后在容器中进行使用 创建两个容器db1 / db2
$ sudo docker run -it --volumes-from dbdate --name db1 ubuntu
$ sudo docker run -it --volumes-from dbdate --name db2 ubuntu
#使用--volumes-from参数所挂载数据卷的容器自身并不需要保持运行状态


#修改目录中其中任何一个文件,其他容器的该目录都会改变
$ sudo docker run -d --name db2 --volumes-from db1 tarining/postgresql      #可以从已有挂载了容器卷的容器来挂载数据卷
#删除挂载的容器(dbdata 、 db1 、db2)数据卷饼不会被自动的删除,必须在删除最后一个挂载着它容器时显示使用Docker rm -v 命令来指定同时删除关联的容器;
复制成功

(1) 数据卷容器迁移数据 可以利用数据卷容器对其中的数据卷进行备份、恢复以实现数据的迁移;

代码块
Shell
自动换行
复制代码
#备份: 创建一个worker容器 ,将本地当前目录挂载到容器中backup目录,进行选择数据目录备份压缩
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdate

#恢复: 首先创建一个带有数据卷的容器dbdata2
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
#解压备份文件到挂载的数据卷中
$ sudo docker run --volumes-from dbdata2 $(pwd):/backup busybox tar xvf /backup/backup.tar
复制成功

实例演示:

代码块
Shell
自动换行
复制代码
#挂载
$docker run --name web --rm -dit -v /opt:/opt/ centos /bin/bash
5b3d35fe3305fb458e8b33f39d5fedfbd7d9cb1f6742bcf725cfbf2ecd0245fc
#进入容器
$docker start -i 5b3
#建立一个文件
[root@5b3d35fe3305 opt]$ vi containerDokcer.txt
#宿主机器目录查看
[root@zabbix opt]$ cat containerDokcer.txt
#!/bin/bash
docker

#挂载单个文件
$docker run --rm -it -v ~/.bash_history:/root/.bash_history centos /bin/bash
$docker rm -vf web  #删除容器和数据卷
$docker ps -a  #由于使用--rm参数则会在容器退出时候删除容器
复制成功

补充说明::Z与:z的区别

代码块
Shell
自动换行
复制代码
#配置selinux标签如果使用selinux,可以添加z或z选项来修改挂载到容器中的主机文件或目录的selinux标签
#:z选项指示绑定挂载内容在多个容器之间共享。
#:Z选项表示绑定挂载内容是私有和非共享的。
#重要:当使用绑定与服务挂载时,selinux标签(:z和:Z)以及:ro将被忽略,设置了z选项以指定多个容器可以共享绑定挂载的内容,此时不能使用——mount标记修改selinux标签
docker run -d --restart=always --name app-v /disk/webapp/war/:/usr/local/tomcat/webapps:z -p 4081:8080 -e JAVA_OPTS=-Dsome.property=value -e Xmx=1536m tomcat-base:6.0.85-jre8
复制成功

总结说明:

  • 推荐直接挂载文件目录到容器中,如果直接挂载一个文件到容器中在使用文本编辑工具时候可能会报错;

  • 可以多次使用--volumes-from参数从来多个容器挂载多个数据卷;锁挂载的容器自身并不需要保持在运行状态

  • 推荐使用数据卷和数据容器之外的物理备份存储系统,如RAID或者分布式系统如Ceph,GPFS,HDFS等


至此本节完毕,敬请期待下一小节内容。

Docker容器技术入门实践系列历史已发布文章(点击即可进入):

1.我在B站学云原生之Docker容器技术基础知识介绍​

2.我在B站学云原生之Docker容器环境安装实践​

3.我在B站学云原生之Docker容器三大核心概念介绍​


欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】或者 个人公众号【WeiyiGeek】联系我。


更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】 个人博客。

博客地址: https://weiyigeek.top 

人生的意义在于实现自我价值的认同感与幸福感。

专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏【点个赞、投个币、收个藏、关个注,转个发】,这将对我的肯定,谢谢!。