Managing Data in Containers

2024-06-06 20:18
文章标签 data containers managing

本文主要是介绍Managing Data in Containers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前面已经介绍了许多基础的知识,现在我们来一起学习如何管理Docker容器里面以及容器之间的数据

先介绍两种原始的方法来管理Docker中的应用

  • ata volumes
  • Data volume container

Data volumes

data volumns是专门设计的工具,它绕过了UFS直接工作与一个或多个容器。它为数据持久和分享提供了许多功能:

  • 容器被创建时,卷(volumn)被初始化。如果基础镜像在指定的挂载点包含数据,这些数据也会被复制到新容器的卷中。
  • 数据卷可以在多个容器间分享和复用
  • 可以直接更改卷里面的数据
  • 更新镜像时对容器数据卷的更改将不会被包含到新的镜像中
  • 即使容器被删除,数据卷依然存在

数据卷的设计被用来持久化数据,让数据能够独立于容器的生命周期。因此当删除容器时Docker也不会自动删除数据卷。

Adding a data volume

增加数据卷

docker create -vdocker run -v中的-v标记来给容器添加数据卷,我们可以在一条命令中多次使用-v标记来添加多个数据卷,下面的例子挂载了一个数据卷在我们的web应用容器中。

docker run -d -P --name web -v /webapp training/webapp python app.py

这条命令执行后会在容器中创建一个新的卷webapp

Mount a Host Directory as a Data Volume

为数据卷挂在主机目录

除了使用-v标记来创建卷之外,你还可以挂载Docker守护进程主机的目录到容器中。

注意:如果你使用Boot2Docker,那么你的Docker守护进程只能被限制访问OSX/windows特定的文件目录。Boot2Docker会努力自动分享OSX中的/users目录和windows中的C:users目录。因此你可以通过docker run -v /Users/<path>:/<container path> … (OSX)或者docker run -v /c/Users/<path>:/<container path ...(Windows).来挂在文件或目录。所有的其它路径(不是/users和C:users)都来自Boot2Docker虚拟机中的文件系统。

docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py

上述命令会把主机的/src/webapp目录挂在到容器中的/opt/webapp

注意:如果/opt/webapp目录已经存在与容器的镜像中,那么/opt/webapp中的内容会被主机上的/src/webapp中的数据替换,这个和mount命令是一致的。

数据卷挂在数据对测试非常有用,比如我们可以把源代码挂在到容器中,然后修改代码看看应用会发生什么。主机上的目录必须是绝对路径,如果这个目录不存在Docker会自动去创建1个。

注意:不能在Dockerfile中来配置挂载目录,因为Dockerfile的目的是更方便的来一直和分享镜像,而主机目录依赖于主机,(对于一个目录,在不同的主机上可能绝对路径不一致)所以Dockerfile中目录挂载不会适用于所有的主机

挂载的数据卷默认是可读写的,当然我们可以通过命令标记来让它只读

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

上述命令中我们通过ro选项来让数据卷只读

Mount a Host File as a Data Volume

挂载主机文件作为数据卷

-v标记还可以用来挂在来自主机的文件,而不仅仅是目录

docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

上述命令会带你到一个新容器的shell界面,你会有来自主机的bash历史。因为容器和主机共享了一个.bash_history文件,所以你在容器中的命令历史和主机中的历史都会记录到.bash_history中,这样当你退出容器中时,你在容器中的命令历史被保存下来了,在主机的shell历史记录中仍然能够看到容器中的历史。

注意:人们会使用很多工具来编辑文件,vised --in-place,这些都会导致文件的索引节点改变。Docker 1.1.0之前,文件修改会报如sed: cannot rename ./sedKdJ9Dy: Device or resource busy这样的错误。但是在Docker 1.1.0之后,挂载文件让文件修改变得非常简单而不需要再去挂在包含这个文件的父目录了。

Creating and mounting a Data Volume Container

创建一个专门防数据的数据卷容器

如果你有一些持久化的数据需要在容器之间共享,或者想从非持久化容器使用持久化数据。最好的办法是创建名为Data的卷容器,把数据都挂在到Data容器里
我们创建一个能分享数据的命名容器,他不运行任何应用,它重复使用training/postgres镜像以便所有的容器使用同一个层,这样可以节省磁盘空间。

docker create -v /dbdata --name dbdata training/postgres /bin/true

我们使用--volumes-from标记来绑定/dbdata卷到另一个容器

docker run -d --volumes-from dbdata --name db1 training/postgres

或者

docker run -d --volumes-from dbdata --name db2 training/postgres

在是上述的例子中,我们在容器中挂在了/dbdata卷,如果恰巧镜像training/postgres中也有/dbdata这个目录,那么容器会隐藏镜像的目录,而让容器中的/dbdata目录可见,新建多个数据容器同样是隐藏镜像的文件而显示容器中的文件,这种机制实现了数据卷的数据共享。
你可以在一条命令中使用多个--volumes-from标记参数把多个容器的数据卷绑定在一起。
上述的代码中db1和db2是挂载dbdata这个容器来扩展的,你也可以挂载db1或者db2来扩展你的数据卷。

 docker run -d --name db3 --volumes-from db1 training/postgres

如果你想删除包含挂载数据卷的容器,甚至是初始化的容器dbdata,或者是由dbdata扩展的db1和db2,容器会删除,但是数据卷会留下。使用docker rm -v来删除容器的数据卷。

注意:当你删除容器没有使用-v标记的时候,Docker不会提示警告。没有使用-v标记删除容器,会让残留的volumns变得“无家可归”(就是没有容器再引用这个数据卷)。这样的卷很难删除而且会占用很多空间,我们正在努力改善数据卷的管理,你可以通过pull request #8484来跟进我们的进程。

Backup, restore, or migrate data volumes

我们可以利用数据卷来有效的备份、恢复和迁移数据

docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

命令中我们启动了一个新的容器,它共享了来自dbdata容器的数据卷。然后我们挂在了一个本地主机的目录/backup。最后我们使用tar命令把/dbdata中的数据压缩成dbdata.jar放到/backup中。执行结束我们就完成了数据卷的数据备份工作。

数据恢复

docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

创建一个新的容器dbdata2,解压文件到新的容器的数据卷。

这篇关于Managing Data in Containers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037125

相关文章

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

CentOS下mysql数据库data目录迁移

https://my.oschina.net/u/873762/blog/180388        公司新上线一个资讯网站,独立主机,raid5,lamp架构。由于资讯网是面向小行业,初步估计一两年内访问量压力不大,故,在做服务器系统搭建的时候,只是简单分出一个独立的data区作为数据库和网站程序的专区,其他按照linux的默认分区。apache,mysql,php均使用yum安装(也尝试

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统

15 组件的切换和对组件的data的使用

划重点 a 标签的使用事件修饰符组件的定义组件的切换:登录 / 注册 泡椒鱼头 :微辣 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE  可以改名 可以move file,全部一个命令。 resue 可以重用,keep好像不生效!!! system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where tablespace_name='SYSTEM'

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

java.sql.SQLException: No data found

Java代码如下: package com.accord.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import

FORM的ENCTYPE=multipart/form-data 时request.getParameter()值为null问题的解决

此情况发生于前台表单传送至后台java servlet处理: 问题:当Form需要FileUpload上传文件同时上传表单其他控件数据时,由于设置了ENCTYPE=”multipart/form-data” 属性,后台request.getParameter()获取的值为null 上传文件的参考代码:http://www.runoob.com/jsp/jsp-file-uploading.ht

Oracle Data Guard:Oracle数据库的高可用性和灾难恢复解决方案

在企业级数据库管理中,确保数据的高可用性和在灾难情况下的快速恢复是至关重要的。Oracle Data Guard是Oracle公司提供的一种强大的数据库高可用性解决方案,它通过在主数据库和至少一个备用数据库之间提供实时或近实时的数据保护来实现这一目标。本文将详细介绍如何在Oracle数据库中部署和使用Oracle Data Guard,包括其基本概念、配置步骤、管理技巧和实际应用示例。 1. O

Creating OpenAI Gym Environment from Map Data

题意:从地图数据创建 OpenAI Gym 环境 问题背景: I am just starting out with reinforcement learning and trying to create a custom environment with OpenAI gym. However, I am stumped with trying to create an enviro