Habor数据迁移方式有多少,skopeo效率最好

2023-05-16

请添加图片描述

迁移流程

  • 两个不同的Harbor实例迁移数据(含镜像数据和数据库数据)

迁移方式

Harbor 镜像skopeoimage-syncer手工
机制基于策略的内容机制:支持多种过滤器(镜像库、tag和标签)与多种触发模式(手动,基于时间以及定时)且实现对推送和拉或模式的支持直接将 registry 上的 blob 复制到另一个 registry1. 同步只经过内存和网络,不依赖磁盘存储,同步速度快
2. 增量同步, 通过对同步过的镜像blob信息落盘,不重复同步已同步的镜像
3. 并发同步,可以通过配置文件调整并发数
4. 自动重试失败的同步任务,可以解决大部分镜像同步中的网络抖动问题 不依赖docker以及其他程序
拷贝镜像数据+导入导出PG数据库数据
官方文档https://goharbor.io/docs/2.2.0/administration/configuring-replication/create-replication-endpoints/https://github.com/containers/skopeo/blob/main/docs/skopeo-sync.1.mdhttps://github.com/AliyunContainerService/image-syncer/blob/master/README-zh_CN.md
优点界面配置,无需编码1. 单机和高可用Harbor都可用
2. 传输效率高,不依赖docker
1.单机Harbor可用
2.传输效率高
耗时短
缺点失败率较高但centos 7自带版本是0.14,版本低,没有sync命令,新版本需要自己打包高可用Harbor不可用数据环境数据几百G, 命令cp不可靠

Skopeo 使用

什么是Skopeo?

skopeo 使用 API V2 Registry,例如 Docker Registry、Atomic Registry、私有Registry、本地目录和本地 OCI 镜像目录。skopeo 不需要运行守护进程,它可以执行的操作包括:

  • 通过各种存储机制复制镜像,例如,可以在不需要特权的情况下将镜像从一个Registry复制到另一个Registry
  • 检测远程镜像并查看其属性,包括其镜像层,无需将镜像拉到本地
  • 从镜像库中删除镜像
  • 当存储库需要时,skopeo 可以传递适当的凭据和证书进行身份验证

镜像存储特点

根据 Robin 大佬在 《镜像仓库中镜像存储的原理解析》文章里得出的结论:

  • 通过 Registry API 获得的两个镜像仓库中相同镜像的 manifest 信息完全相同。
  • 两个镜像仓库中相同镜像的 manifest 信息的存储路径和内容完全相同。
  • 两个镜像仓库中相同镜像的 blob 信息的存储路径和内容完全相同

skopeoo 安装

源码编译(静态)

描述: 要构建 skopeo 二进制文件您至少需要 Go 1.12 版本以上, 其次构建 skopeo 有两种方法,即在容器中或者在本地环境中构建(安装环境较为复杂), 此处为了方便演示将采用容器方式进行编译构建。

# 1.拉取skopeo源码到本地
$ git clone --depth=1 https://github.com/containers/skopeo.git  # https://github.com/containers/skopeo.git
$ cd skopeo
$ sed -i 's#proxy.golang.org#https://goproxy.cn#g' skopeo/Makefile

# 2.下载镜像构建依赖
$ sudo apt-get install go-md2man  # 构建手册依赖于 go-md2man。
$ whereis go-md2man  # 获得本机中go-md2man路径。

# 3.构建静态二进制文件
$ BUILD_IMAGE="golang:latest"
$ docker run --name skopeo-build -v $PWD:/src -v /usr/bin/go-md2man:/go/bin/go-md2man -w /src -e CGO_ENABLED=0 -e GOPROXY=https://goproxy.cn,direct ${BUILD_IMAGE} \
sh -c 'make BUILDTAGS=containers_image_openpgp GO_DYN_FLAGS='
  # CGO_CFLAGS="" CGO_LDFLAGS="" GO111MODULE=on go build -mod=vendor  -ldflags '-X main.gitCommit=df4d82b960572c19e9333381a203c0ac475766d7 ' -gcflags "" -tags  "containers_image_openpgp" -o bin/skopeo ./cmd/skopeo

# 4.运行编译生成的skopeo可执行文件
$ cd ./bin # /opt/software/skopeo/bin
$ ./skopeo --help
  # Various operations with container images and container image registries
  # .......
  # Use "skopeo [command] --help" for more information about a command.

构建关键参数解析:

  • CGO_ENABLED=0 : 设置该环境变量, 禁用 CGO 会导致 Go 在可能的情况下更喜欢静态连接库,而不是动态链接到系统库 (解决可以在Ubuntu或者其它linux发行版中执行编译后二进制文件)。
  • GOPROXY=https://goproxy.cn,direct : Golong 依赖下载镜像站,加快go get依赖拉拉取。
  • BUILDTAGS=containers_image_openpgp : 设置该make参数消除了对libgpgme 及其配套库的依赖, Skopeo 的一些特性依赖于非 Go 库,例如 libgpgme 和 libdevmapper。
  • GO_DYN_FLAGS= : 清空该make参数 (否则会强制创建动态可执行文件)

2.分发包安装

描述: skopeo 可能已经打包在您的发行版中,此处以ubuntu 20.04为例进行安装。

在线方式

# Ubuntu 
sudo apt-get -y update
sudo apt-get -y install skopeo

# centos 7
sudo yum makecache
sudo yum -y install skopeo
# 或者
sudo dnf makecache
sudo dnf -y install skopeo

CentOS 7 默认下载的skopeo是0.1.40,如果需要使用最新的版本,需要自己通过源码构建

安装 dnf文档

离线方式


#  Kubic提供了软件包
#  Ubuntu 20.04
. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | 
sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list

curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -

sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install skopeo

# centos7 
#我们不再为 RHEL 7 发布最新的Skopeo 版本。一些较旧的工件可能会保留下来,例如# https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/x86_64/

Skopeo centos7 RPM 存档位置

https://centos.pkgs.org/7/centos-extras-x86_64/skopeo-0.1.40-11.el7_8.x86_64.rpm.html

3.容器安装运行

Skopeo 容器镜像可在 quay.io/skopeo/stable:latest 获得, 例如我们采用podman命令进行如下操作:

podman run docker://quay.io/skopeo/stable:latest copy --help

我们可以使用yumdnf安装skopeo在 CentOS 7 上。在本教程中,我们讨论了这两种方法,但你只需要选择一种方法来安装 skopeo。

skopeoo 命令

描述: skopeoo 是操作各种容器镜像和容器镜像仓库的工具,其使用方法及其可用命令如下:

./skopeo --help    # 子命令可采用如下命令 skopeo [command] --help 命令
Usage:
  skopeo [flags]
  skopeo [command]
Available Commands: 
  copy          # 复制一个镜像从 A 到 B,这里的 A 和 B 可以为本地 docker 镜像或者 registry 上的镜像;
  delete        # 删除一个镜像 tag,可以是本地 docker 镜像或者 registry 上的镜像;
  help          # 帮助查看
  inspect       # 查看一个镜像的 manifest 或者 image config 详细信息;
  list-tags     # 列出存储库名称指定的镜像的tag
  login           # 登陆某个镜像仓库,类似于 docker login 命令
  logout          # 退出某个已认证的镜像仓库, 类似于 docker logout 命令
  manifest-digest # 计算文件的清单摘要是一个sha256sum 值
  standalone-sign   # 使用本地文件创建签名
  standalone-verify # 验证本地文件的签名
  sync              # 将一个或多个图像从一个位置同步到另一个位置 (该功能非常Nice)
Flags:
    --command-timeout duration   # 命令超时时间(单位秒)
    --debug                      # 启用debug模式
    --insecure-policy            # 在不进行任何策略检查的情况下运行该工具(如果没有配置 policy 的话需要加上该参数)
    --override-arch ARCH         # 处理镜像时覆盖客户端 CPU 体系架构,如在 amd64 的机器上用 skopeo 处理 arm64 的镜像
    --override-os OS             # 处理镜像时覆盖客户端 OS
    --override-variant VARIANT   # 处理镜像时使用VARIANT而不是运行架构变量
    --policy string              # 信任策略文件的路径 (为镜像配置安全策略情况下使用)
    --registries.d DIR           # 在目录中使用Registry配置文件(例如,用于容器签名存储)
    --tmpdir string              # 用于存储临时文件的目录
-h, --help                       help for skopeo 
-v, --version                    Version for Skopeo

skopeo初体验

描述: 在使用体验skopeo之前,我们需要了解一哈 Skopeo 可以在哪些镜像和存储库类型上执行镜像操作(官网文档走一波):

Repository typesDescribeExample
containers-storage:docker-reference适用于后端是 Podman, CRI-O, Buildah 的情况containers-storage:
dir:path适用于将manifest, layer tarballs 和 signatures 存储为单独文件的现有本地目录路径的情况dir:/tmp/alpine:latest
docker://docker-reference适用于Registry中实现"Docker Registry HTTP API V2"的镜像的情况docker://harbor.fly.com/mysql:v5.6
docker-archive:path[:docker-reference]适用于采用docker save命令导出镜像以tar格式存储的文件的情况docker-archive:alpine.tar
docker-daemon:docker-reference适用于存储在 docker 守护进程内部存储中的图像的情况docker-daemon:alpine:latest
oci:path:tag适用于符合"Open Container Image Layout Specification"的目录中的图像标记oci:alpine:latest

温馨提示: 同一个镜像存在的方式有可能不同,不同类型方式存储对镜像的 layer 处理的方式也不一样。

skopeo批量同步Harbor镜像

1. 生成待同步的镜像列表文件

#!/bin/bash
#镜像清单文件,将获取到的镜像信息存到该文件中

#check param
if [[ -z $1 || -z $2 ]]; then
	echo "SOURCE_REGISTRY OR TARGET_REGISTRY is missing"
	echo "please execute the script in the following format,case: sh list_harbor_image.sh HARBOR_ADDR HARBOR_ADMIN_PASSWORD"
	echo "Example: sh list_harbor_image.sh 10.0.135.26:5000 Harbor123 "
	exit
fi

# Harbor连接地址
HARBOR_ADDR=$1
# Harbor 管理员用户密码
HARBOR_AUTH=admin:$2
 #镜像清单文件
IMAGES_FILE=harbor-images-list.txt
# 显示脚本执行过程,并显示脚本对变量的处理结果。
# set -x
# 获取所有镜像清单
Project_List=$(curl -s -u ${HARBOR_AUTH}  -H "Content-Type: application/json" -X GET  http://${HARBOR_ADDR}/api/v2.0/projects?page_size=100  | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
echo -e "【Harbor<${HARBOR_ADDR}>项目列表】: \n ${Project_List}"

# 遍历Harbor项目
for Project in $Project_List;do
    # 某个项目内的镜像列表-页码
    PAGE_NUM=1
    while true; do
       Image_Names=$(curl -s -u ${HARBOR_AUTH} -X GET "http://${HARBOR_ADDR}/api/v2.0/projects/$Project/repositories?page_size=100&page=${PAGE_NUM}" | python -m json.tool | grep name | awk '/"name": /' | awk -F '"' '{print $4}')
       Image_Size=`echo  "${Image_Names}" | wc -l`
       echo -e "【Harbor<${HARBOR_ADDR}>, 项目<${Project}>镜像列表大小<${Image_Size}>, 详情】: \n ${Image_Names}"
       for Image in $Image_Names;do
           Image_Tags=$(curl -s -u ${HARBOR_AUTH}  -H "Content-Type: application/json"   -X GET  http://${HARBOR_ADDR}/v2/$Image/tags/list |  awk -F '"'  '{print $8,$10,$12}')

           for Tag in $Image_Tags;do
             if [ ! -z "${Tag}" ] || [[ ! ${Tag} =~ 400 ]] ||[[ ! ${Tag} =~ 404 ]];then
               echo "$Image:$Tag"   >> ${IMAGES_FILE}
             fi
           done
       done
       # 当前页码的列表数量<100
       if [ "${Image_Size}" -lt "100" ]; then
           break
       else
          let PAGE_NUM=${PAGE_NUM}+1
       fi

    done

done

2. 基于 skopeo copy机制同步

#!/bin/bash
GREEN_COL="\\033[32;1m"
RED_COL="\\033[1;31m"
NORMAL_COL="\\033[0;39m"

#check param
if [[ -z $1 || -z $2 ]]; then
	echo " SOURCE_REGISTRY OR TARGET_REGISTRY OR HARBOR_ADMIN_PASSWORD is missing"
	echo "please execute the script in the following format,case: sh skopeo_transfer_image.sh SOURCE_REGISTRY TARGET_REGISTRY HARBOR_ADMIN_PASSWORD"
	echo "Example: sh skopeo_transfer_image.sh 10.0.135.126:5000 10.16.16.215:5000 Harbor123 "
	exit
fi

# 源Harbor地址
SOURCE_REGISTRY=$1
# 目标Harbor地址
TARGET_REGISTRY=$2
# Harbor 管理员用户密码
HARBOR_AUTH=admin:$3
# 待同步的镜像列表
IMAGES_LIST_FILE="harbor-images-list.txt"

set -eo pipefail

CURRENT_NUM=0
ALL_IMAGES="$(sed -n '/#/d;s/:/:/p' ${IMAGES_LIST_FILE} | sort -u)"
TOTAL_NUMS=$(echo "${ALL_IMAGES}" | wc -l)
echo -e "$GREEN_COL Starting 【Image Trasfer】:  sync $1 to $2 ,\n 【Image Total Nums】: ${TOTAL_NUMS}, \n 【Image List】:\n ${ALL_IMAGES} "

# 镜像复制方法
skopeo_copy() {

  #    skopeo version 1.4.1 写法
  #    if skopeo copy --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
  #    --override-arch amd64 --override-os linux -q docker://$1 docker://$2; then
  #     echo -e "$GREEN_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 successful $NORMAL_COL"
  #    else
  #     echo -e "$RED_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 failed $NORMAL_COL"
  #     exit 2
  #    fi
  # skopeo version 0.1.40 写法
   if skopeo copy docker://$1 docker://$2 \
         --src-tls-verify=false --dest-tls-verify=false --dest-creds ${HARBOR_AUTH}; then
      echo -e "$GREEN_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 successful $NORMAL_COL"
   else
      echo -e "$RED_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 failed $NORMAL_COL"
      # 失败
      exit 2
   fi
}
# 执行复制
for image in ${ALL_IMAGES}; do
 let CURRENT_NUM=${CURRENT_NUM}+1
 skopeo_copy ${SOURCE_REGISTRY}/${image} ${TARGET_REGISTRY}/${image}
done

3. 一键执行

#!/bin/bash

# 后台执行: nohup sh harbor_transfer.sh 10.0.135.126:5000 Harbor123 10.16.16.215:5000 2>&1 &
#check param
if [[ -z $1 || -z $2  || -z $3 ]]; then
	echo " SOURCE_REGISTRY OR TARGET_REGISTRY is missing"
	echo "please execute the script in the following format,case: sh harbor_transfer.sh SOURCE_REGISTRY HARBOR_ADMIN_PASSWORD TARGET_REGISTRY"
	echo "Example: sh harbor_transfer.sh 10.0.135.126:5000 
	Harbor123 10.16.16.215:5000 "
	exit
fi

# 源Harbor地址
SOURCE_REGISTRY=$1
# 目标Harbor管理员用户密码
HARBOR_ADMIN_PASSWORD=$2
# 目标Harbor地址
TARGET_REGISTRY=$3
# 1. 导出镜像列表
echo -e "【 1/2 Harbor迁移-导出镜像列表】:存放 harbor-images-list.txt"
sh -v list_harbor_image.sh ${SOURCE_REGISTRY} ${HARBOR_ADMIN_PASSWORD}

# 2. 迁移镜像
echo -e "【 2/2 Harbor迁移-迁移镜像】:遍历 harbor-images-list.txt"
sh -v skopeo_transfer_image.sh ${SOURCE_REGISTRY} ${TARGET_REGISTRY} ${HARBOR_ADMIN_PASSWORD}

执行效果

一键执行

阿里image-syncer使用

下载和安装

在releases页面可下载源码以及二进制文件

手动编译

go get github.com/AliyunContainerService/image-syncer
cd $GOPATH/github.com/AliyunContainerService/image-syncer

# This will create a binary file named image-syncer
make

使用用例

# 获得帮助信息
./image-syncer -h

# 设置配置文件为config.json,默认registry为registry.cn-beijing.aliyuncs.com
# 默认namespace为ruohe,并发数为6
./image-syncer --proc=6 --auth=./auth.json --images=./images.json --namespace=ruohe \
--registry=registry.cn-beijing.aliyuncs.com --retries=3

配置文件

在 v1.2.0 版本之后,image-syncer 的配置文件支持JSON和YAML两种格式,并且支持将原config文件替换为一个认证信息文件和一个镜像同步文件。详细的配置文件示例可在目录 example 下找到,旧版本的配置文件格式(auth 和 images 字段放在一起的版本,通过 --config 参数指定)也是兼容的,目录下 config.json 为示例。

认证信息

auth.json 包含了所有仓库的认证信息

{  
    // 认证字段,其中每个对象为一个registry的一个账号和
    // 密码;通常,同步源需要具有pull以及访问tags权限,
    // 同步目标需要拥有push以及创建仓库权限,如果没有提供,则默认匿名访问
    
    "quay.io": {    // 支持 "registry" 和 "registry/namespace"(v1.0.3之后的版本) 的形式,需要跟下面images中的registry(registry/namespace)对应
                    // images中被匹配到的的url会使用对应账号密码进行镜像同步, 优先匹配 "registry/namespace" 的形式
        "username": "xxx",               // 用户名,可选,(v1.3.1 之后支持)valuse 使用 "${env}" 或者 "$env" 类型的字符串可以引用环境变量
        "password": "xxxxxxxxx",         // 密码,可选,(v1.3.1 之后支持)valuse 使用 "${env}" 或者 "$env" 类型的字符串可以引用环境变量
        "insecure": true                 // registry是否是http服务,如果是,insecure 字段需要为true,默认是false,可选,支持这个选项需要image-syncer版本 > v1.0.1
    },
    "registry.cn-beijing.aliyuncs.com": {
        "username": "xxx",
        "password": "xxxxxxxxx"
    },
    "registry.hub.docker.com": {
        "username": "xxx",
        "password": "xxxxxxxxxx"
    },
    "quay.io/coreos": {                       
        "username": "abc",              
        "password": "xxxxxxxxx",
        "insecure": true  
    }
}

镜像同步文件

{
    // 同步镜像规则字段,其中条规则包括一个源仓库(键)和一个目标仓库(值)
    
    // 同步的最大单位是仓库(repo),不支持通过一条规则同步整个namespace以及registry
    
    // 源仓库和目标仓库的格式与docker pull/push命令使用的镜像url类似(registry/namespace/repository:tag)
    // 源仓库和目标仓库(如果目标仓库不为空字符串)都至少包含registry/namespace/repository
    // 源仓库字段不能为空,如果需要将一个源仓库同步到多个目标仓库需要配置多条规则
    // 目标仓库名可以和源仓库名不同(tag也可以不同),此时同步功能类似于:docker pull + docker tag + docker push

    "quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy",
    "xxxx":"xxxxx",
    "xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx"

    // 当源仓库字段中不包含tag时,表示将该仓库所有tag同步到目标仓库,此时目标仓库不能包含tag
    // 当源仓库字段中包含tag时,表示只同步源仓库中的一个tag到目标仓库,如果目标仓库中不包含tag,则默认使用源tag
    // 源仓库字段中的tag可以同时包含多个(比如"a/b/c:1,2,3"),tag之间通过","隔开,此时目标仓库不能包含tag,并且默认使用原来的tag
    
    // 当目标仓库为空字符串时,会将源镜像同步到默认registry的默认namespace下,并且repo以及tag与源仓库相同,默认registry和默认namespace可以通过命令行参数以及环境变量配置,参考下面的描述
}

更多参数

image-syncer 的使用比较简单,但同时也支持多个命令行参数的指定:

-h  --help       使用说明,会打印出一些启动参数的当前默认值
   
    --config     设置用户提供的配置文件路径,使用之前需要创建此文件,默认为当前工作目录下的config.json文件。这个参数与 --auth和--images 的
                 作用相同,分解成两个参数可以更好地区分认证信息与镜像仓库同步规则。建议使用 --auth 和 --images.

    --auth       设置用户提供的认证文件所在路径,使用之前需要创建此认证文件,默认为当前工作目录下的auth.json文件

    --images     设置用户提供的镜像同步规则文件所在路径,使用之前需要创建此文件,默认为当前工作目录下的images.json文件

    --log        打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看

    --namespace  设置默认的目标namespace,当配置文件内一条images规则的目标仓库为空,并且默认registry也不为空时有效,可以通过环境变量DEFAULT_NAMESPACE设置,同时传入命令行参数会优先使用命令行参数值

    --registry   设置默认的目标registry,当配置文件内一条images规则的目标仓库为空,并且默认namespace也不为空时有效,可以通过环境变量DEFAULT_REGISTRY设置,同时传入命令行参数会优先使用命令行参数值

    --proc       并发数,进行镜像同步的并发goroutine数量,默认为5

    --records    指定传输过程中保存已传输完成镜像信息(blob)的文件输出/读取路径,默认输出到当前工作目录,一个records记录了对应目标仓库的已迁移信息,可以用来进行连续的多次迁移(会节约大量时间,但不要把之前自己没执行过的records文件拿来用),如果有unknown blob之类的错误,可以删除该文件重新尝试,image-syncer 在 >= v1.1.0 版本中移除了对于records文件的依赖

    --retries    失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量

    --os         用来过滤源 tag 的 os 列表,为空则没有任何过滤要求,只对非 docker v2 schema1 media 类型的镜像格式有效

    --arch       用来过滤源 tag 的 architecture 列表,为空则没有任何过滤要求

参考链接:

https://github.com/containers/skopeo

https://github.com/containers/skopeo/blob/main/docs/skopeo-sync.1.md

https://goharbor.io/docs/2.2.0/administration/configuring-replication/create-replication-endpoints/

https://github.com/AliyunContainerService/image-syncer/blob/master/README-zh_CN.md

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Habor数据迁移方式有多少,skopeo效率最好 的相关文章

  • git clone --mirror -q git://github.com/adobe-webplatform/eve.git

    解决办法 xff1a git全局添加一个属性 git config global url 34 https 34 insteadOf git 然后 xff0c 重新npm install
  • 理解npm包管理机制

    推荐文章 https segmentfault com q 1010000004114972 ea 61 496109 https blog csdn net azl397985856 article details 103982369
  • 面试题:使用promise实现并发请求限制(最优解)

    问题 xff1a 有 8 个图片资源的 url xff0c 已经存储在数组 urls 中 xff0c 而且已经有一个函数 function loadImg xff0c 输入一个 url 链接 xff0c 返回一个 Promise xff0c
  • PHP八大设计模式

    PHP命名空间 可以更好地组织代码 xff0c 与Java中的包类似 Test1 php span class php span class hljs preprocessor lt php span span class hljs key
  • putty 报server unexpectedly closed network connection错误

    由于IP变了 xff0c 再用putty访问组内的服务器时 xff0c 竟然总是出错 xff0c 报server unexpectedly closed network connection错误 我公司的服务器是centos7 xff0c
  • echarts主题属性设置

    theme 61 span class hljs comment 全图默认背景 span backgroundColor span class hljs string 39 rgba 0 0 0 0 39 span span class h
  • echarts和highchart的区别

    echarts 先大体了解一下echarts的历史 xff1a echarts是百度公司前端开发的一个图表库 支持柱状图 饼状图 k线图 map图 热导向图 折线图 主要采用canvas画图 highchart highcharts是国外的
  • Cannot resolve module 'fs'

    可能很多人都会遇到这个问题 xff0c 反正我的话已经遇到两次了 xff0c 上一次解决的时候没有记录解决办法 xff0c 这次又遇到了 xff0c 而且国内搜索引擎是搜不到这个问题的解决办法的 xff0c 所以写个博客记录一下吧 xff0
  • 调整浏览器滚动条样式

    我们知道浏览器自带滚动条很丑 xff0c 有时影响整个页面到美观 xff0c 尤其在页面内嵌一个滚动列表 xff0c 显得奇丑无比 xff0c 下面我们根据如下代码调节滚动条样式 span class token punctuation s
  • 空指针的查找经验

    对象为空不会空指针 而对象的属性方法为空就会报空指针异常 那么我们来看一个出空指针的例子 从报错行开始 每一个参数都输出 发现都有参数 ctrl 43 左键 进入每一个非jdk内部的方法查看 发现在map方法中 Map lt String
  • centos 8 将普通用户添加到sudoers

    centos 系统并没有将普通用户默认添加到sudoers用户组 xff0c 所以在centos xff08 6 xff0c 7 xff0c 8 xff09 中普通用户是无法使用sudo的 xff0c 可是为了系统安全 xff0c 特别如果
  • idea操作hadoop

    cd span class token operator span opt span class token operator span software tar span class token operator span zcvf ha
  • 基于VMware 的 hive安装与启动

    1将have jar文件解压到software目录下 tar span class token operator span zxf have span class token punctuation span span class toke
  • 配置本地镜像--配置华为镜像---安装mysql

    查看镜像是否挂载 df h 本地镜像挂载 mount dev sr0 mnt 配置本地镜像源 cd etc yum repos d 创建备份文件夹 xff0c 将默认的镜像文件备份至该文件夹 mkdir bak mv repo bak 创建
  • java实现简单的生成行为日志文件 (一)

    第一步 在windows中创建目录 第二部 写properties 配置信息 log4j span class token punctuation span rootLogger span class token operator 61 s
  • jdbc实现 mysql 表导入windows文件在导入hbase 并实现打胖包到centos7环境中运行

    此项目由二部分组成 一 配置文件 1配置文件的位置 D d 笔记目录 jdbchbase datasource properties 2配置文件的内容 span class token comment java连接hbase配置 span
  • Hbase底层设计 hbase命令

    hbase web http 20 0 0 180 60010 hbase构成 服务 HMaster 1 为Region server分配region 2 负责Region server的负载均衡 3 xff09 发现失效的Regionse

随机推荐

  • mybatis连接数据库 实现增删改查操作

    框架 pom xml span class token operator lt span span class token operator span xml version span class token operator 61 spa
  • sparkgraph

    什么是sparkgragh xff1a 它是为了为用户建立关系的视图 SparkGraph图计算 基础篇 1 what xff1f 表示数据关系的数据结构 基本元素 xff1a 点Vertex xff0c 边Edge Vertex Vert
  • 萌小宠项目————环境搭建(一)

    大数据环境搭建 一 Docker安装 1 1 Centos Docker安装 镜像比较大 需要准备一个网络稳定的环境 其中 mirror Aliyun代表使用阿里源 curl fsSL https get docker com bash s
  • Lunix下大数据相关软件安装及配置(更新至Kafka)

    https blog csdn net sweet19920711 article details 118309793
  • centos8编译安装指定版本的内核(保姆级教程)

    在实际工作中经常会遇到默认安装的或者通过官方更新的内核版本无法实现具体的业务需求的情况 xff0c 因此我们需要更换系统的内核 本文为centos 8更换5 10 10一个简单记录 1 当前系统的内核版本 span class token
  • Ubuntu 20.04 安装和使用nvm

    克隆nvm镜像 span class token function git span clone https gitee com mirrors nvm 安装nvm span class token function bash span i
  • GitHub Pages域名绑定2018,别被旧文章误导了

    1 创建GitHub Pages 如果不知道如何创建GitHub Pages xff0c https pages github com 2 注册域名 到阿里云或者腾讯云买个自己喜欢的域名 xff08 top域名不能作为腾讯域名邮箱 xff0
  • 机票预定系统 软工

    系统的问题描述 1 xff0e 系统简介 航空公司为给旅客乘机提供方便 xff0c 需要开发一个机票预定系统 各个旅行社把预定机票的旅客信息 xff08 姓名 性别 工作单位 身份证号码 xff08 护照号码 xff09 旅行时间 旅行始发
  • 2022 Kubernetes 批处理和HPC发展一览

    2022 Kubernetes 批处理和HPC发展一览 2022 年 5 月 16 日到 20 日 xff0c 年度最顶级的云原生旗舰会议 KubeCon 43 CloudNativeCon Europe 2022 xff0c 在西班牙 瓦
  • Docker运行ubuntu22.04出现异常

    问题 我在ubuntu22 04的容器里面运行apt update的时候出现了以下报错 span class token punctuation span root 64 VM 16 9 centos docker kubuntu span
  • k8s实战系列:3-存储的花样玩法(上)

    从存储 到后面的容器运行时 网络接口 可观察性组件等就可以感受到云原生的开放性 包容性和生态的丰富性 我们再回顾下云原生景观图 https landscape cncf io Docker存储 容器服务之所以如此流行 一大优势即来自于运行容
  • k8s实战系列:3-存储的花样玩法(下)

    k8s实战系列 3 存储的花样玩法 上 中我们谈论了Docker存储 已经Kubernetes中的配置数据中的ConfigMap和Secret 接下来我们会讨论下Kubernetes中的临时存储 持久存储等 3 DownwardAPI Do
  • 基于kube-scheduler-simulator编写自己的调度程序

    基于kube scheduler simulator编写自己的调度程序 由于默认的 Kubernetes 调度程序是高度可配置的 在许多情况下 我们不必编写任何代码来定制调度行为 然而 想要了解调度程序如何工作 以及如何与其他组件交互的人
  • Goland嗖嗖的: 快捷键,自动生成代码等效率小技巧

    快捷键大全 Windows Linux版本 Mac版本 代码自动生成 1 动态模板 在 GoLand 中 xff0c 预定义的动态模板位于 Preferences Editor Live Templates xff0c 并且分组 插入动态模
  • 基于Goland和dlv远程调试Kubernetes组件

    一个正常运行的 Kubernetes 集群包含以下的各种组件 通常开发者日常编码都基于Windows Mac上的IDE xff08 VsCode Goland xff09 xff0c 编码完成后再部署到远端Linux机器运行 因此 xff0
  • centos8 mips交叉编译环境搭建(保姆级教程)

    最近一直在折腾我的光猫 路由器以及学习嵌入式开发的相关知识 xff0c 于是有了下面这篇文章 xff0c 参考了网上很多文章 xff0c 终于实现了自己的目标 xff0c 简单的记录下来 xff0c 名为 保姆级 其实是因为自己技术很菜 x
  • Docker load 大镜像(17G) 报错no space left on device

    span class token comment 导入加载镜像 xff0c test tar大小有16G左右 span span class token function docker span load span class token
  • 收集yum install安装的软件的全量依赖 rpm 包

    离线安装主要有两种方式 xff1a 源码编译 rpm包安装 源码编译耗费时间长且缺乏编译环境 xff0c 所以一般都选择使用离线 rpm 包安装 有时候离线 rpm 包有比较难于收集齐全 xff0c 但测试环境我们又可以通过 yum ins
  • 镜像搬运工具 Skopeo 使用

    镜像搬运工具 Skopeo 使用 搬砖工具 作为公司内部 PaaS toB 产品的打包发布人员 xff0c 容器镜像对我们打工人而言就像是工地上的砖头 x1f9f1 xff0c 而我的一部分工作就是将这些砖头在各个仓库之间搬来搬去 xff0
  • Habor数据迁移方式有多少,skopeo效率最好

    迁移流程 两个不同的Harbor实例迁移数据 含镜像数据和数据库数据 迁移方式 Harbor 镜像skopeoimage syncer手工机制基于策略的内容机制 xff1a 支持多种过滤器 xff08 镜像库 tag和标签 xff09 与多