私有Docker仓库Harbor

提到私有容器仓库,VMWare出品的开源Harbor算是首选.

安装和配置照官方文档来很简单,今天在尝试push镜像时遇到了如下错误: “Get https://yourdomain.com/v2/: Service Unavailable”, 检查之下发现是没有配置https引起.

配置https

虽然可以给docker常驻进程添加–insecure-registry 这个参数而改用默认的http协议(需要重启docker), 但该参数会使本机所有的注册服务都不再安全, 极力不推荐这么做.

配置https的步骤其实不复杂,记录如下:

先使用mkcert生成证书和密钥, 该工具见上篇证书一文 注: mkcert的方式对docker/k8s会产生问题, 改用官方证书生成方式


# 创建CA证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt

# 生成CSR
openssl req -newkey rsa:4096 -nodes -sha256 -keyout yourdomain.com.key   -out yourdomain.com.csr

# 生成域名证书
penssl x509 -req -days 365 -in yourdomain.com.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out yourdomain.com.crt

# 复制证书到服务器
ssh yourdomain.com "mkdir -p /data/cert"
scp yourdomain.com*.pem yourdomain.com:/data/cert

vi ~/harbor/harbor.cfg

编辑如下内容:

  hostname = yourdomain.com
  ui_url_protocol = https
  ssl_cert = /data/cert/yourdomain.com.crt
  ssl_cert_key = /data/cert/yourdomain.com.key

之后重启harbor服务:

./prepare
docker-compose down
docker-compose up -d

配置docker客户端进程https

解决错误:“Error response from daemon: Get v1/_ping: x509: certificate signed by unknown authority”

cd /etc/docker/certs.d/yourdomain.com
# 复制上一节生成的ca.crt到此

# 产生客户端证书
openssl genrsa -out client.key 4096
openssl req -new -x509 -text -key client.key -out client.cert

最终目录结构如下: tree /etc/docker/certs.d/yourdomain.com

.
├── ca.crt
├── client.cert
└── client.key

Ubuntu可能需要更新系统证书:

cp youdomain.com.crt /usr/local/share/ca-certificates/
update-ca-certificates

为kubernetes节点设置验证

# 在其中一台节点登录私有仓库
docker login reg.server
# 会更新$HOME/.docker/config.json

# 复制到其他节点
nodes=$(kubectl get nodes -o jsonpath='{range.items[*].metadata}{.name} {end}')
for n in $nodes; do scp ~/.docker/config.json root@$n:/root/.docker/config.json; done

备注

Web UI

默认用户名/密码: admin/Harbor12345

推送本地镜像到该仓库

docker login yourdomain.com
docker tag myimg:mytag yourdomain.com/pt/myimg:mytag
docker push yourdomain.com/myproject/myimg:mytag

Docker Notary

Harbor可以和Notary结合, Notary是一个内容数字签名服务,保证分发的内容/镜像可信.

资源