如何在Docker容器之间拷贝数据

【编者的话】在容器之间拷贝数据是Docker一个重要而且基本的功能。拷贝数据到其他容器是一个经常使用到的场景,如当服务器遇到不可预见的“灾难”(注:断电,宕机)时,起到备份数据的作用。本文作者详细介绍了操作步骤。

如何在Docker容器之间拷贝数据

Docker容器可以类比成一个目录,它可以将一个应用程序运行时所依赖的所有环境(注:此应用依赖的其他的服务或程序等)打包在一起运行;同时可以随意的对它进行“启动”、“停止”、“移动”或者“删除”等操作。Docker容器在Linux的命名空间(Namespace)机制下被激活,这样就可以使得运行在同一服务器上的不同Docker容器能在网络(Networking)与存储(storage)层面上被“隔离”(isolation)的运行。每个Docker容器都是在一个Docker镜像(image)的基础上创建而来;而一个Docker镜像可以支持创建、运行多个Docker容器,这主要取决于服务器的硬件性能。所以,Docker容器是Docker运行时的表现形式。

什么是Docker镜像?

Docker容器是基于一个Docker镜像创建的,而Docker镜像本身则可以通过Docker命令行工具或者Dockerfiles来生成。Docker镜像既可以包含操作系统基础设施(fundamentals)也可以包含一个预先搭建好的可以直接启动的应用程序栈。Docker镜像可以被看做是一个只读的模板,这个模板中包含了很多“层”;而任何基于这个Docker镜像的新增操作或者更新操作都会导致一个基于当前层的新的层被创建出来,这个新创建的层是直接叠加在当前层之上的而非覆盖整个Docker镜像(注:创建新层的过程就是创建新容器的过程)。这就是一个新的Docker容器是怎么被创建出来的。

从一个容器拷贝数据到另一个容器:

在容器之间拷贝数据是Docker一个重要而且基本的功能。拷贝数据到其他容器的功能是一个真实的用户场景,如当服务器遇到不可预见的“灾难”(注:断电,宕机)时,起到备份数据的作用。

使用容器的数据卷:

数据卷(data volume,注:位置在/var/lib/docker/volumes)是容器可以访问,但是位置不在root文件系统中的一个目录。为了能让容器之间可以共享数据,Docker让“卷”(volume)可以绕过Docker镜像的层叠机制。容器中所有对镜像的改变全部都直接存储。每个容器都有固定的运行目录在/var/lib/docker目录下;而每个容器卷的数据则默认单独存储在/var/lib/docker/volumes/目录底下。docker run命令的-v选项能够实现容器间数据卷中数据的互相拷贝。

如何在容器之间拷贝数据的一个例子

在这个例子中,我们假设基于镜像mymod/dvc:v1创建并运行了两个容器:dvc1与dvc2,以下是启动这两个镜像的命令:

docker run –d –name dvc1 mymod/dvc:v1

docker run –d –name dvc2 mymod/dvc:v1


以下命令将创建并启动一个新的容器(也是基于mymod/dvc: v1镜像)但是挂载dvc1的数据卷,并使用cp命令拷贝容器dvc1中的数据到宿主机(host)上。
[[email protected] ~]# docker run –rm –v /var/tmp:/host:rw \ –volumes- from dvc1 cp –r/var/www/html/host/dvc1_files
[注:经过测试以上命令应该改为以下形式才能运行]
[[email protected] ~]# docker run –rm –v /var/tmp:/host:rw –volumes-from dvc1 mymod/dvc: v1 cp –r /var/www/html/host/dvc1_files
新建的容器以读-写权限挂载宿主机的/var/temp目录为/host目录,然后挂载所有dvc1的数据卷,包含dvc1中的/var/www/html目录,然后拷贝/var/www/html的文件目录到/host/dvc1_files下,対映宿主机/var/temp目录。

现在我们用以下命令拷贝dvc1容器的数据到其他的容器中:
[[email protected] ~]# docker run –rm –v /var/tmp:/host:ro –volumes-from dvc2 \ cp –a –T /host/dvc1_files /var/www/html
新建的容器将宿主机的/var/tmp目录以只读的形式映射到dvc2容器的/host目录中,同时加载dvc2容器的所有数据卷,然后将/host/dvc1_files(对应宿主机/var/tmp/dvc1_files)目录的结构拷贝到dvc2容器的/var/www/html目录下。

同样的目标可以在Dockerfile中使用ADD命令实现。ADD有两个参数一个是源容器一个是目的容器。ADD命令可以实现从源容器拷贝文件或者数据到目的容器的目标,而不用管各个容器的文件系统差异。

结论:-

Docker肯定会提供更好的方式来“培养”容器化服务部署,以支持更广泛的部署平台;同时开发社区也期望Docker构建服务层级(service layer)。而Docker的做法是:开发容器核心容量,开发跨容器服务管理与通信功能。我们在这篇文章中所阐述的是数据可以在容器间被复制与冗余,这可以用来应付各种数据的损毁与恢复。Docker还提供了使用方便的容器间差异分析功能,这可以让容器更好的支持排错(debugging)、快速共享部署环境以达到快速的部署的目标。Docker可以将容器部署环境从开发或者QA阶段直接提交到AWS部署环境。用户可以通过Docker的数据卷在容器间共享数据;可以将宿主机的目录直接挂载到容器中或者甚至可以从容器中导出数据存档,所以,Docker非常方便。

原文地址:https://www.cnblogs.com/surplus/p/11462582.html

时间: 2024-11-05 23:27:58

如何在Docker容器之间拷贝数据的相关文章

如何在Docker容器内外互相拷贝数据?

如何在Docker容器内外互相拷贝数据? 从容器内拷贝文件到主机上 docker cp <containerId>:/file/path/within/container /host/path/target 从主机上拷贝文件到容器内 参考自: http://stackoverflow.com/questions/22907231/copying-files-from-host-to-docker-container 1.用-v挂载主机数据卷到容器内 docker run -v /path/to

[docker] 管理docker容器中的数据

之前我们介绍了Docker的基本概念(前面的没翻译...),了解了如何使用Docker镜像进行工作,并且学习了网 络和容器之间的链接.这一节我们将讨论如何管理容器中及容器之间的数据. 我们将查看下面两种管理Docker中数据的主要方法. 数据卷 数据卷容器 数据卷 一个数据卷就是经过特殊设计的,在一个或多个容器中通过UFS文件系统提供的一些特性 实现数据持久化或共享. 数据卷可以在容器之间共享和重复利用 可以对数据卷里的内容直接进行修改 对镜像的更新不会改变数据卷的内容 卷会一直持续到没有容器使

使用burpsuite等代理工具抓取docker容器中的数据包

使用burpsuite等代理工具抓取docker容器中的数据包,下面是详细的教程. 以docker中的某个漏洞平台(bwapp)为例,展示如何抓包. 1.首先使用docker下载bwapp: # docker pull raesene/bwapp 2.然后运行bwapp (使用命令   --env HTTP_PROXY="http://192.168.43.14:8080"   来进行代理设置,这里设置的是burpsuite中的ip地址以及端口) # docker run -d --n

Docker容器间中的数据如何共享?

本文和大家分享的是Docker进阶中容器中的数据管理相关知识,希望可以帮助大家更好的学习Docker,一起来看看吧. 先思考一些场景,如果利用Docker创建了一个N个容器,这些容器之间需要数据共享,此时该怎么办?如果我们想在本机了解容器的运行状态.命令历史等,此时该怎么办? 按照Docker官方文档的说明,容器中的数据管理有两种形式: Manage data in containers 数据卷(Data Volumes) 可以将"数据卷"理解为容器中的一个目录,类似于Linux中mo

docker容器之间网络是如何通信的?

相关概念: 网桥:相当于一个虚拟的交换机,连接在此网桥上的所有设备均可以正常通信: veth pair:虚拟网卡对(2张网卡),两张网卡之间的收发数据保持一致: docker网络: docker0网桥:在安装启动完docker之后,会出现一个docker0的网卡设备(此设备相当于一个交换机): 创建docker容器后,会创建2个虚拟网卡,一端显示在宿主机中,一端是容器中的eth0,这2张网卡是虚拟网卡对: 创建2个容器,在宿主机上执行ip a,可以看到会出现2个虚拟网卡(以veth开头): do

Docker学习笔记(9-2)Docker容器之间的连接

学习目标: 容器之间的连接 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN apt-get update RUN apt-get install -y nginx RUN pat-get install -y curl EXPOSE 80 CMD /bin/bash #构建测试镜像 docker build -t lexiaofei/cct . 1.允许所有容器互联 --icc=true 默认 $ docker run -it --n

如何在 Docker 容器中运行 Kali Linux 2.0

https://linux.cn/article-6103-1.html Kali Linux 是一个对于安全测试人员和白帽的一个知名操作系统.它带有大量安全相关的程序,这让它很容易用于渗透测试.最近,Kali Linux 2.0 发布了,它被认为是这个操作系统最重要的一次发布.另一方面,Docker 技术由于它的可扩展性和易用性让它变得很流行.Dokcer 让你非常容易地将你的程序带给你的用户.好消息是你可以通过 Docker 运行Kali Linux 了,让我们看看该怎么做 :) 在 Doc

如何使用数据卷在宿主机和docker容器之间共享文件

共享宿主机的目录给容器 docker run -i -t -v ~/download:/home/hello python3-env /bin/bash -v  表示创建一个数据卷并挂载到容器里 ~/download:/home/hello 冒号前面是宿主机目录,后面是容器里的目录.表示把宿主机的download目录挂载到容器的/home/hello目录下.注意run之后是一个新的容器,ID都不一样的.  注意:python3-env是镜像的名称 从Dockerfile新建一个镜像 Docker

docker容器与大数据组件的冲突点

1.容器里面安装spark,外面的程序(安装spark主机的容器)会连接不上集群.理由:这个组件用的akka,连接上集群,会提示: akka.ErrorMonitor: dropping message [class akka.actor.ActorSelectionMessage] for non-local recipient [Actor[akka.tcp://[email protected]:50071/]] arriving at [akka.tcp://[email protect