阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

在Docker容器之间拷贝数据:原理与操作示例

106次阅读
没有评论

共计 2795 个字符,预计需要花费 7 分钟才能阅读完成。

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,以下是启动这两个镜像的命令:

  1. docker run –d –name dvc1 mymod/dvc:v1 
  2.  
  3. docker run –d –name dvc2 mymod/dvc:v1

以下命令将创建并启动一个新的容器(也是基于 mymod/dvc: v1 镜像)但是挂载 dvc1 的数据卷,并使用 cp 命令拷贝容器 dvc1 中的数据到宿主机(host)上。

  1. [root@host ~]# docker run –rm –v /var/tmp:/host:rw \ –volumes- from dvc1 cp –r/var/www/html/host/dvc1_files 
  2.  
  3. [注:经过测试以上命令应该改为以下形式才能运行] 
  4.  
  5. [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 容器的数据到其他的容器中:

  1. [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 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

在 Ubuntu Trusty 14.04 (LTS) (64-bit) 安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm

Docker 安装应用 (CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm

Docker 的详细介绍 :请点这里
Docker 的下载地址 :请点这里

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计2795字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中