搭建Docker镜像仓库Harbor,并配置https证书

2018-03-28 2406点热度 0人点赞 0条评论

准备环境

软件版本信息

操作系统:

Fedora Server 27,Linux 4.15.10-300.fc27.x86_64 #1 SMP Thu Mar 15 17:13:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

操作系统版本不一定要最新的,但是操作系统Linux内核版本必须在3.10以上。

安装fedora的时候需要选择“容器管理”才会安装docker相关服务及命令。

安装完成之后需要使用如下命令启动docker服务:

systemctl start docker

然后可以使用 docker version 命令查看docker的版本信息,Fedora默认安装的是1.13版本。

Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-44.git584d391.fc27.x86_64
 Go version:      go1.9.1
 Git commit:      caba767-unsupported
 Built:           Thu Nov 23 21:17:26 2017
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-44.git584d391.fc27.x86_64
 Go version:      go1.9.1
 Git commit:      caba767-unsupported
 Built:           Thu Nov 23 21:17:26 2017
 OS/Arch:         linux/amd64
 Experimental:    false

安装系统的时候,docker-compose是默认没有的,需要单独安装,安装方法参考下一小节。尽量安装最新发布的版本。
docker-compose:

docker-compose version 1.20.1, build 5d8c71b
docker-py version: 3.1.4
CPython version: 3.6.4
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

harbor : v1.4.0

安装docker-compose

docker为Fedora Server自带,无需安装,没有docker-compose,需要安装。docker-compose的github地址为:https://github.com/docker/compose
点击到“release”标签页查看发布的版本,直接使用github上的命令进行安装:

curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

关闭防火墙与SELinux【非常重要】

#systemctl stop firewalld && systemctl disable firewalld
#setenforce 0
#vi /etc/selinux/config
SELINUX=disabled

下载并安装harbor

下载harbor离线安装包

harbor的github地址https://github.com/vmware/harbor
同样切换到release标签页查看发布版本,找到最新版本的离线安装包:
https://storage.googleapis.com/harbor-releases/release-1.4.0/harbor-offline-installer-v1.4.0.tgz
文件大小776M,下载完成之后,使用如下命令进行解压

tar xzvf harbor-offline-installer-v1.4.0.tgz

配置harbor.cfg

由于启用了https,因此配置了https的证书,主要修改了如下配置:

hostname = harbor.wangxianfeng.cn
customize_crt = off[这个默认为on,不知道干嘛用的,设置为on的时候运行install.sh总是会报一个root.crt什么的错,干脆把他关了]
ssl_cert = /home/wangxianfeng/harbor/harbor.wangxianfeng.cn.crt
ssl_cert_key = /home/wangxianfeng/harbor/harbor.wangxianfeng.cn.key
secretkey_path = /home/wangxianfeng/harbor/data
# 这个是配置harbor admin用户的web登录密码
harbor_admin_password = xianfengmc

# 邮件服务器没有验证
email_server = smtp.qq.com
email_server_port = 25
email_username = wang-xianfeng@qq.com
email_password = *********
email_from = 王显锋
email_ssl = false
email_insecure = false

需要修改的内容如下:
1. hostname:填写域名信息,慎重填写,以后将要使用的进项将以此为前缀,比如域名是wangxianfeng.cn,以后的镜像名称就是类似如下:wangxianfeng.cn/test/webserver:1.0
2. customize_crt = off 不知道干嘛的,关了就得了
3. ssl_cert和ssl_cert_key这2个配置的是生成的ssl相关的内容,根据后缀名配置即可。
4. secretkey_path【非常重要】此路径需要和下面docker-compose.yml文件中的相关配置保持一致,比如此处配置的是:/home/wangxianfeng/harbor/data,然后会在此目录下生成1个secretkey的文件,保存着adminserver和ui要使用的key,具体做什么的我也不知道。
5. harbor_admin_password登录web页面的时候admin用户的密码
6. db_password数据库的密码,为了安全起见,还是要改下。

修改docker-compose.yml配置

harbor使用docker-compose进行组合在一起的,相关的配置全部在此进行配置。现在把文件全部内容贴在这里,需要修改的内容我注释一下。

version: '2'
services:
  log:
    image: vmware/harbor-log:v1.4.0
    container_name: harbor-log 
    restart: always
    volumes:
      - /home/wangxianfeng/harbor/data/log/harbor/:/var/log/docker/:z # harbor服务的日志存储路径,需要修改
      - ./common/config/log/:/etc/logrotate.d/:z
    ports:
      - 127.0.0.1:1514:10514
    networks:
      - harbor
  registry:
    image: vmware/registry-photon:v2.6.2-v1.4.0
    container_name: registry
    restart: always
    volumes:
      - /home/wangxianfeng/harbor/data/registry:/storage:z # registry数据存储路径,需要修改
      - ./common/config/registry/:/etc/registry/:z
    networks:
      - harbor
    environment:
      - GODEBUG=netdns=cgo
    command:
      ["serve", "/etc/registry/config.yml"]
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "registry"
  mysql:
    image: vmware/harbor-db:v1.4.0
    container_name: harbor-db
    restart: always
    volumes:
      - /home/wangxianfeng/harbor/data/database:/var/lib/mysql:z # mysql数据库存储路径,需要修改
    networks:
      - harbor
    env_file:
      - ./common/config/db/env
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "mysql"
  adminserver:
    image: vmware/harbor-adminserver:v1.4.0
    container_name: harbor-adminserver
    env_file:
      - ./common/config/adminserver/env
    restart: always
    volumes:
      - /home/wangxianfeng/harbor/data/config/:/etc/adminserver/config/:z # adminserver的存储配置存储路径,需要修改。
      - /home/wangxianfeng/harbor/data/secretkey:/etc/adminserver/key:z # 需要和上一节secretkey_path保持一致,这里使用的就是那里产生的secretkey,需要修改。
      - /home/wangxianfeng/harbor/data/:/data/:z #adminserver数据存储路径,需要修改
    networks:
      - harbor
    depends_on:
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "adminserver"
  ui:
    image: vmware/harbor-ui:v1.4.0
    container_name: harbor-ui
    env_file:
      - ./common/config/ui/env
    restart: always
    volumes:
      - ./common/config/ui/app.conf:/etc/ui/app.conf:z
      - ./common/config/ui/private_key.pem:/etc/ui/private_key.pem:z
      - ./common/config/ui/certificates/:/etc/ui/certificates/:z
      - /home/wangxianfeng/harbor/data/secretkey:/etc/ui/key:z # 需要和上一节secretkey_path保持一致,这里使用的就是那里产生的secretkey,需要修改。
      - /home/wangxianfeng/harbor/data/ca_download/:/etc/ui/ca/:z # 需要修改
      - /home/wangxianfeng/harbor/data/psc/:/etc/ui/token/:z # 需要修改
    networks:
      - harbor
    depends_on:
      - log
      - adminserver
      - registry
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "ui"
  jobservice:
    image: vmware/harbor-jobservice:v1.4.0
    container_name: harbor-jobservice
    env_file:
      - ./common/config/jobservice/env
    restart: always
    volumes:
      - /home/wangxianfeng/harbor/data/job_logs:/var/log/jobs:z # 需要修改
      - ./common/config/jobservice/app.conf:/etc/jobservice/app.conf:z
      - /home/wangxianfeng/harbor/data/secretkey:/etc/jobservice/key:z # 需要和上一节secretkey_path保持一致,这里使用的就是那里产生的secretkey,需要修改。
    networks:
      - harbor
    depends_on:
      - ui
      - adminserver
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "jobservice"
  proxy:
    image: vmware/nginx-photon:v1.4.0
    container_name: nginx
    restart: always
    volumes:
      - ./common/config/nginx:/etc/nginx:z
    networks:
      - harbor
    ports:
      - 80:80 #端口不能修改
      - 443:443 #端口不能修改,否则push镜像的时候会有问题
      - 4443:4443
    depends_on:
      - mysql
      - registry
      - ui
      - log
    logging:
      driver: "syslog"
      options:  
        syslog-address: "tcp://127.0.0.1:1514"
        tag: "proxy"
networks:
  harbor:
    external: false

生成https CA证书

1.制作CA证书:

ca.key CA私钥:

openssl genrsa -des3 -out ca.key 2048

制作解密后的CA私钥(一般无此必要):

openssl rsa -in ca.key -out ca_decrypted.key

ca.crt CA根证书(公钥):

openssl req -new -x509 -days 7305 -key ca.key -out ca.crt

2.制作生成网站的证书并用CA签名认证

在这里,假设网站域名为harbor.wangxianfeng.cn
生成harbor.wangxianfeng.cn证书私钥:

openssl genrsa -des3 -out harbor.wangxianfeng.cn.pem 1024

制作解密后的harbor.wangxianfeng.cn证书私钥:

openssl rsa -in harbor.wangxianfeng.cn.pem -out harbor.wangxianfeng.cn.key

生成签名请求:

openssl req -new -key harbor.wangxianfeng.cn.pem -out harbor.wangxianfeng.cn.csr

在common name中填入网站域名,如harbor.wangxianfeng.cn即可生成改站点的证书,同时也可以使用泛域名如*.wangxianfeng.cn来生成所有二级域名可用的网站证书。
用CA进行签名:

openssl ca -policy policy_anything -days 1460 -cert ca.crt -keyfile ca.key -in harbor.wangxianfeng.cn.csr -out harbor.wangxianfeng.cn.crt

其中,policy参数允许签名的CA和网站证书可以有不同的国家、地名等信息,days参数则是签名时限。
如果在执行签名命令时,出现“I am unable to access the ../../CA/newcerts directory”
修改/etc/pki/tls/openssl.cnf中“dir = ./CA”
然后:

mkdir -p CA/newcerts
touch CA/index.txt
touch CA/serial
echo "01" > CA/serial

再重新执行签名命令。
最后,把ca.crt的内容粘贴到harbor.wangxianfeng.cn.crt后面。这个比较重要!因为不这样做,可能会有某些浏览器不支持。
好了,现在https需要到的网站私钥harbor.wangxianfeng.cn.key和网站证书harbor.wangxianfeng.cn.crt都准备完毕。

执行install.sh进行安装

如果一切配置好,在当前目录下执行如下命令,即可正常启动harbor

./install.sh

此命令会准备好所有的镜像,然后启动harbor相关的所有容器,启动之后的容器有如下几个:

vmware/nginx-photon
vmware/harbor-jobservice
vmware/harbor-ui
vmware/harbor-db
vmware/harbor-adminserver
vmware/registry-photon
vmware/harbor-log

此时便可以通过https://domainname或者https://ip的方式进行访问。

使用harbor

新建项目&管理项目

点击左侧的“项目”菜单,点击“新建项目”按钮,输入项目名称,设置访问级别,公开表示不用认证也可以读取项目里的镜像,非公开表示只有项目的成员才能读取该项目里的镜像。为了安全起见,还是设置为非公开。这里创建了一个xf的项目:

刚刚新建完成的项目没有任何镜像,因此镜像仓库显示为空。创建项目使用的是admin用户,但是下载镜像不应该使用admin用户,因此可以新建一个开发人员的用户,把新建用户加入到项目成员当中去。

添加到项目成员当中,角色为开发人员:

这样就可以用新建的用户进行镜像的push和pull操作了。

镜像的push与pull操作

创建镜像仓库就是为了存储镜像的,因此下面的步骤就去存储和下载镜像,首先下载一个测试的镜像nginx

docker pull nginx

然后标记新的镜像(版本设置为1.0):

docker tag nginx harbor.wangxianfeng.cn/xf/nginx:1.0

然后使用docker iamges命令查看新的镜像是否已经生成
这时先不要着急push,因为还有一个重要的步骤需要完成

此时打开网页访问harbor.wangxianfeng.cn时就会提示ssl不安全的连接,说明ssl添加成功;但是在命令行登陆docker仓库时不成功的。[用Ip登陆则成功]
错误信息类似如下:

x509: certificate is valid for server, not harbor.wangxianfeng.cn

解决方法:停止服务:

docker-compose down

创建对应目录:

mkdir -p /etc/docker/certs.d/harbor.wangxianfeng.cn
cp ~/harbor/harbor.wangxianfeng.cn.crt /etc/docker/certs.d/harbor.wangxianfeng.cn/ca.crt

启动服务:

docker-compose up -d

再次登陆,成功了:

[root@wangxianfeng-f27 wangxianfeng]# docker login harbor.wangxianfeng.cn
Username (wangxianfeng): wangxianfeng
Password: 
Login Succeeded

然后就可以push镜像到仓库了:

docker push harbor.wangxianfeng.cn/xf/nginx:1.0

可以在harbor前台查看刚刚push的镜像:

测试一下新上传的镜像

首先删除当前机器上所有nginx镜像

docker iamges 找到nginx的image id,由于其他镜像只是做个标记,因此所有nginx的image id是一样的,只需要使用如下命令即可删除所有nginx相关镜像
docker rmi -f 7f70b30f2cc6[nginx image id]

从新的仓库pull镜像下来:

docker pull harbor.wangxianfeng.cn/xf/nginx:1.0

然后运行一个容器:

docker run -d -p 8098:80 harbor.wangxianfeng.cn/xf/nginx:1.0

把nginx的80端口映射到本地的8098端口,然后直接访问此机器的8098端口,看看是否能够访问:

完美!

再测试一下非项目成员能够读取镜像

新建用户xianfeng,不加入到xf项目成员当中
然后命令行操作如下:

[root@wangxianfeng-f27 harbor]# docker logout wangxianfeng
Not logged in to wangxianfeng
[root@wangxianfeng-f27 harbor]# docker login harbor.wangxianfeng.cn
Username (wangxianfeng): xianfeng
Password: 
Login Succeeded
[root@wangxianfeng-f27 harbor]# docker pull harbor.wangxianfeng.cn/xf/nginx:1.0
Trying to pull repository harbor.wangxianfeng.cn/xf/nginx ... 
repository harbor.wangxianfeng.cn/xf/nginx not found: does not exist or no pull access

Perfect!The end!

参考博文(感谢):
Docker镜像仓库Harbor之搭建及配置
harbor离线安装并配置HTTPS私钥认证的Docker仓库

王显锋

激情工作,快乐生活!

文章评论