当前位置:   article > 正文

【运维知识大神篇】运维人必学的Docker教程7(Harbor配置HTTPS证书的两种方式+Harbor两种方案实现高可用+镜像推送至Docker hub官方仓库和阿里云镜像仓库+拉取海外镜像技巧)_harbor配置证书

harbor配置证书

本篇文章继续介绍Docker内容,包含Harbor配置HTTPS证书的两种方式(阿里云官方证书与自建证书),Harbor两种方案实现高可用(共享存储目录与主从复制),镜像推送至Docker hub官方仓库和阿里云镜像仓库及拉取海外镜像技巧。

目录

Harbor配置HTTPS

一、配置阿里云官方证书

二、配置自建证书

Harbor高可用

一、Harbor共享储存目录高可用方案

1、小插曲:scp报错解决方案

二、Harbor主从复制及高可用方案

镜像推送

一、推送至docker hub官方仓库

二、推送至阿里云镜像

构建海外镜像技巧


Harbor配置HTTPS

参考官网链接:https://goharbor.io/docs/2.8.0/

一、配置阿里云官方证书

1、在阿里云申请免费的证书并下载下来

观察harbor配置文件,发现需要下载cert和key 

  1. [root@Docker01 ~]# cat -n /koten/softwares/harbor/harbor.yml
  2. ......
  3. 17 # certificate: /your/certificate/path
  4. 18 # private_key: /your/private/key/path
  5. ......

2、将证书和key放入harbor下的目录,然后在配置文件里修改下路径,重启harbor

  1. [root@Docker01 harbor]# cd /koten/softwares/harbor/
  2. [root@Docker01 harbor]# mkdir -p certs/official
  3. [root@Docker01 harbor]# cd certs/official
  4. [root@Docker01 official]# ls
  5. www.koten.vip.key www.koten.vip_public.crt
  6. [root@Docker01 official]# cd ../../
  7. [root@Docker01 harbor]# cat harbor.yml
  8. ......
  9. hostname: www.koten.vip
  10. ......
  11. https:
  12. # # https port for harbor, default is 443
  13. port: 443
  14. # # The path of cert and key files for nginx
  15. certificate: /koten/softwares/harbor/certs/official/www.koten.vip_public.crt #最好是写绝对路径
  16. private_key: /koten/softwares/harbor/certs/official/www.koten.vip.key
  17. ......
  18. [root@Docker01 harbor]# ./install.sh

修改linux和windows的hosts文件

10.0.0.201 www.koten.vip

浏览器访问成功显示HTTPS证书 

Linux作为客户端登录会提示缺少证书认证(有的时候官方的证书不提示),我们需要把证书和秘钥放到/etc/docker/certs.d/www.koten.vip下就可以了 

  1. [root@Docker01 harbor]# docker login www.koten.vip
  2. Username: admin
  3. Password:
  4. Error response from daemon: Get "https://www.koten.vip/v2/": x509: certificate signed by unknown authority
  5. [root@Docker01 harbor]# mkdir -p /etc/docker/certs.d/www.koten.vip
  6. [root@Docker01 harbor]# cp certs/official/www.koten.vip_public.crt /etc/docker/certs.d/www.koten.vip/www.koten.vip.cert #注意此处更名
  7. [root@Docker01 harbor]# cp certs/official/www.koten.vip.key /etc/docker/certs.d/www.koten.vip/
  8. [root@Docker01 harbor]# docker login www.koten.vip
  9. Username: admin
  10. Password:
  11. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  12. Configure a credential helper to remove this warning. See
  13. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  14. Login Succeeded

二、配置自建证书

1、生成ca的证书

  1. #1、创建目录,官方并未要求这样的目录结构,只是方便我们用的时候方便
  2. [root@Docker01 ~]# mkdir -p /koten/softwares/harbor/certs/build/{ca,server,client}
  3. [root@Docker01 ~]# cd /koten/softwares/harbor/certs/build/
  4. #2、生成ca私钥
  5. [root@Docker01 build]# openssl genrsa -out ca/ca.key 4096
  6. #3、生成ca的自签名证书
  7. [root@Docker01 build]# openssl req -x509 -new -nodes -sha512 -days 3650 \
  8. -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=koten.com" \
  9. -key ca/ca.key \
  10. -out ca/ca.crt

2、生成harbor主机证书

  1. #1、生成harbor主机的私钥
  2. [root@Docker01 build]# openssl genrsa -out server/harbor.koten.com.key 4096
  3. #2、生成harbor主机的证书申请
  4. [root@Docker01 build]# openssl req -sha512 -new \
  5. -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.koten.com" \
  6. -key server/harbor.koten.com.key \
  7. -out server/harbor.koten.com.csr
  8. #3、生成x509 v3扩展文件
  9. [root@Docker01 build]# cat > server/v3.ext <<-EOF
  10. authorityKeyIdentifier=keyid,issuer
  11. basicConstraints=CA:FALSE
  12. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  13. extendedKeyUsage = serverAuth
  14. subjectAltName = @alt_names
  15. [alt_names]
  16. DNS.1=koten.com
  17. DNS.2=koten
  18. DNS.3=harbor.koten.com
  19. EOF
  20. #4、使用v3.ext给harbor主机签发证书
  21. [root@Docker01 build]# openssl x509 -req -sha512 -days 3650 \
  22. -extfile server/v3.ext \
  23. -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
  24. -in server/harbor.koten.com.csr \
  25. -out server/harbor.koten.com.crt
  26. #5、将crt文件转换为cert客户端证书文件
  27. [root@Docker01 build]# openssl x509 -inform PEM -in server/harbor.koten.com.crt -out server/harbor.koten.com.cert
  28. #提示:docker程序认为"*.crt"文件是CA证书文件,"*.cert"客户端证书文件,于是上面需要转换一下,其实使用cp一下也是可以的,内容并没有变化。

3、配置harbor服务器使用证书

  1. #1、修改harbor的配置文件
  2. [root@Docker01 build]# cat /koten/softwares/harbor/harbor.yml
  3. ......
  4. hostname: harbor.koten.com
  5. ......
  6. certificate: /koten/softwares/harbor/certs/build/se
  7. rver/harbor.koten.com.crt
  8. private_key: /koten/softwares/harbor/certs/build/se
  9. rver/harbor.koten.com.key
  10. ......
  11. harbor_admin_password: 1
  12. #2、安装harbor服务
  13. [root@Docker01 build]# cd /koten/softwares/harbor && ./install.sh
  14. #提示:如果已经安装harbor服务的话,就不需要重复执行"./install.sh"脚本,仅需执行"./prepare"并搭配"docker-compose down""docker-compose up -d"即可。

此时windows进行hosts解析,浏览器已经可以访问到带证书的链接 

4、客户端配置证书,推荐配置目录,偏于后续维护

  1. [root@Docker01 build]# cp ca/ca.crt server/harbor.koten.com.key server/harbor.koten.com.cert client
  2. [root@Docker01 build]# ll -R
  3. .:
  4. total 0
  5. drwxr-xr-x 2 root root 48 Jun 13 20:57 ca
  6. drwxr-xr-x 2 root root 77 Jun 13 21:38 client
  7. drwxr-xr-x 2 root root 133 Jun 13 20:58 server
  8. ./ca:
  9. total 12
  10. -rw-r--r-- 1 root root 2021 Jun 13 20:55 ca.crt
  11. -rw-r--r-- 1 root root 3243 Jun 13 20:54 ca.key
  12. -rw-r--r-- 1 root root 17 Jun 13 20:57 ca.srl
  13. ./client:
  14. total 12
  15. -rw-r--r-- 1 root root 2021 Jun 13 21:38 ca.crt
  16. -rw-r--r-- 1 root root 2094 Jun 13 21:38 harbor.koten.com.cert
  17. -rw-r--r-- 1 root root 3243 Jun 13 21:38 harbor.koten.com.key
  18. ./server:
  19. total 20
  20. -rw-r--r-- 1 root root 2094 Jun 13 20:58 harbor.koten.com.cert
  21. -rw-r--r-- 1 root root 2094 Jun 13 20:57 harbor.koten.com.crt
  22. -rw-r--r-- 1 root root 1712 Jun 13 20:56 harbor.koten.com.csr
  23. -rw-r--r-- 1 root root 3243 Jun 13 20:56 harbor.koten.com.key
  24. -rw-r--r-- 1 root root 263 Jun 13 20:57 v3.ext

5、将客户端证书拷贝到需要登录harbor服务器的节点上

  1. #1、创建自定义域名的证书存放路径,注意以域名命名
  2. [root@Docker02 ~]# mkdir -p /etc/docker/certs.d/harbor.koten.com
  3. #2、拷贝证书文件
  4. [root@Docker01 build]# scp client/* 10.0.0.202:/etc/docker/certs.d/harbor.koten.com
  5. #3、将不安全访问的域名在配置文件里删除,以保证能使用https
  6. [root@Docker02 ~]# cat /etc/docker/daemon.json
  7. {
  8. "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
  9. }
  10. [root@Docker02 ~]# systemctl restart docker
  11. #4、客户端登录验证
  12. [root@Docker02 ~]# docker login -u admin -p 1 harbor.koten.com
  13. WARNING! Using --password via the CLI is insecure. Use --password-stdin.
  14. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  15. Configure a credential helper to remove this warning. See
  16. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  17. Login Succeeded
  18. #注意:Error response from daemon: Get "https://harbor.koten.com/v2/": x509: certificate signed by unknown authority
  19. #此报错说明证书是自签证书,需要单独配置信任。

Harbor高可用

我们解决harbor的单点问题,实现高可用,一般有两种办法,一种是两个服务器里只有harbor,数据目录单独放在一台服务器,用nfs挂载到两台harbor服务器,再起一台服务器做nfs的备份数据库,定时备份数据;另一种是两个一模一样的harbor,两个数据目录。做主从复制,一台宕机,另一台可以立即启用。

一、Harbor共享储存目录高可用方案

1、两个节点安装harbor,同步harbor数据

  1. [root@Docker01 softwares]# pwd
  2. /koten/softwares
  3. [root@Docker01 softwares]# scp -r harbor 10.0.0.202:`pwd`
  4. [root@Docker01 softwares]# scp -r /data/ 10.0.0.202:/
  5. [root@Docker02 ~]# cd /koten/softwares/harbor/
  6. [root@Docker02 harbor]# ./install.sh

2、所有节点安装nfs服务

centos201、centos202、centos203(nfs服务端)

  1. [root@Docker01 ~]# yum -y install nfs-utils
  2. [root@Docker02 ~]# yum -y install nfs-utils
  3. [root@Docker03 ~]# yum -y install nfs-utils

3、nfs服务端配置nfs共享

  1. [root@Docker03 ~]# mkdir -p /koten/harbor
  2. [root@Docker03 ~]# cat > /etc/exports <<'EOF'
  3. /koten/harbor *(rw,no_root_squash)
  4. EOF

4、配置nfs服务开机自启动

[root@Docker03 ~]# systemctl enable --now nfs

5、NFS服务端检查NFS暴露信息

  1. [root@Docker03 ~]# exportfs
  2. /koten/harbor <world>

6、客户端节点手动挂载测试,完成数据的拷贝

  1. [root@Docker01 ~]# mount -t nfs 10.0.0.203:/koten/harbor /data/
  2. [root@Docker01 ~]# echo 'mount -t nfs 10.0.0.203:/koten/harbor /data/' >> /etc/rc.local
  3. [root@Docker01 ~]# chmod +x /etc/rc.d/rc.local
  4. [root@Docker02 ~]# mount -t nfs 10.0.0.203:/koten/harbor /data/
  5. [root@Docker02 ~]# echo 'mount -t nfs 10.0.0.203:/koten/harbor /data/' >> /etc/rc.local
  6. [root@Docker02 ~]# chmod +x /etc/rc.d/rc.local

7、安装keepalived

  1. [root@Docker01 ~]# yum -y install keepalived
  2. [root@Docker02 ~]# yum -y install keepalived

8、配置keepalived,实现VIP飘逸

  1. [root@Docker01 ~]# cat > /etc/keepalived/keepalived.conf <<EOF
  2. global_defs {
  3. router_id 201
  4. }
  5. vrrp_instance VI_1 {
  6. state MASTER
  7. interface ens33
  8. virtual_router_id 50
  9. priority 150
  10. advert_int 1
  11. authentication {
  12. auth_type PASS
  13. auth_pass 1111
  14. }
  15. virtual_ipaddress {
  16. 10.0.0.250
  17. }
  18. }
  19. EOF
  20. [root@Docker01 ~]# systemctl enable --now keepalived
  21. [root@Docker02 ~]# cat > /etc/keepalived/keepalived.conf <<EOF
  22. global_defs {
  23. router_id 202
  24. }
  25. vrrp_instance VI_1 {
  26. state BACKUP
  27. interface ens33
  28. virtual_router_id 50
  29. priority 100
  30. advert_int 1
  31. authentication {
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress {
  36. 10.0.0.250
  37. }
  38. }
  39. EOF
  40. [root@Docker02 ~]# systemctl enable --now keepalived

 9、检查节点vip是否会飘

一开始在docker01,关闭docker01的keepalived,发现飘到了docker02,由于我们配置的是抢占时的keepalived,所以再次启用keepalived,vip会飘回来

  1. [root@Docker01 ~]# ip a|grep 250
  2. inet 10.0.0.250/32 scope global ens33
  3. [root@Docker02 ~]# ip a|grep 250
  4. [root@Docker01 ~]# systemctl stop keepalived
  5. [root@Docker02 ~]# ip a|grep 250
  6. inet 10.0.0.250/32 scope global ens33
  7. [root@Docker01 ~]# ip a|grep 250
  8. [root@Docker01 ~]# systemctl start keepalived
  9. [root@Docker01 ~]# ip a|grep 250
  10. inet 10.0.0.250/32 scope global ens33
  11. [root@Docker02 ~]# ip a|grep 250

10、修改windows的hosts解析,可以访问到harbor,若访问不到,可以重复下关闭开启keepalived的动作

10.0.0.250 harbor.koten.com

11、后续可以准备一台备份服务器,专门定时备份NFS的数据 

1、小插曲:scp报错解决方案

scp报一堆错误,可能是因为指纹发生了变化,执行ssh-keygen -R 10.0.0.202,后面可以跟IP也可以跟主机名,解决。

  1. [root@Docker01 softwares]# scp -r harbor 10.0.0.202:`pwd`
  2. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  3. @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
  4. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  5. IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  6. Someone could be eavesdropping on you right now (man-in-the-middle attack)!
  7. It is also possible that a host key has just been changed.
  8. The fingerprint for the ECDSA key sent by the remote host is
  9. SHA256:/oLW3vMiEm7Y9Dwi9K0pRyxF/ZBofuL2w7v6iroHJJI.
  10. Please contact your system administrator.
  11. Add correct host key in /root/.ssh/known_hosts to get rid of this message.
  12. Offending ECDSA key in /root/.ssh/known_hosts:1
  13. ECDSA host key for 10.0.0.202 has changed and you have requested strict checking.
  14. Host key verification failed.
  15. lost connection
  16. [root@Docker01 softwares]# ssh-keygen -R 10.0.0.202
  17. # Host 10.0.0.202 found: line 1
  18. /root/.ssh/known_hosts updated.
  19. Original contents retained as /root/.ssh/known_hosts.old

二、Harbor主从复制及高可用方案

1、我们恢复之前的模式,还是两台主机各用各的数据目录,取消挂载即可,还可以利用之前的keepalived高可用

  1. [root@Docker01 ~]# umount /data
  2. [root@Docker02 ~]# umount /data

2、用10.0.0.201登录,在web界面创建仓库管理 

此时我们测试目标链接一直链接不通,可能是配置文件没改hostname,可以尝试下用不同域名,也可能是因为自建证书的问题

修改主机名,注释https的内容并重启harbor

  1. [root@Docker01 harbor]# cat harbor.yml
  2. ......
  3. hostname: 10.0.0.201 #docker02修改为10.0.0.202
  4. ......
  5. # https related config
  6. #https:
  7. # # https port for harbor, default is 443
  8. # port: 443
  9. # # The path of cert and key files for nginx
  10. # certificate: /koten/softwares/harbor/certs/offici
  11. al/www.koten.vip.crt
  12. # private_key: /koten/softwares/harbor/certs/offici
  13. al/www.koten.vip.key
  14. ......
  15. [root@Docker01 harbor]# ./prepare
  16. [root@Docker01 harbor]# docker-compose down
  17. [root@Docker01 harbor]# docker-compose up -d

输入用户名和密码显示不正确,我们用无痕模式打开 

无痕模式成功登录,测试可以链接

新建复制管理,新建规则 

根据需求选择想要复制的规则

在202删除之前创建的koten-test项目,但是201还有,我们等待一分钟,发现项目被成功推送至202 

其他用法与上面类似,这样就实现了我们的主从复制,配合keepalive的高可用一起使用

注意此处有坑,做docker-registry定时迁移到harbor的时候(其实是harbor向docker-registry拉取),将镜像打到docker-registry,但是打标签并没有按照域名/项目/镜像名的格式打,导致harbor迁移不过来,重新打了镜像,恢复了迁移

镜像推送

如果不搭建harbor,我们也可以把镜像推送到其他的地方。

一、推送至docker hub官方仓库

最近的docker hub官网遭到了DNS污染,无法正常访问了,所以不再详细列举流程,只介绍大概。

注册-->登录-->创建项目,选择是否公开项目,公开了所有人都可以拉取-->会提供给你push的代码-->用docker hub的账号密码在linux终端登录-->运行它给的代码进行push-->推送成功后退出hub的登录-->在官网点进镜像,可以看到我们写的dockerfile,可以删除项目,也可以复制拉取代码-->其他用户可以直接拉取,无需登录官网

这个流程总感觉类似于gitlab,又是拉取,又是推动的,涉及web界面的多点就好了,连推送拉取的代码,人家都在界面上写好了

二、推送至阿里云镜像

harbor除了推送给harbor节点,还可以与很多hub仓库互通,我这里列举下推送至阿里云镜像

上面有很多镜像可以供我们使用 

我们也可以把它当做仓库,把自己镜像推送上去,我这边创建个人版实例给大家展示

 

命名空间随机起,仓库名称一般是项目的名字哈,我这边随意

有很多代码源可以选择,我们在Linux终端上传,选择本地仓库即可 

镜像仓库里,基本信息里有代码可以供我们推送和拉取 

  1. [root@Docker01 ~]# docker login --username=admin registry.cn-hangzhou.aliyuncs.com
  2. Password:
  3. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  4. Configure a credential helper to remove this warning. See
  5. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  6. Login Succeeded
  7. [root@Docker01 ~]# docker tag nginx:1.14.2 registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
  8. [root@Docker01 ~]# docker push registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
  9. The push refers to repository [registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse]
  10. 82ae01d5004e: Pushed
  11. b8f18c3b860b: Pushed
  12. 5dacd731af1b: Pushed
  13. v1.0: digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078 size: 948
  14. [root@Docker01 ~]# docker logout registry.cn-hangzhou.aliyuncs.com
  15. Removing login credentials for registry.cn-hangzhou.aliyuncs.com

推送后可以上传我们的版本 

当然,我们也可以去拉取,虽然是私有的,但是我们可以登录自己的账号拉取,注意账号用完及时删除,不然会很危险!!!存放账号密码的文件只是做了base64的加密!

  1. [root@Docker02 ~]# docker login --username=admin registry.cn-hangzhou.aliyuncs.com
  2. [root@Docker02 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
  3. v1.0: Pulling from kotenspace/kotenwarehouse
  4. Digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078
  5. Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
  6. registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
  7. [root@Docker02 ~]# docker logout registry.cn-hangzhou.aliyuncs.com
  8. Removing login credentials for registry.cn-hangzhou.aliyuncs.com

如果删除仓库,里面的镜像也会随之消失,跟harbor不一样,这个可以直接删外面,harbor需要先删里面的镜像再删外面项目。 

构建海外镜像技巧

github上有一些海外镜像,无法直接拉取使用,此时我们可以在github上编写dockerfile,FROM海外镜像,再用阿里云去拉取我们写的dockerfile并打包成镜像,这样我们的阿里云中就包含了我们的海外镜像。用阿里云的机器帮我们做事情,有点类似于借鸡生蛋!

新建仓库,设置公开-->在界面上直接新建文件,编写dockerfile-->dockerfile上FROM:<我们需要拉取的海外镜像

  1. FROM gcr.io/cadvisor/cadvisor-amd64:v0.47.0
  2. LABEL name=koten

 阿里云创建镜像仓库 

 下一步,代码源选择github,按提示绑定github账号

 再次创建仓库,选择github代码源,此时显示了我们的账号 

选择github的命名空间和仓库,选择海外机器构建,创建镜像仓库

进入镜像仓库,在构建里添加规则 

 

 我们这里选择主分支,因为github我们创建的那个项目上就是主分支

 

立即构建

构建成功 

 此时镜像版本中成功显示,我们就可以正常在阿里云镜像仓库中拉取这个镜像了


我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/878250
推荐阅读
相关标签
  

闽ICP备14008679号