【编者的话】在容器之间拷贝数据是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)上。
[root@host ~]# docker run –rm –v /var/tmp:/host:rw \ –volumes- from dvc1 cp –r/var/www/html/host/dvc1_files
[注:经过测试以上命令应该改为以下形式才能运行]
[root@host ~]# 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容器的数据到其他的容器中:
[root@host ~]# 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非常方便。

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

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

    之前我们介绍了Docker的基本概念(前面的没翻译...),了解了如何使用Docker镜像进行工作,并且学习了网 络和容器之间的链接.这一节我们将讨论如何管理容器中及容器之间的数据. 我们将查看下面两 ...

  2. Unix I/O--输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程

    输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程 https://www.bbsmax.com/A/o75N88ZxzW/ 10.1 Unix I/O 一个Unix ...

  3. COPY - 在表和文件之间拷贝数据

    SYNOPSIS COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ O ...

  4. Docker容器数据管理(数据卷&数据卷容器)

    一:前言 在Docker容器的实际使用中,经常会遇到容器的数据持久化,容器之间的数据共享等问题,通常我们有两种解决方案: 1)数据卷(Data Volumes):就是将容器内数据直接映射到本地主机环境 ...

  5. MacOS下解决宿主机和docker容器之间网络互通

    docker在Mac下使用非常方便,官网提供了desktop版本的可视化软件,甚至还十分贴心地集成好了k8s套件.然而如果想同时部署和使用多个容器,每个容器不使用127.0.0.1地址,而是各自有ip ...

  6. Docker学习笔记 - Docker容器之间的连接

    学习目标: 容器之间可以相互连接访问:: --link redis:redisAlias 准备工作 FROM ubuntu:14.04 RUN apt-get install -y ping RUN  ...

  7. docker 容器之间互联

    容器之间的互联 一. 实验目的: 1.       熟悉容器之间基本的网络原理: 2.       掌握容器之间互联的方法: 二. 实验环境: Ubuntu16.04+Docker 三. 实验内容: ...

  8. 在docker容器下利用数据卷实现在删除了mysql容器或者镜像的情况下恢复数据

    当把mysql容器销毁,在新建一个容器,进行之前的数据恢复. 因为之前建立了数据卷,那么现在就可以利用这个数据卷进行数据恢复. 使用docker volume create volume_name命令 ...

  9. docker容器之间的通信

    容器之间互通 新建两个容器 docker run -d --name box1 busybox /bin/sh -c "while true;do sleep 3600;done" ...

随机推荐

  1. ubuntu ufw相关命令

    引自:http://www.cnblogs.com/jiangyao/archive/2010/05/19/1738909.html 就这句话就够了,下面的可以不看 sudo  ufw enable| ...

  2. springboot使用 @Transactional 注解配置事务管理

    介绍 springboot对数据库事务的使用非常的方便,只需要在方法上添加@Transactional注解即可.Spring 为事务管理提供了丰富的功能支持.Spring 事务管理分为编程式和声明式的 ...

  3. Django---Django的中间件

    Django---Django的中间件 一丶中间件介绍 什么是中间件 官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Dj ...

  4. Calendar类set方法中的坑

    最近写了一个支付宝微信对账报表,发现系统金额比支付宝微信的少好多,左查右查发现是追缴金额没统计到,再一查发现月结束日期为2019-09-31,9月咋会有31,为啥呢就追缴金额不行呢,因为其他类型用TI ...

  5. jQuery基础学习

    一.简介 jQuery是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架).jQuery设计的宗旨是“Write ...

  6. ip黑名单-做过ssh扫描黑的ip

    # # hosts.deny This file contains access rules which are used to # deny connections to network servi ...

  7. rest framework 之视图

    一.APIView APIView 直接继承 View(Django 内置的 View),也就是说 APIView 是最贴近原生 Django 的 View 的. 因此可定制程度高,根据请求方法不同执 ...

  8. 【Spring Boot】Spring Boot之使用Alibaba Cloud Toolkit(Idea插件)本地一键部署Spring Boot项目到远程服务器

    一.Alibaba Cloud Toolkit(Idea插件)的安装 1)Alibaba Cloud Toolkit 介绍 Cloud Toolkit 是本地 IDE 插件,帮助开发者更高效地开发.测 ...

  9. Centos7部署LAMP平台之架构之路

    部署LAMP平台搭建 一.源码安装LAMP 1. 安装apache [root@localhost ~]# yum -y install gcc* apr-devel apr-util-devel p ...

  10. Pytorch之Dataparallel源码解析

    之前对Pytorch 1.0 的Dataparallel的使用方法一直似懂非懂,总是会碰到各种莫名其妙的问题,今天就好好从源头梳理一下,更好地理解它的原理或者说说下步骤. 源码地址: https:// ...