前沿:

这两天把报警平台放在了docker里面跑了,但是宿主机本身性能就不好,所以导致mongodb到挂了好几次了。这次搞了一台牛逼的服务器,虽说是opentstack里面的主机,但是iops 很不错。

感谢向军同学的帮助,不然就升级uek内核就能搞死我。

你的程序放在docker里面迁移起来很是方便,像是以前的话,需要重新部署环境和静态文件。 放在docker里面的话,只是需要export备份封装后,scp、rsync迁移到别的服务器就可以了。

我这边的redis和mongodb分在不同的容器里面的。 废话不多说,开始迁移。。。

查找正在运行的容器id ~

root@dev-ops:~# docker ps -a

CONTAINER ID        IMAGE                           COMMAND             CREATED             STATUS              PORTS                   NAMES
459e57c9a5d9 rastasheep/ubuntu-sshd:latest /bin/bash About an hour ago Up 45 minutes 22/tcp compassionate_ptolemy
70c74ebbfac4 rastasheep/ubuntu-sshd:14.04 /usr/sbin/sshd -D About an hour ago Up About an hour 0.0.0.0:49157->22/tcp s
3ebbc244c486 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 18 hours ago Up About an hour 22/tcp redis_t2
ed7887b93aa4 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 19 hours ago Up About an hour 0.0.0.0:49153->22/tcp redis_test
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
459e57c9a5d9 rastasheep/ubuntu-sshd:latest /bin/bash About an hour ago Up 45 minutes 22/tcp compassionate_ptolemy
70c74ebbfac4 rastasheep/ubuntu-sshd:14.04 /usr/sbin/sshd -D About an hour ago Up About an hour 0.0.0.0:49157->22/tcp s
3ebbc244c486 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 18 hours ago Up About an hour 22/tcp redis_t2
ed7887b93aa4 rastasheep/ubuntu-sshd:latest /usr/sbin/sshd -D 19 hours ago Up About an hour 0.0.0.0:49153->22/tcp redis_test
 

root@dev-ops:~#

root@dev-ops:~# docker export 70c74ebbfac4 >ubuntu_sshd.tar

root@dev-ops:~# du -sh ubuntu_sshd.tar

353M    ubuntu_sshd.tar

然后把这个ubuntu_sshd.tar  传到别的服务器上。

root@31-53:~# cat ubuntu_sshd.tar | sudo docker import - niubi:latest

root@-:~# cat ubuntu_sshd.tar | sudo docker import - niubi:latest
8f2baf1b1cf479e366524007faad6d2e2671fc693716043a4812556bc8ac9204
root@-:~#

本来只是想把程序、mongodb、redis迁移过去。 既然迁移,干脆把所有的images迁移到新的节点上来。

docer export 对应导入的命令是cat xxx | docker import – name 。我这里用的是niubi:latest ……

cat ubuntu_sshd.tar | sudo docker import - niubi:latest

上面的方式是用docker export。

docker export  是当前的状态(容器)

docker save    是针对(镜像)images

主要的区别是 save是可以回滚以前的配置。 export 只是当前的。

我们通过 docker images –tree 看到他的历史记录。Docker的文件系统AUFS,一种“增量文件系统”,用户所做修改以增量的方式保存,所以才能看到这些历史的增量。

咱们用save 看看备份效果。 是1.1G  ,这里是包含那些记录的。刚才咱们用export测试的时候,会发现文件只有300M左右。

root@dev-ops:~# docker save rastasheep/ubuntu-sshd >ubuntu_sshd.tar

root@dev-ops:~#
root@dev-ops:~#
root@dev-ops:~# du -sh ubuntu_sshd.tar
.1G ubuntu_sshd.tar
root@dev-ops:~#


估计如果有分布式文件系统 ,比如mfs,nfs。可以更好的试试用docker的数据卷来做本地文件夹和容器内的关联。 这样的话,备份更加自定义了。
毕竟环境这东西不会变,变的只是data数据,然后文件目录又在分布式文件里面,可以更好做迁移。只要那边启动一个环境,目录一关联就可以了。

sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
http://rfyiamcool.blog.51cto.com/1030776/1540414

备份迁移的方式自己选,推荐用export,毕竟save太大了,对于历史也没啥用处 !

对于数据安全关注更深的话,可以用docker volumes这样的数据映射。

开源项目Docker,Red Hat新的虚拟化选择 http://www.linuxidc.com/Linux/2013-10/91051.htm

dockerlite: 轻量级 Linux 虚拟化 http://www.linuxidc.com/Linux/2013-07/87093.htm

Docker的搭建Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 和一个正常的虚拟机有何区别? http://www.linuxidc.com/Linux/2013-12/93740.htm

Docker 将改变所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm

以下是我发掘到的内容:

Docker是如何工作的(简单说明)

Docker是基于镜像的。镜像类似于已经包含了文件、配置和安装好的程序的虚拟机镜像。同样的,你可以像启动虚拟机一样启动多个镜像实例。运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit <container-id> <image-name>命令可以把一个正在运行的容器变成一个新的镜像。

举个例子:

  # 像Docker官方的hello world例子一样,拉取一个叫busybox的镜像
sudo docker pull busybox # 查看本地已经有哪些镜像
# 我们可以看到busybox
sudo docker images # 现在让我们来修改下busybox镜像的容器
# 这次,我们创建一个文件夹
sudo docker run busybox mkdir /home/test # 让我们再看看我们有哪些镜像了。
# 注意每条命令执行后容器都会停止
# 可以看到有一个busybox容器
sudo docker ps -a # 现在,可以提交修改了。
# 提交后会看到一个新的镜像busybox-
# <CONTAINER ID> 是刚刚修改容器后得到的ID
sudo docker commit <CONTAINER ID> busybox- # 再看看我们有哪些镜像。
# 我们现在同时有busybox和busybox-1镜像了。
sudo docker images # 我们执行以下命令,看看这两个镜像有什么不同
sudo docker run busybox [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'
sudo docker run busybox- [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'

现在,我们有两个不同的镜像了(busybox和busybox-1),还有一个通过修改busybox容器得来的容器(多了一个/home/test文件夹)。下面来看看,是如何持久化这些修改的。

导出(Export)

 #Export命令用于持久化容器(不是镜像)。所以,我们就需要通过以下方法得到容器ID:

sudo docker ps -a

#接着执行导出:

sudo docker export <CONTAINER ID> > /home/export.tar

sudo docker export <CONTAINER ID> > /home/export.tar
sudo docker export <CONTAINER ID> -o /home/export.tar

最后的结果是一个2.7MB大小的Tar文件(比使用save命令稍微小些)。

保存(Save)

#Save命令用于持久化镜像(不是容器)。所以,我们就需要通过以下方法得到镜像名称:

sudo docker images

#接着执行保存:

sudo docker save busybox- > /home/save.tar
sudo docker save busybox-1 > /home/save.tar
sudo docker save busybox-1 -o /home/save.tar

最后的结果是一个2.8MB大小的Tar文件(比使用export命令稍微大些)。

它们之间的不同

现在我们创建了两个Tar文件,让我们来看看它们是什么。首先做一下小清理——把所有的容器和镜像都删除:  

    # 查看所有的容器
sudo docker ps -a # 删除它们
sudo docker rm <CONTAINER ID> # 查看所有的镜像
sudo docker images # 删除它们
sudo docker rmi busybox-
sudo docker rmi busybox

译注:可以使用 docker rm $(docker ps -q -a) 一次性删除所有的容器,docker rmi $(docker images -q) 一次性删除所有的镜像。

现在开始导入刚刚导出的容器:

cat /home/export.tar | sudo docker import - busybox-1-export:latest
  # 导入export.tar文件
cat /home/export.tar | sudo docker import - busybox--export:latest # 查看镜像
sudo docker images # 检查是否导入成功,就是启动一个新容器,检查里面是否存在/home/test目录(是存在的)
sudo docker run busybox--export [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found
 

使用类似的步骤导入镜像:

  docker load < /home/save.tar

    # 导入save.tar文件
docker load < /home/save.tar # 查看镜像
sudo docker images # 检查是否导入成功,就是启动一个新容器,检查里面是否存在/home/test目录(是存在的)
sudo docker run busybox- [ -d /home/test ] && echo 'Directory found' || echo 'Directory not found'

那,它们之间到底存在什么不同呢?我们发现导出后的版本会比原来的版本稍微小一些。那是因为导出后,会丢失历史和元数据。执行下面的命令就知道了:

# 显示镜像的所有层(layer)
    sudo docker images --tree


行命令,显示下面的内容。正你看到的,导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saveed-
loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载
的方式持久化整个镜像,就可以做到层回滚(可以执行docker tag <LAYER ID> <IMAGE NAME>来回滚之前的层)。

vagrant@Ubuntu-13:~$ sudo docker images --tree
    ├─f502877df6a1 Virtual Size: 2.489 MB Tags: busybox-1-export:latest
    └─511136ea3c5a Virtual Size: 0 B
      └─bf747efa0e2f Virtual Size: 0 B
        └─48e5f45168b9 Virtual Size: 2.489 MB
          └─769b9341d937 Virtual Size: 2.489 MB
            └─227516d93162 Virtual Size: 2.489 MB Tags: busybox-1:latest

docker容器跨服务器的迁移方式export和save(转)的更多相关文章

  1. docker容器跨服务器的迁移

    docker的备份方式有export和save两种. export是当前的状态,针对的是容器,docker save 是针对镜像images. export 找出要备份容器的ID [root@wls1 ...

  2. docker容器跨服务器的迁移的方法

    docker的备份方式有export和save两种. export是当前的状态,针对的是容器,docker save 是针对镜像images. export 找出要备份容器的ID ? 1 2 3 [r ...

  3. Docker容器进入的4种方式

    Docker容器进入的4种方式 $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash 在使用Docker创建了容器之后,大家比较 ...

  4. Docker容器进入的4种方式(转)

    这个文章不错,几种方式及使用范围都讲得清楚. 另外,还有一个文章说了为什么docker中并不合适ssh服务安装的情况. 我现在也是用第四种方式, docker exec -it [docker容器ID ...

  5. Docker容器跨主机通信之:直接路由方式

    一.Docker网络基本原理 直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包:此外,如果不同子网之间要进行通信,需要额外的路由机制. Docker ...

  6. Docker容器跨主机通信

    默认情况下Docker容器需要跨主机通信两个主机节点都需要在同一个网段下,这时只要两个Docker容器的宿主机能相互通信并且该容器使用net网络模式,改实现方式为网桥模式通信: 除此之外我们还可以通过 ...

  7. Docker容器跨主机通信--overlay网络

    一.Docker主机间容器通信的解决方案 Docker网络驱动 Overlay: 基于VXLAN封装实现Docker原生Overlay网络 Macvlan: Docker主机网卡接口逻辑上分为多个子接 ...

  8. 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】

    首先弄出来装有hadoop.java.ssh.vim的镜像起名badboyf/hadoop.做镜像有两种方法,一种是用Dockerfile来生成一个镜像,一种是基于ubuntu14.04的基础镜像生成 ...

  9. Docker容器进入的4种方式(转)

    在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法. 进入Docker容器比较常见的几种 ...

随机推荐

  1. JZYZOJ1445 [noip2014day1-T3]飞扬的小鸟 动态规划 完全背包

    http://172.20.6.3/Problem_Show.asp?id=1445 很容易看出来动态规划的本质,但是之前写的时候被卡了一下(不止一下),还是写一下题解. 直接暴力O(n*m^2)大概 ...

  2. 【推导】【暴力】Codeforces Round #432 (Div. 2, based on IndiaHacks Final Round 2017) C. Five Dimensional Points

    题意:给你五维空间内n个点,问你有多少个点不是坏点. 坏点定义:如果对于某个点A,存在点B,C,使得角BAC为锐角,那么A是坏点. 结论:如果n维空间内已经存在2*n+1个点,那么再往里面添加任意多个 ...

  3. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  4. Android:布局实例之模仿QQ登录界面

    预览图: 准备: 1.找到模仿对象 QQ登陆界面UI下载>>>>> 2.导入工程 3.查看布局结构和使用控件 其对应效果图分布为 4.分析样式选择器 下拉箭头2种样式:点 ...

  5. Failed to Attach to Process ID Xcode 解决办法

    方法1. go to the Product menu and find the Edit Scheme menu there. While in Edit Scheme window, select ...

  6. 猫、路由器、交换机和PC

    转载:http://duanzw102.blog.163.com/blog/static/161838173201392431722650/ 猫是 modem,是有网络供应商,比如电信公司提供的拨号工 ...

  7. 诡异的 "密码取回" 邮件问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. Go -- php 中的pack("H*", $string) 转换成go

    pack("H*", $string) 转化成这样: //16进制字符串转[]byte func HexToByte(hex string) []byte { length := ...

  9. python中出现 “'gbk' codec can't decode byte 0xf3 in position 20: illegal multibyte sequence”问题

    其实是打开文件方法open()中的模式有r,w,a等. 请看: r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式打开一个文件用于只读.文件指针将会放在文件的开头 ...

  10. [转]Sql Server参数化查询之where in和like实现详解

    本文转自;http://www.cnblogs.com/lzrabbit/archive/2012/04/22/2465313.html 文章导读 拼SQL实现where in查询 使用CHARIND ...