harbor 测试连接成功但同步失败

在进行 harbor 同步时候遇到了这个问题,记录下来。

harbor是什么

Harbor 是 VMware 公司开源的企业级 Registry 项目,可以帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文。

问题背景

背景很简单,就是在新的机器上运行了一个新的 Harbor:

wget https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.3.0.tgz
tar xzvf harbor-offline-installer-v1.3.0.tgz
cd harbor
./install.sh

在进行 replication 同步时,测试可以连通,log显示无法同步,与github上的这个issue描述基本一致:

https://github.com/vmware/harbor/issues/3856

2017-12-22T14:37:07Z [INFO] initializing: repository: crm/mysql, tags: [], source URL: http://registry:5000, destination URL: http://reg1.rainbow.com, insecure: true, destination user: admin
2017-12-22T14:37:07Z [INFO] initialization completed: project: crm, repository: crm/mysql, tags: [latest v1.0.0], source URL: http://registry:5000, destination URL: http://reg1.rainbow.com, insecure: true, destination user: admin
2017-12-22T14:37:07Z [ERROR] [transfer.go:204]: an error occurred while creating project crm on http://reg1.rainbow.com with user admin : failed to create project crm on http://reg1.rainbow.com with user admin: 301

从下文贡献者 @reasonerjt 回复的答案

This is because you are running a 1.3.0 build on your remote target, and the request failed due to API security enforcement. This should be fixed if you upgrade your source env to 1.3.0 also.

可以知道,这是两个harbor版本不一致造成的:我的源 Harbor 版本为 1.2.2 版本,新环境中的 Harbor 为 1.3.0。

其他问题

在运行过程中,也出现了下面这个现象:

​ harbor-adminserver 容器始终无法启动。

查看日志可以了解到,secretkey_path 是个文件夹,通过删除data文件夹后重新install解决。

参考资料


docker-gitlab 的数据迁移

这篇文章介绍下如何将容器化的 gitlab 进行数据迁移。

gitlab是什么

GitLab是利用Ruby on Rails一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。

gitlab迁移背景

目前个人环境上跑了一个单机版的 gitlab, 运行命令为:

sudo docker run -d \
   --env GITLAB_OMNIBUS_CONFIG="external_url 'http://xx:8181'" \ 
   --publish 8181:8181 \ 
   --name gitlab \ 
   --restart always \ 
   --volume /app/gitlab/config:/etc/gitlab \ 
   --volume /app/gitlab/logs:/var/log/gitlab \ 
   --volume /app/gitlab/data:/var/opt/gitlab \ 
gitlab/gitlab-ce:9.5.1-ce.0

目前我们需要做的就是将环境配置和数据内容还原到新的环境中去。

迁移过程

  1. 备份数据库和配置文件,将数据文件与配置文件传输到新机器上。

    docker exec -t <your container name> gitlab-rake gitlab:backup:create
    

    备份文件位于宿主机的 /app/gitlab/data/backups 目录下。

    配置文件位于 /app/gitlab/config 文件夹内。

  2. 新机器上运行相同的 run 命令

    # 运行容器
    docker run xxx
    
    # 停止容器
    docker stop gitlab 
    
    # 数据文件和配置文件替换
    mv 1493107454_2017_04_25_9.1.0_gitlab_backup.tar  /app/gitlab/data/backups 
    mv config /app/gitlab/config
    
  3. 重新运行容器,进入容器后断开 gitlab 与 数据库的连接

    # 进入容器
    docker exec -it <your container name> /bin/bash
    gitlab-ctl stop unicorn
    gitlab-ctl stop sidekiq
    
    # 验证
    gitlab-ctl status
    

    还原备份:

    # 重建数据库
    sudo gitlab-rake gitlab:backup:restore BACKUP=1493107454_2017_04_25_9.1.0
    

    重启 gitlab 并验证:

    sudo gitlab-ctl restart
    sudo gitlab-rake gitlab:check SANITIZE=true
    
  4. 大功告成。

参考资料


基于 dnspod 的 ddns 脚本 —— KeluDdnsKit

DDNS是什么

DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。

DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。

  DDNS

动态域名服务的对象是指IP是动态的,是变动的。普通的DNS都是基于静态IP的,有可能是一对多或多对多,IP都是固定的一个或多个。但DDNS的IP是变动的、随机的。

DDNS 有很多用处,其中最常见的用法类似于 keepalived 的效果:用来防止单点故障。

KeluDdnsKit

今天在 dnspod 的 api 的基础上添加节点存活的检测并自动修改的功能。可以在 github 上查看源码:KeluDdnsKit

具体实现与上边的图片描述是不同的。并没有 DDNS Client这个节点,由 DDNS server 检测节点存活再动态修改 dns server 记录。

用法

  1. 复制dns.conf.example到同一目录下的dns.conf,填充 api 的访问密钥。
  2. 复制domain.list.example到同一目录下的domain.list,填写需要 ddns 的域名。

执行时直接运行ddnspod.sh,默认无限 check domain.list 中的域名,并自动选择可用节点。

配置文件格式:

# 按`TokenID,Token`格式填写
arToken="12345,7676f344eaeaea9074c123451234512d"

# 每行一个域名
test.org www

效果图

keluddnskit

todo

  • 将这个项目容器化,使用更加方便
  • 增加默认配置恢复功能。

docker 时间同步

使用 Docker 有一段时间了,经常会遇到 Docker 容器的时间和宿主机时间不同步的问题。造成这个问题的主要原因是 Docker 并没有进行时间设置,默认为格林尼治时间,与我们所在的东八区相隔了 8 个小时。

目前解决这个问题有以下两种思路:

  • docker run 时指定启动参数,自动挂载localtime文件到容器内
 docker run --name <name> -v /etc/localtime:/etc/localtime:ro  .... 
  • 在 Dockerfile 中设置
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone

参考资料