k8s之docker容器的备份和容灾方案(代码片段)

天府云创 天府云创     2023-03-29     802

关键词:

数据安全在当今复杂的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 cloud@192.168.10.100:/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等。

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

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数量满了,这个分区就用完了,然后资源服务无就不可用了,所以如果坚持使用默认分区的同学,一定要在安装之前把分区或者挂载整大点。

此文章不重点讨论如何修改默认位置,而是可以通过挂载外部的文件系统进行存放位置,从而间接实现备份的目的。如果并发或者读写比较高建议直接上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 

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

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

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

 

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

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

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

docker tag 8ef375298394 mysql:v5.7

查看是否运行,然后使用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, 这时候全公司的人都等着这个系统使用, 这是后排查问题还不如直接使用一个备份镜像更为便捷和快速。

k8s之docker容器的备份和容灾方案(代码片段)

...务和应用的线上商业发展之道。所以大家变得尤为重视。Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源;跨平台应用容器引擎服务。那么今天我们就讨论说说在kubernetes集群管理中Docker容器是如何备... 查看详情

redis全方位详解--磁盘持久化和容灾备份(代码片段)

序言 在上一篇博客中,博客介绍了redis的数据类型使用场景和redis分布式锁的正确姿势。我们知道一旦Redis重启,存在redis里面的数据就会全部丢失。所以这篇博客中向大家介绍Redis的磁盘持久化。 REDIS持久化  以每隔一... 查看详情

k8s容灾方案的五个关键点

...是绝大多数企业级应用的基本要求在没有Kubernetes也没有容器的时候,备份和恢复解决方案通常在虚拟机(VM)级别上实现。当应用程序在单个VM上运行时,容灾系统适用于这样的传统应用程序。但是,当使用Kubernetes对应用程序进... 查看详情

针对故障恢复和容灾备份的安全测试

针对故障恢复和容灾备份的安全测试一般包括:故障恢复、数据备份、容灾备份三个测试点。分别对应的测试内容为:故障恢复1、整个系统是否存在单点故障。2、对于关键应用系统,当任何一台设备失效时,是否按照预定的规则... 查看详情

k8s之pod(代码片段)

...储,网络等各个容器共享的资源。Pod支持多种容器环境,Docker则是最流行的容器环境。二.Pod容器生命周期三.Init容器Pod能够具有多个容器,应用运用在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。 Init... 查看详情

k8s1.20弃用docker评估之docker和oci镜像格式的差别(代码片段)

...ernetes在其最新的Changelog中宣布,自Kubernetes1.20之后将弃用Docker作为容器运行时。弃用Docker带来的,可能是一系列的改变,包括不限于:容器镜像构建工具容器CLI容器镜像仓库容器运行时专题文章《K8S1.20弃用Docker评估》会从多方... 查看详情

minikube之win10单机部署(代码片段)

...容器部署,资源调度和集群扩容等操作。如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes底层使用的组件,Kubernetes是Docker的上层封装,通过它可以很方便的进行Docker集群的管理。今天我们使用minikube在单机上进行Kuber... 查看详情

docker与k8s的恩怨情仇—用最简单的技术实现“容器”(代码片段)

...上次我们说到PaaS的发展历史,从CloudFoundry黯然退场,到Docker加冕,正是Docker“一点点”的改进,掀起了一场蝴蝶效应,煽动了整个PaaS开源项目市场风起云涌。为了让大家更好的理解“容器”这个PaaS中最核心的技术,本篇将从一... 查看详情

docker之基础(代码片段)

一、Docker简介容器:运行在同一类用户空间上的程序打包在一起,相当于一个集装箱Docker:码头装运工;把集装箱搬运到该有的位置。Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。Docker的基础是Linux容器(LXC)等技术... 查看详情

容器技术之docker&k8s

1.Docker&K8S区别区别:1、k8s是一种开放源码的容器集群管理系统,而Docker是一种开放源码的应用容器引擎;2、k8s是一套自动化部署工具,可以管理docker容器是容器编排层面的,docker是容器化技术,是容器... 查看详情

容器技术之docker&k8s

1.Docker&K8S区别区别:1、k8s是一种开放源码的容器集群管理系统,而Docker是一种开放源码的应用容器引擎;2、k8s是一套自动化部署工具,可以管理docker容器是容器编排层面的,docker是容器化技术,是容器... 查看详情

docker搭建私有仓库之harbor(代码片段)

HarborHarbor是构建企业级私有docker镜像的仓库的开源解决方案,它是DockerRegistry的更高级封装,它除了提供友好的WebUI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载... 查看详情

k8s之pod(代码片段)

...储,网络等各个容器共享的资源。Pod支持多种容器环境,Docker则是最流行的容器环境。二.Pod容器生命周期三.Init容器Pod能够具有多个容器,应用运用在容器里面,但是它也可能有一个或多个先于应用容器启动的Init容器。 Init... 查看详情

持续集成之应用k8s自动部署(代码片段)

...s自动部署持续集成之应用k8s自动部署Intro上次我们提到了docker容器化及自动化部署,这仅仅适合个人项目或者开发环境部署,如果要部署到生产环境,必然就需要考虑很多因素,比如访问量大了如何调整部署,如何更好的应对大... 查看详情

docker&k8s---docker的安装部署镜像管理容器操作dockerfile(代码片段)

Docker&K8s—Docker的安装、部署、镜像管理、容器操作、Dockerfile容器概述容器是一种基础工具。泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、存储、运输物品。物体可以被放置在容器中ÿ... 查看详情

docker入门(代码片段)

1.Mac安装Dockerbrewcaskinstalldocker2.核心概念docker镜像(Images):用于创建Docker容器的模板;docker容器(Container):是独立运行的一个或一组应用,即镜像启动后的实例;docker客户端(Client):客户端通过命令行或者其他工具使用Docker;docker主机(Host):一... 查看详情

docker容器和k8s添加healthcheck(代码片段)

docker容器启动后,怎么确认容器运行正常,怎么确认可以对外提供服务了,这就需要healthcheck功能了。之前对healthcheck的功能不在意,因为只要镜像跑起来了就是健康的,如果有问题就会运行失败。在连续两次收到两个启动失败... 查看详情

docker容器的备份和还原(代码片段)

Docker容器的备份和还原一、运行容器1.宿主机目录与容器目录同步方式运行2.进入容器3.打包容器内备份数据4.查看宿主机目录上的容器数据卷二、备份容器1.将容器打包2.删除运行容器三、还原删除的容器1.将备份的tar包导入为本... 查看详情