当前厂里需要搭建一个私有的 docker image registry 给内网使用,学习了一下之后,使用 harbor 来实现。
前置条件
硬件
CPU 至少 2 个,推荐 4 个;
内存至少 4G,推荐 8G ;
硬盘至少 40G,如果打算保存的 image ,建议加大硬盘空间;
软件
需要安装以下软件:
名称 | 版本 | 描述 |
---|---|---|
docker engine | 17.06.0-ce + | |
docker compose | 1.18.0 + | |
openssl | 最新版 | 用于生成证书和密钥 |
端口
Harbor 的运行需要占用以下端口:80、443 和 4443
安装
前往 harbor 的发布页面;
下载最新的离线安装包;
解压安装包;
1
tar -xvf harbor-offline-installer-version.tgz
获取证书
ca.crt
,yourdomain.com.crt
,yourdomain.com.key
。若需使用自签名证书,请参考下方证书相关把证书复制到 harbor 程序读取到目录,并修改解压出来的文件
1
2
3
4# 复制一份出来修改
cp harbor.yml.tmpl harbor.yml
# 然后修改 harbor.yml
vi harbor.yml把 https 部分的配置,指向证书存放目录
1
2
3
4
5
6https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /your/certificate/path
private_key: /your/private/key/path把
yourdomain.com.crt
转化为yourdomain.com.cert
。由于 Docker daemon 把.crt
文件解析为证书颁发机构的证书,而把.cert
文件解析为客户端证书,所以我们需要进行转化1
openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
把服务证书、服务私钥和证书颁发机构的证书复制到 Docker 的证书存放目录下(如果目录不存在,需自行创建,目录名称为你的域名 yourdomain.com)
1
2
3
4mkdir -p /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
cp ca.crt /etc/docker/certs.d/yourdomain.com/放置后,目录应该是这样的:
1
2
3
4
5/etc/docker/certs.d/
└── yourdomain.com
├── yourdomain.com.cert
├── yourdomain.com.key
└── ca.crt重启 Docker 服务
1
systemctl restart docker
更新机器信任证书,需要把服务证书复制到机器的信任区并更新CA信任
1
2
3
4
5
6# Ubuntu
cp yourdomain.com.crt /usr/local/share/ca-certificates/yourdomain.com.crt
update-ca-certificates
# CentOS
cp yourdomain.com.crt /etc/pki/ca-trust/source/anchors/yourdomain.com.crt
update-ca-trust回到 harbor 的安装程序,执行准备工作
1
./prepare
然后启动 安装
1
./install.sh
证书相关
若需使用自签名证书,可执行以下步骤:
生成证书颁发机构的证书
在生产环境下,应使用受信任的证书颁发机构的证书( CA certificate ),在这里,可以创建自己的的证书颁发机构。要创建证书,可以执行以下步骤:
生成 CA certificate 的私钥
1
openssl genrsa -out ca.key 4096
生成 CA certificate ,这里会生成一个 ca.crt,即你的证书颁发机构的证书
这里 -subj 选项是填写你的证书颁发机构的相关信息,如果你使用 FQDN 来连接你的 harbor 主机,请务必指定 common name (CN)。
C 表示国家缩写码,ST 表示 state 省份或州,L 表示 Location ,O 表示 Organization;
1
2
3
4openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
-key ca.key \
-out ca.crt
生成服务证书
服务证书通常包含一个 .crt
文件和一个 .key
文件,例如 yourdomain.com.crt
和 yourdomain.com.key
生成一个服务私钥
1
openssl genrsa -out yourdomain.com.key 4096
生成一个证书签名请求(CSR)
1
2
3
4openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
-key yourdomain.com.key \
-out yourdomain.com.csr生成一个 x509 v3 拓展文件
注意这里需要修改DNS成你的域名
1
2
3
4
5
6
7
8
9
10
11
12cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=yourdomain.com
DNS.2=yourdomain
DNS.3=hostname
EOF使用
v3.ext
文件生成服务证书1
2
3
4
5openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in yourdomain.com.csr \
-out yourdomain.com.crt