[TOC]
使用acme证书搭建harbor私有镜像仓库
acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书. https://github.com/Neilpang/acme.sh
环境准备
腾讯云服务器: OS: Centos7.4 172.21.32.8 62.234.69.63 域名:hub.mapollo.com 解析到以上IP地址
基础安装
安装docker-ce docker-compose python3 pip
安装acme.sh
yum -y install socat
curl https://get.acme.sh | sh
cd ~/.acme.sh
自动申请证书条件:域名正确指向服务器公网地址,确认此服务器80端口未被占用且可访问。sh acme.sh --issue -d hub.mapollo.com --standalone
成功结果:
[Wed Jan 16 10:09:03 CST 2019] Your cert is in /root/.acme.sh/hub.mapollo.com/hub.mapollo.com.cer
[Wed Jan 16 10:09:03 CST 2019] Your cert key is in /root/.acme.sh/hub.mapollo.com/hub.mapollo.com.key
[Wed Jan 16 10:09:04 CST 2019] The intermediate CA cert is in /root/.acme.sh/hub.mapollo.com/ca.cer
[Wed Jan 16 10:09:04 CST 2019] And the full chain certs is there: /root/.acme.sh/hub.mapollo.com/fullchain.cer
安装harbor
下载: wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.0.tgz
解压:tar -zxvf harbor-offline-installer-v1.7.0.tgz
先不使用证书,修改配置文件harbor.cfg中hostname项为正确的域名 安装: ./install.sh
验证
[root@VM_32_8_centos harbor]# docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver /harbor/start.sh Up (healthy)
harbor-core /harbor/start.sh Up (healthy)
harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp
harbor-jobservice /harbor/start.sh Up
harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp
harbor-portal nginx -g daemon off; Up (healthy) 80/tcp
nginx nginx -g daemon off; Up (healthy) 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up 6379/tcp
registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp
registryctl /harbor/start.sh Up (healthy)
手动启动停止honbor
docker-compose up -d
docker-compose down
已经可以通过浏览器登录harbor user:admin pass: Harbor12345 创建测试项目,测试用户,分配用户权限
http://hub.mapollo.com
push 镜像
由于采用了默认的 http 方式连接,而 Docker 认为这是不安全的,所以在 push 之前需要调整一下 docker 配置,
修改/lib/systemd/system/docker.service文件,添加--insecure-registry hub.mapollo.com,重启docker daemon 和service
ExecStart=/usr/bin/docker --insecure-registry hub.mapollo.comsystemctl daemon-reload && systemctl restart docker
从hub.docker.io上pull ubuntudocker pull ubuntu:16.04
打上我们的标签, 默认这个 library 项目是公开的,所有人都可以有读写的权限docker tag ubuntu:16.04 hub.mapollo.com/library/myubuntu:v1
docker tag tomcat:latest hub.mapollo.com/library/myubuntu:v1
docker login hub.mapollo.com
# 输入新建的用户名密码docker push hub.mapollo.com/library/myubuntu:v1
推送成功
http://hub.mapollo.com 上查看推送的项目
安装harnor nginx 证书
harbor默认配置证书放置在/data/cert/目录下,证书文件名也需要和harbor.cfg配置文件中的一一对应。在执行后续prepare的时候会被copy到nginx容器的配置文件目录harbor/common/config/nginx/cert/中。 在此发现一个问题:证书更新后再次执行prepare不会覆盖更新harbor/common/config/nginx/cert中的文件。会导致nginx证书无效。 mkdir -p /data/cert/
./acme.sh --install-cert -d hub.mapollo.com --key-file /data/cert/hub.mapollo.com.key --fullchain-file /data/cert/hub.mapollo.com.crt
停止harbordocker-compose down -v
#修改harbor配置文件 更改https,证书文件名sed -i s/server.crt/hub.mapollo.com.cft/ harbor.cfg
sed -i s/server.key/hub.mapollo.com.key/ harbor.cfg
sed -i s/ui_url_protocol\ =\ http/ui_url_protocol\ =\ https/g harbor.cfg
#重新生成harbor docker 配置/opt/harbor/prepare
删除 docker.service 修改
ExecStart=/usr/bin/docker systemctl daemon-reload && systemctl restart docker
重新启动harbordocker-compose up -d
重新登录harbordocker login hub.mapollo.com
登录成功
再次测试push imagedocker pull tomcat
docker tag tomcat:latest hub.mapollo.com/library/mytomcat:v1
docker push hub.mapollo.com/library/mytomcat:v1
证书有效期
acme.sh申请的证书有效期90天,acme.sh安装的时候已经自动添加了一个计划任务每天自动更新证书,更新后重启使用证书的服务。 acme.sh自动添加的计划任务
[root@VM_32_8_centos .acme.sh]# crontab -l | grep acme
11 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
该计划任务也会自动执行证书上一次的安装命令,为确保nginx使用最新的证书,重新执行一次安装证书命令让acme.ch将证书文件安装到正确的位置及重启nginx服务。
acme.sh --install-cert -d hub.mapollo.com \
--key-file /opt/harbor/common/config/nginx/cert/server.key \
--fullchainpath /opt/harbor/common/config/nginx/cert/server.crt \
--reloadcmd "docker restart 8d3983815cec"
写在最后 验证 SSL
访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:
https://ssllabs.com/ssltest/analyze.html?d=domainname.com
确保验证结果有 A 以上,否则根据提示调整问题