K8S之Docker容器的备份和容灾方案

数据安全在当今复杂的IT世界中变得越来越重要,甚至超越了网络安全和信息安全,因为一切企业基本上都是以业务和应用的线上商业发展之道。所以大家变得尤为重视。

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源;跨平台应用容器引擎服务。

那么今天我们就讨论说说在kubernetes集群管理中Docker容器是如何备份、恢复、迁移、导入和导出的。【注意此文章只提供思路,不作为企业报告正式使用,也可以单独联系作者服务支持】

实验前提条件:

【所有的理论知识都要付诸实践,此文有些地方简写了部分,为了企业信息安全】

1、准备一台linux服务器或者云服(现在618活动力度大)

2、必须要先安装Docker容器等环境(yum安装或者最新的系统里已集成)

3、一定再三强调关闭selinux服务,不然各种坑等着你

一、常规的镜像导出和导入

【备份容器】
1、查看当前容器列表
docker ps -a

2、制作容器备份 
docker commit -p 403e6db0baidu jenkins_backup 

3、查看备份是否成功
docker images

4、将镜像制作成文件
说明: 
使用docker save 可能需要使用root权限

保存的命令是:
docker save -o [filename] [image]

[cloud@localhost ~]$ docker save -o jenkins_backup.tar jenkins_backup

[cloud@localhost ~]$ ls
jenkins_backup.tar

备份文件制作完成!

5、在本地使用命令将镜像从远程备份到本地
[cloud@localhost ~]$scp [email protected]:/home/dockerdata/jenkins_backup.tar  /Users/test/home/DockerImageBackup

【恢复容器】

1. 为了验证容器是否能正常导入, 先删除docker 里的镜像 
docker rmi jenkins

2.导入
docker load < /Users/test/home/DockerImageBackup/jenkins_backup.tar 
$ docker images

3.运行镜像
sudo docker run -p 8080:8080 -name jenkins -d jenkins_backup

4. 启动成功
903e6db0baidu   jenkins/jenkins    "/sbin/tini -- /usr/…"     Up 1 min    0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp          jenkins

二、tar压缩备份

Docker打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux机器上,也可以实现虚拟化,Docker是跨平台的容器引擎,支持Windows、MAC OS、Linux等。

K8S之Docker容器的备份和容灾方案_第1张图片

容器是完全使用沙箱机制,相互之间不会有任何接口,实现了资源隔离技术,容器内的资源互不影响,更重要的是容器性能开销极低。

K8S之Docker容器的备份和容灾方案_第2张图片

Docker镜像拉取

docker pull mysql:5.6
..........................
..........................
caddb3474aca: Pull complete 
ec101f8c3a86: Pull complete 
Digest: sha256:60c27b50ca72d81d92a743a965a82f124a4e123c7d374a021887286408878d60
Status: Downloaded newer image for mysql:5.6
docker.io/library/mysql:5.6

Docker容器备份

root@linux:~# docker image save mysql:5.6 -o mysql:5.6.tar.gz
mysql:5.6:本地镜像
mysql:5.6.tar.gz:打包后的镜像文件

Docker容器导出

root@linux:~# docker save mysql:5.6 > mysql:5.6.tar.gz
mysql:5.6:本地镜像
mysql:5.6.tar.gz:打包后的镜像文件

Docker容器恢复

root@linux:~# docker image load -i mysql:5.6.tar.gz
mysql:5.6.tar.gz:打包后的镜像文件

Docker容器导入

root@linux:~# docker image load < mysql:5.6.tar.gz
Loaded image: mysql:5.6
mysql:5.6.tar.gz:打包后的镜像文件

三、Docker修改默认存储位置

默认情况下Docker的存放位置为:/var/lib/docker

sudo docker info | grep "Docker Root Dir"

时间久了或者容器里应用数据量大了或者文件inode数量满了,这个分区就用完了,然后资源服务无就不可用了,所以如果坚持使用默认分区的同学,一定要在安装之前把分区或者挂载整大点。

K8S之Docker容器的备份和容灾方案_第3张图片

此文章不重点讨论如何修改默认位置,而是可以通过挂载外部的文件系统进行存放位置,从而间接实现备份的目的。如果并发或者读写比较高建议直接上oss或者CFS(即对象存储或者文件存储)

文件系统创建完成后会在文件系统列表中显示。云上的虚拟机、容器等计算资源需要通过挂载点挂载至文件系统,所以需要为文件系统添加挂载点(自动识别云实例鼠标选择要挂载的id即可)

并且支持挂载NFS文件系统/SMB文件系统

也可以安装第三方软件协议,直接通过命令的方式进行sync 到 协议:/存储的对应位置/

四、注册中心

正如我们所看见的,上面做的快照已经作为Docker镜像保存了。现在,为了备份该快照,我们有两个选择,一个是我们可以登录进Docker注册中心,并推送该镜像;另一个是我们可以将Docker镜像打包成tar包备份,以供今后使用。
如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login 命令来登录进Docker注册中心,然后推送所需的镜像即可。

# docker tag a25ddfec4d2a arunpyasi/container-backup:test# docker push arunpyasi/container-backup 

K8S之Docker容器的备份和容灾方案_第4张图片

如果我们不想备份到docker注册中心,而是想要将此镜像保存在本地机器中,以供日后使用,那么我们可以将其作为tar包备份。要完成该操作,我们需要运行以下 docker save 命令。

# docker save -o ~/container-backup.tar container-backup

要验证tar包是否已经生成,我们只需要在保存tar包的目录中运行 ls 命令即可。 

K8S之Docker容器的备份和容灾方案_第5张图片

 

五、docker仓库可以用对像存储或者NFS或者NAS或者分布式存储

直接修改本地的docker镜像tag(也叫重命名镜像),然后直接推送给仓库

docker tag 【镜像ID】【镜像名称】:【tag版本信息】 

docker tag 8ef375298394 mysql:v5.7

K8S之Docker容器的备份和容灾方案_第6张图片

查看是否运行,然后使用docker stop停止后docker rm删除container,再删除image。

六、harbo私有仓库方案

docker私有仓库可以做到和yum或者github仓库一样,进行私有化部署存储企业自己的镜像

后面会专门写一篇文章单独来讲解这个运作机制,欢迎关注!

七、各大共有云厂商的K8S备份机制

阿里云、腾讯云和华为云等都有容器和k8s的备份机制产品,直接就可以拿来用真的很方便!

如果担心单点故障,etcd存储高可用和控制器多复本就可以解决。

八、Docker容器迁移

迁移容器同时涉及到了上面两个操作,备份和恢复。我们可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先我们将把容器备份为Docker镜像快照。然后,该Docker镜像或者是被推送到了Docker注册中心,或者被作为tar包文件保存到了本地。如果我们将镜像推送到了Docker注册中心,我们简单地从任何我们想要的机器上使用 docker run 命令来恢复并运行该容器。但是,如果我们将镜像打包成tar包备份到了本地,我们只需要拷贝或移动该镜像到我们想要的机器上,加载该镜像并运行需要的容器即可。

        Docker容器迁移其实就是把现有的已经在运行Docker容器的服务器迁移到新的容器中,我们可以通过上面备份、恢复、导入、导出操作来完成迁移;如果企业镜像比较多的情况下,也可以配置私有仓库,通过私有仓库去拉取要迁移同步的镜像资源,再运行拉取的镜像,这样也可以完成容器迁移过程;后续继续发布私有仓库harbor的安装及配置,这样可以把业务中的镜像全部推送到私有仓库中,提高工作效率。

写在最后想一想:为什么要备份容器?

作为一名合格的程序猿, 时时刻刻都要思考应用或者(service)的容错以及灾备, 他是保障我们日后快速恢复工作必不可少的条件。

容器由于种种原因会损坏而无法正常work, 这时候全公司的人都等着这个系统使用, 这是后排查问题还不如直接使用一个备份镜像更为便捷和快速。

你可能感兴趣的:(容器云,docker,容器,运维,k8s备份,容器备份)