前因

之前在这篇文章中提到了咱们现在在用的服务器,功耗实在是太高了,所以在4月初买了新的服务器来替换。迁移服务器,需要迁移虚拟机和容器,虚拟机好说,把虚拟硬盘迁过去就完事了,然而容器又怎么迁移呢?这里咱们就来谈谈迁移容器的方法吧~

A 简单的迁移方法

利用 DockerHub ,将容器先 commit ,再 tag 一下,然后 push 上去

优点:简单省事, DockerHub 的服务器速度还不错

缺点:容器镜像完全公开,不适合上传私有镜像(尤其是含有配置的)

B 我的迁移方法

利用 Harbor 搭建私有镜像仓库,将容器上传至自建 Harbor 服务器中,新服务器在 docker login 后 pull image 即可

优点:适合上传自己的私有镜像,权限完全可控

缺点:私有仓库搭建和配置比较复杂,速度完全取决于自己服务器的带宽(通常较慢)

那么下面,就来说说怎么来搭 Harbor 服务器吧


一、硬件准备

下面的表格是 Harbor docs 里面的硬件要求

Resource(硬件种类) Minimum(最小) Recommended(推荐)
CPU(中央处理器) 2 CPU 4 CPU
Mem(内存) 4 GB 8 GB
Disk(硬盘) 40 GB 160 GB

需要说明的是,这里的 2 CPU 、 4 CPU 指的是线程数

Harbor 的服务是通过 Docker 来跑的,所以你需要在虚拟机或是物理机里面跑,不能用 Docker 来跑

二、软件准备

系统的话,我个人比较喜欢 CentOS ,用的比较顺手,你可以选择任何你喜欢的 Linux 发行版

下面的表格是 Harbor docs 里给出的

Software(软件) Version(版本) Description(描述)
Docker engine Version 17.06.0-ce(或更高) 安装指南,可参考 Docker Engine documentation
Docker Compose Version 1.18.0(或更高) 安装指南,可参考 Docker Compose documentation
Openssl 推荐最新版 用来生成证书和(证书的)私钥

稍微详谈一下软件的安装

Docker engine

可以在这里选择相应的系统,然后寻找 Install from a package ,通过安装包安装

也可以通过命令行方式安装( root 权限下)

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io

Docker Compose

使用 pip 安装是比较简单的方式

( root 下操作)

yum install python3
pip3 install docker-compose

Openssl

这个我没有装,因为我不需要生成证书,我的 https 的证书是传递进来的,详情请看:一次申请,到处使用——在物理机、容器、虚拟机之间传递HTTPS证书

那么,需要装的同学怎么办呢?

首先,你需要安装编译的依赖库( root 下操作)

yum update
yum install gcc make

然后,去这里下载 Openssl 的最新版,然后进行如下操作

1、在文件夹下解压缩,命令: tar -xzf openssl-xx.tar.gz ,得到 openssl-xx 文件夹( xx 是版本号)

2、进入解压的目录: cd openssl-xx

3、设定 Openssl 安装,通过 –prefix 参数指定安装的目录,也就是安装后的文件会出现在这个目录下:

执行命令: ./config –prefix=/usr/local/openssl

4、执行命令./config -t

5、执行make,编译安装 Openssl

不推荐大家安装 Openssl ,而是通过传递证书的方法将证书传递进去,自签的证书在实际用的时候往往不被信任,用的时候比较麻烦

三、Harbor 服务搭建及启动

下载Harbor安装文件

GitHub 上下载指定版本的安装包并解压

当然,推荐下最新版

mkdir -p /harbor
cd /harbor
yum -y install wget
wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-online-installer-vxx.tgz
tar -zxf harbor-online-installer-vxx.tgz

vxx 是版本号,请自行替换

安装包有两种,一种是 online ,安装包体积极小,里面其实是个安装脚本,文件从网上获取,一种是 offline ,支持离线安装,网络不好的请将服务器科学上网或者想办法下载离线包安装

配置Harbor

[root@localhost]# cd /harbor
[root@localhost harbor]# ls
harbor harbor-online-installer-vxx.tgz
[root@localhost harbor]# cd harbor
[root@localhost harbor]# ls
common docker-compose.notary.yml docker-compose.yml harbor_1_1_0_template harbor.cfg install.sh LICENSE NOTICE prepare upgrade
[root@localhost harbor]# vi harbor.cfg
# file: /harbor/harbor/harbor.cfg 
# hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhost
hostname = 177.229.25.21

# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = https

# mysql数据库root用户默认密码root123,实际使用时需要修改
db_password = 123456

max_job_workers = 3
# 使用自己的 SSL 证书(传递证书的话这会儿需要把证书传递到这个文件夹里面去)
customize_crt = on
# SSL 证书的位置
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key

secretkey_path = /data

admiral_url = NA
# 邮件设置,发送重置密码邮件时使用,可以先不设置
email_identity =

email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false

# 启动Harbor后,管理员UI登录的密码,默认是Harbor12345,实际使用时需要修改
harbor_admin_password = 123456

# 认证方式,这里支持多种认证方式,如LADP、数据库认证等。默认是db_auth,通过mysql数据库认证
auth_mode = db_auth

# LDAP认证时配置项
ldap_url = ldaps://ldap.mydomain.com
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#ldap_search_pwd = password
ldap_basedn = ou=people,dc=mydomain,dc=com
#ldap_filter = (objectClass=person)
ldap_uid = uid
ldap_scope = 3
ldap_timeout = 5

# 是否开启自注册
self_registration = on

# token有效时间,默认30分钟
token_expiration = 30

# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
# 验证远端证书,默认即可
verify_remote_cert = on

如果想跑在非标端口,或者指定域名,或者使用了传递进来的证书,还需要修改 harbor.yml

vi harbor.yml

# file: /harbor/harbor/harbor.yml
# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
# 在这里设置访问的域名
hostname: harbor.luckykeeper.site

# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
# http 端口设置,默认80
port: 12305

# https related config
https:
# https port for harbor, default is 443
# https端口设置,默认443
port: 12306
# The path of cert and key files for nginx
# 证书文件设置
certificate: /data/cert/fullchain.pem
private_key: /data/cert/privkey.pem

# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# 如果用 nginx 做反代,把下面这行注释,地址改为 nginx 反代的地址+端口(标准端口就不需要啦)
# external_url: https://harbor.luckykeeper.site:8433

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
# UI的密码,同 harbor.cfg
harbor_admin_password: 123456

# Harbor DB configuration
# 数据库设置
database:
# The password for the root user of Harbor DB. Change this before any production use.
#数据库密码,同 harbor.cfg,再往下的就不需要改啦
password: 123456
# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
max_idle_conns: 50
# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
# Note: the default number of connections is 100 for postgres.
max_open_conns: 100

# The default data volume
data_volume: /data

# Harbor Storage settings by default is using /data dir on local filesystem
# Uncomment storage_service setting If you want to using external storage
# storage_service:
# # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore
# # of registry's and chart repository's containers. This is usually needed when the user hosts a internal storage with self signed certificate.
# ca_bundle:

# # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss
# # for more info about this configuration please refer https://docs.docker.com/registry/configuration/
# filesystem:
# maxthreads: 100
# # set disable to true when you want to disable registry redirect
# redirect:
# disabled: false

# Clair configuration
clair:
# The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.
updaters_interval: 12

jobservice:
# Maximum number of job workers in job service
max_job_workers: 10

notification:
# Maximum retry count for webhook job
webhook_job_max_retry: 10

chart:
# Change the value of absolute_url to enabled can enable absolute url in chart
absolute_url: disabled

# Log configurations
log:
# options are debug, info, warning, error, fatal
level: info
# configs for logs in local storage
local:
# Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
rotate_count: 50
# Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.
# If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G
# are all valid.
rotate_size: 200M
# The directory on your host that store log
location: /var/log/harbor

# Uncomment following lines to enable external syslog endpoint.
# external_endpoint:
# # protocol used to transmit log to external endpoint, options is tcp or udp
# protocol: tcp
# # The host of external endpoint
# host: localhost
# # Port of external endpoint
# port: 5140

#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version: 1.10.0

# Uncomment external_database if using external database.
# external_database:
# harbor:
# host: harbor_db_host
# port: harbor_db_port
# db_name: harbor_db_name
# username: harbor_db_username
# password: harbor_db_password
# ssl_mode: disable
# max_idle_conns: 2
# max_open_conns: 0
# clair:
# host: clair_db_host
# port: clair_db_port
# db_name: clair_db_name
# username: clair_db_username
# password: clair_db_password
# ssl_mode: disable
# notary_signer:
# host: notary_signer_db_host
# port: notary_signer_db_port
# db_name: notary_signer_db_name
# username: notary_signer_db_username
# password: notary_signer_db_password
# ssl_mode: disable
# notary_server:
# host: notary_server_db_host
# port: notary_server_db_port
# db_name: notary_server_db_name
# username: notary_server_db_username
# password: notary_server_db_password
# ssl_mode: disable

# Uncomment external_redis if using external Redis server
# external_redis:
# host: redis
# port: 6379
# password:
# # db_index 0 is for core, it's unchangeable
# registry_db_index: 1
# jobservice_db_index: 2
# chartmuseum_db_index: 3
# clair_db_index: 4

# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.
# uaa:
# ca_file: /path/to/ca

# Global proxy
# Config http proxy for components, e.g. http://my.proxy.com:3128
# Components doesn't need to connect to each others via http proxy.
# Remove component from `components` array if want disable proxy
# for it. If you want use proxy for replication, MUST enable proxy
# for core and jobservice, and set `http_proxy` and `https_proxy`.
# Add domain to the `no_proxy` field, when you want disable proxy
# for some special registry.
proxy:
http_proxy:
https_proxy:
# no_proxy endpoints will appended to 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair,chartmuseum,notary-server
no_proxy:
components:
- core
- jobservice
- clair

启动Harbor

修改完配置文件后,在当前目录执行 ./install.sh ,Harbor 服务就会根据当前目录下的 docker-compose.yml 开始下载依赖的镜像,检测并按照顺序依次启动各个服务

启动完成后,我们就能通过浏览器访问啦~

Harbor_WebGui

四、Harbor 使用

新建项目

使用管理员账户 admin 登录

Harbor_logined

不推荐使用admin来操作,所以去用户管理里面建一个新账户

用新账户登录后,先新建一个项目

Harbor新建项目

因为我们想建的是私有仓库,所以不选择公开

如果选择公开,那么任何人都会拥有该项目的读权限,即不需要 docker login 即可 pull image

如果不选择公开,那么其他人不会拥有任何权限,需要 docker login 后,才可 pull image

上传镜像

这里我们讲手动 commit 的情况,因为用 Dockerfile 方式一般都会将配置文件外置,使用时映射进去,而修改容器后将配置写入之后符合我们的使用情况

上传镜像分三步

1. 将容器 commit 成镜像

将已经配置好的容器 commit ,使其成为一个镜像(image)

语法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

示例:

docker commit -a "Luckykeeper <luckykeeper@luckykeeper.site>" -m "LuckyTalk for LuckyServer" a404c6c174a2  luckytalk:v1 

参数解释:

-a 作者,可选参数,写自己的名字哒~

-m 注释,可选参数,备注一下镜像的内容以免遗忘

a404c6c174a2 容器的ID,可使用 docker ps 命令查看

luckytalk:v1 形成 image 的 名字:版本号,需要注意的是,这里的内容必须全部小写

例子中,我们将 ID 为 a404c6c174a2 的容器 commit 成了一个镜像,并写明其作者是 Luckykeeper luckykeeper@luckykeeper.site ,给它的备注是 LuckyTalk for LuckyServer ,形成的 image 叫 luckytalk ,版本号是 v1

2. tag 镜像(将 commit 出来的 image 打个标签)

tag 镜像的目的是指定镜像要往哪里上传

如果要将镜像上传至 DockerHub ,首先需要注册一个 DockerHub 账号,并类似这样 tag 镜像(仍然使用上面的例子)

其中,luckykeeper 是DockerHub 账号名

docker tag luckytalk:v1 luckykeeper/luckytalk:v1

上传到自建 Harbor 服务器的话,与上面类似,标明服务器、项目名即可

docker tag luckytalk:v1 harbor.luckykeeper.site:12306/luckyserver/luckytalk:v1

参数解释:

harbor.luckykeeper.site:12306 服务器:端口,标准端口不需要指定端口号,另外,不需要写 https ,对于 http ,需要修改 docker 配置文件加入不安全镜像源并加端口号(默认80)

luckyserver 在 Harbor中建项目的名称

luckytalk:v1 仍然是 镜像名:版本号

3. push 镜像(上传镜像到 Harbor 服务器中)

非常简单,一句命令

# 上传到DockerHub
docker push luckykeeper/luckytalk:v1
# 上传到自建服务器
docker push harbor.luckykeeper.site:12306/luckyserver/luckytalk:v1

将刚才 tag 好的镜像上传到指定服务器中

解决重启之后,服务挂了的问题

原因通常有二

1、docker 没跑起来

chmod +x /etc/rc.local
# 在自动启动里面加上 docker 的自启命令
service docker start

2、docker 启动了,docker-compose 没正确启动

cd 到 harbor 安装目录,然后重启下docker-compose

docker-compose down
docker-compose up -d

将上面过程自动化

# 第一步,在 root 文件夹(别的文件夹当然也可以)创建以下脚本
# /root/harbor 是我安装 harbor 的文件夹,请根据具体情况调整
# File: /root/harbor_auto_start.sh
#!/bin/sh
sleep 5m
cd /root/harbor
docker-compose down
sleep 5m
docker-compose up -d

# 在终端执行以下命令(root目录)
chmod +x harbor_auto_start.sh

#编辑 /etc/rc.local 加入以下内容
. ./root/harbor_auto_start.sh

相关说明:

sleep 5m 是为了给服务启动、停止和创建留足时间,可以根据实际情况缩短或异常

. ./root/harbor_auto_start.sh 这里的 . . (注意两个点之间有一个空格)等同于 source 命令,它使得我们可以使用 cd 命令切换命令执行的目录, docker-compose down 和 docker-compose up -d 只能在 Harbor 的安装目录使用

小小彩蛋

~~金院也在使用同款 Harbor 服务器哦~~~

看来技术还是不丢人的嘛

bighuaji