Docker项目


  • Docker部署MailCow邮件服务器
  • Docker部署Wireguard
  • Docker + Brook + Portainer搭建端口转发
  • Docker部署Omnivore
  • Docker部署Wallabag
  • Docker安装
    • 【教程】Docker常用命令大全汇总
    • 最详细的ubuntu 安装 docker教程-腾讯云开发者社区-腾讯云
    • Ubuntu | Docker — 从入门到实践
  • Docker部署mailserver邮件服务器
  • Docker部署Danted
  • Docker部署思源笔记
  • Docker部署Leanote
  • Docker部署RustDesk
    • Docker部署Rustdesk自建服务器:一步步教你搭建
    • 官方安装文档
    • 官方安装文档(宝塔面板)
  • Docker搭建Easyimage简单图床
  • Docker搭建lsky-pro图床
    • 兰空图床(lsky-pro) 利用反向代理实现跨域访问
  • 搭建私有docker仓库
    • 搭建一个私有的Docker镜像仓库
    • 私有仓库 | Docker — 从入门到实践
    • 手把手教你搭建Docker私有仓库Harbor
    • 基于Docker搭建私有镜像仓库-腾讯云开发者社区-腾讯云
    • Harbor备份与还原
    • 担心Harbor数据丢失?谈谈Harbor的备份和恢复方法。
    • Docker之推送镜像到Harbor
    • 关于Harbor私有仓库的搭建及使用-腾讯云开发者社区-腾讯云
    • harbor | Docker入门教程
  • Docker安装iRedMail邮件服务器
    • 搭建自己的邮箱服务器 -iredmail-docker安装
    • 如何设置 A 记录和 rDNS 记录
    • iRedmail | CONTAINERISATION & ORCHESTRATION
  • 【Docker项目实战】使用Docker部署IP工具箱MyIP-阿里云开发者社区
本文档使用 MrDoc 发布
- +
首页

担心Harbor数据丢失?谈谈Harbor的备份和恢复方法。


参考链接

前言

备份指将数据复制一份或多份副本并将其存放到其他地方,当系统发生故障导致数据丢失时,可以通过这些副本恢复到之前的状态。

由此可见,备份和恢复都是围绕数据进行的。Harbor 备份的前提是了解 Harbor 中有哪些数据需要备份。

一、Harbor中的数据

Harbor 所依赖的数据可分为两大类:临时数据和持久化数据。

1.1 临时数据

在 Harbor 安装期间通过配置文件生成的数据,主要是 Harbor 组件所依赖的配置文件和环境变量。这些数据通常在 Harbor 安装目录的 common 目录下(如果 Harbor 是通过源代码安装的,则这些数据在源码目录的“make/common”目录下),在 Harbor 各组件启动时会被挂载到对应的容器中。虽然临时数据对服务的顺利运行至关重要,但是安装程序每次都会读取 Harbor 配置文件重新生成一份临时数据,所以我们仅需备份配置文件即可,不必将整个 common 目录全部备份。

1.2 持久化数据

存放在数据目录配置项下(即配置文件中 data_volume 项所配置的值),这些数据主要包括 Harbor 的数据库数据、Artifacts 数据、Redis 数据、Chart 数据,以及 Harbor 各个组件所依赖的运行时数据

担心Harbor数据丢失?谈谈Harbor的备份和恢复方法。_运维_02

data目录包含的文件夹和相应的作用如下。

  • ca_download:存放用户访问Harbor时所需的CA。
  • cert:Harbor启动HTTPS服务时所需的证书和密钥。
  • chart_storage:存放Helm v2版本的Chart数据。
  • database:存放数据库的目录,Harbor、Clair和Notary数据库的数据都在此目录下。
  • job_logs:存放JobService的日志信息。
  • redis:存放Redis数据。
  • registry:存放OCI Artifacts数据(对于大部分用户来说是镜像数据)。
  • secret:存放Harbor内部组件通信所需的加密信息。
  • trivy-adapter:存放Trivy运行时相关的数据。

注意:

Harbor在启动时需要挂载这些目录下的文件,在Harbor各组件的容器中除了log容器(依赖logrotate,必须以root权限运行),其他容器都是以非root用户身份运行的,这些文件的用户组信息及权限信息与其在容器中的信息不匹配,在容器中就会发生读取权限相关的错误。

​

所以在主机上需要将这些目录和文件设置成容器的指定用户和用户组,这些文件的用户和权限信息主要有如下两类。

  • 数据库和Redis:以999:999的用户组运行容器,即harbor-db组件和harbor-redis组件;
  • Harbor的其他容器:以10000:10000的用户组运行容器;

还原后的数据一定要与备份时保持一致。许多用户在恢复数据后无法启动Harbor,而且日志里同时会有文件权限相关的错误信息,这极有可能就是备份数据的文件权限不正确导致的。

二、Harbor备份

2.1 创建备份目录

用来存放harbor的备份文件

$ mkdir -p /data/backup/harbor-backup/

2.2 备份Harbor安装目录

我的harbor是安装在/app/harbor下

$ cp   /app/harbor    /data/backup/harbor-backup/harbor

2.3 备份Harbor data

1.x.x版本的数据默认是存放在/data下,2.x.x默认是存放在安装目录的data目录下,如果不知道数据存放的位置,可打开harbor的配置文件harbor.yml中data_volume的值查看。

$ grep data_volume /app/harbor/harbor.yml 
data_volume: /data
$ cp  /data    /data/backup/harbor-backup/data

2.4 备份外部存储(可选)  

如果使用了外部的数据库,如果使用了外部的数据库、Redis或者块存储,则需要参考所使用的外部存储提供的备份方案来备份其数据。

三、Harbor的恢复

使用前面备份的文件来恢复harbor中的数据,恢复方法就是跟备份相反。

3.1 停止Harbor

$ cd /app/harbor 
$ docker-compose down

3.2 删除当前的Harbor目录

3.3 恢复harbor安装目录

$ cp  /data/backup/harbor-backup/harbor    /app/harbor

3.4 恢复data目录

$ cp   /data/backup/harbor-backup/data    /data

3.5 重启Harbor

$ cd /app/harbor 
$ docker-compose up -d

​

四、基于shell单独备份Harbor中的镜像(扩展)

在实际的业务环境下,Harbor中的临时数据、配置数据相对都是较小的。而harbor中的镜像才是最占用磁盘空间的,如果也将镜像备份到harbor服务的主机上,将会对harbor发服务主机造成非常大的压力,影响harbor服务的稳定性。

本处使用另外一台主机来专门备份Harbor中的镜像文件。下面的操作都是在另外一台主机操作。

​

4.1 安装docker

安装docker服务,用于从harbor下载镜像。

$ yum install -y yum-utils device-mapper-persistent-data lvm2
$ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
$ yum clean all && yum makecache
$ yum install -y docker-ce
$ systemctl enable --now docker.service

在docker配置文件中指定harbor的服务地址。

$ cat <<EOF > /etc/docker/daemon.json 
{
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"], # 驱动器
"insecure-registries": ["192.168.2.250:443"], # harbor的安全加密地址
"registry-mirrors": ["https://3hjcmqfe.mirror.aliyuncs.com"], # 镜像加速
"log-driver": "json-file",
"log-opts": {
"max-size": "500m"
}
}
EOF
$ systemctl restart docker

4.2 编写Shell脚本(1.x.x)版本

$ cat <<EOF > harbor-imagebackup.sh
#!/bin/bash
Harbor_IP=192.168.2.250 #Harbor主机IP
Harbor_Port=443 #连接Harbor的端口号
Harbor_User=admin #登录Harbor的用户
Harbor_Passwd=Harbor12345 #登录Harbor的用户密码
Images_File=harbor-images-`date '+%Y-%m-%d'`.txt #镜像清单文件
Harbor_backlog=harbor-back-`date '+%Y-%m-%d'`.log #日志文件
Tar_File=/backup/Harbor-backup/ #镜像tar包存放路径

###【】调用API接口获取Harbor中所有仓库的所有镜像及镜像的所有标签(tag):


#获取Harbor中所有的项目(含私有项目)
Project_List=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_IP:$Harbor_Port/api/projects | grep name | awk '/"name": /' | awk -F '"' '{print $4}'`
#获取项目下所有的镜像名称与标签:
for Project in $Project_List;do
Image_Names=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_IP:$Harbor_Port/api/search?q=$Project | grep "repository_name" | awk -F "\"" '{print $4}'`
for Image in $Image_Names;do
Image_Tags=`curl -u $Harbor_User:Harbor_Passwd -X GET http://$Harbor_IP:$Harbor_Port/api/repositories/$Image/tags | awk '/"name": /' | awk -F '"' '{print $4}'`
for Tag in $Image_Tags;do
echo "$Harbor_IP:$Harbor_Port/$Image:$Tag" | grep -v Base | grep -v Image >> $Images_File
done
done
done

###使用docker从镜像文件中下载镜像——将下载的镜像进行打包保存——删除下载到本地的镜像——将封装好的镜像包移动到备份目录


Image_tags=$(uniq $Images_File)
for image_tag in $Image_tags;do
image_Name=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $1}')
image_Lable=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $2}')
docker pull $image_tag
docker save $image_tag -o $image_Name-$image_Lable.tar
docker rmi $image_tag
mv $image_Name-$image_Lable.tar $Tar_File
done
EOF
$ chmod +x harbor-imagebackup.sh

4.3 编写Shell脚本(2.x.x版本)

Harbor2版本和1版本的API调用是不同的,所以脚本也会有变化

$ cat <<EOF > harbor-imagebackup.sh
#!/bin/bash
Harbor_Address=192.168.2.250:443 #Harbor主机地址
Harbor_User=admin #登录Harbor的用户
Harbor_Passwd=Harbor12345 #登录Harbor的用户密码
Images_File=harbor-images-`date '+%Y-%m-%d'`.txt #镜像清单文件
Tar_File=/backup/Harbor-backup/ #镜像tar包存放路径
set -x

# 获取所有镜像清单


Project_List=$(curl -u $Harbor_User:$Harbor_Passwd -H "Content-Type: application/json" -X GET $Harbor_Address/api/v2.0/projects -k | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')

for Project in $Project_List;do


Image_Names=$(curl -u $Harbor_User:$Harbor_Passwd -H "Content-Type: application/json" -X GET $Harbor_Address/api/v2.0/projects/$Project/repositories -k | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
for Image in $Image_Names;do
Image_Tags=$(curl -u $Harbor_User:$Harbor_Passwd -H "Content-Type: application/json" -X GET $Harbor_Address/v2/$Image/tags/list -k | awk -F '"' '{print $8}')
for Tag in $Image_Tags;do
echo "$Harbor_Address/$Image:$Tag" >> harbor-images-`date '+%Y-%m-%d'`.txt
done
done
done

###使用docker从镜像文件中下载镜像——将下载的镜像进行打包保存——删除下载到本地的镜像——将封装好的镜像包移动到备份目录


Image_tags=$(uniq $Images_File)
for image_tag in $Image_tags;do
image_Name=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $1}')
image_Lable=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $2}')
docker pull $image_tag
docker save $image_tag -o $image_Name-$image_Lable.tar
docker rmi $image_tag
mv $image_Name-$image_Lable.tar $Tar_File
done
EOF
$ chmod +x harbor-imagebackup.sh

4.4 执行脚本

 选择对应版本的脚本来执行

$ ./harbor-imagebackup.sh

执行完成会在脚本文件所在的目录有备份日志可查看。

​

4.5  添加计划任务

添加计划任务进行定时备份

$ crontable -e
30 * * * 3 ./harbor-imagebackup.sh

担心Harbor数据丢失?谈谈Harbor的备份和恢复方法。_kubernetes_03


Page 2

关注 键客李大白
  • 复制旧版本的harbor.yml文件到新版本的安装目录下
©著作权归作者所有:来自51CTO博客作者键客李大白的原创作品,请联系作者获取转载授权,否则将追究法律责任
  • ISE升级

  • Harbor 1.8.2升级到2.3.2

  • Spring Boot 2.0升级手册和新特性的使用

新人福利
  • 复制旧版本的harbor.yml文件到新版本的安装目录下

举报文章

请选择举报类型

内容侵权 涉嫌营销 内容抄袭 违法信息 其他

上传截图

格式支持JPEG/PNG/JPG,图片不超过1.9M

已经收到您得举报信息,我们会尽快审核


hunterzuo 2024年11月13日 22:12 收藏文档
上一篇
下一篇
  • 手机扫码
  • 复制链接

手机扫一扫转发分享


Markdown文件