赞
踩
本篇文章继续介绍Docker内容,包含Harbor配置HTTPS证书的两种方式(阿里云官方证书与自建证书),Harbor两种方案实现高可用(共享存储目录与主从复制),镜像推送至Docker hub官方仓库和阿里云镜像仓库及拉取海外镜像技巧。
目录
参考官网链接:https://goharbor.io/docs/2.8.0/
1、在阿里云申请免费的证书并下载下来
观察harbor配置文件,发现需要下载cert和key
- [root@Docker01 ~]# cat -n /koten/softwares/harbor/harbor.yml
- ......
- 17 # certificate: /your/certificate/path
- 18 # private_key: /your/private/key/path
- ......
2、将证书和key放入harbor下的目录,然后在配置文件里修改下路径,重启harbor
- [root@Docker01 harbor]# cd /koten/softwares/harbor/
- [root@Docker01 harbor]# mkdir -p certs/official
- [root@Docker01 harbor]# cd certs/official
- [root@Docker01 official]# ls
- www.koten.vip.key www.koten.vip_public.crt
- [root@Docker01 official]# cd ../../
- [root@Docker01 harbor]# cat harbor.yml
- ......
- hostname: www.koten.vip
- ......
- https:
- # # https port for harbor, default is 443
- port: 443
- # # The path of cert and key files for nginx
- certificate: /koten/softwares/harbor/certs/official/www.koten.vip_public.crt #最好是写绝对路径
- private_key: /koten/softwares/harbor/certs/official/www.koten.vip.key
- ......
- [root@Docker01 harbor]# ./install.sh
修改linux和windows的hosts文件
10.0.0.201 www.koten.vip
浏览器访问成功显示HTTPS证书
Linux作为客户端登录会提示缺少证书认证(有的时候官方的证书不提示),我们需要把证书和秘钥放到/etc/docker/certs.d/www.koten.vip下就可以了
- [root@Docker01 harbor]# docker login www.koten.vip
- Username: admin
- Password:
- Error response from daemon: Get "https://www.koten.vip/v2/": x509: certificate signed by unknown authority
- [root@Docker01 harbor]# mkdir -p /etc/docker/certs.d/www.koten.vip
- [root@Docker01 harbor]# cp certs/official/www.koten.vip_public.crt /etc/docker/certs.d/www.koten.vip/www.koten.vip.cert #注意此处更名
- [root@Docker01 harbor]# cp certs/official/www.koten.vip.key /etc/docker/certs.d/www.koten.vip/
- [root@Docker01 harbor]# docker login www.koten.vip
- Username: admin
- Password:
- WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
- Configure a credential helper to remove this warning. See
- https://docs.docker.com/engine/reference/commandline/login/#credentials-store
-
- Login Succeeded
1、生成ca的证书
- #1、创建目录,官方并未要求这样的目录结构,只是方便我们用的时候方便
- [root@Docker01 ~]# mkdir -p /koten/softwares/harbor/certs/build/{ca,server,client}
- [root@Docker01 ~]# cd /koten/softwares/harbor/certs/build/
-
- #2、生成ca私钥
- [root@Docker01 build]# openssl genrsa -out ca/ca.key 4096
-
- #3、生成ca的自签名证书
- [root@Docker01 build]# openssl req -x509 -new -nodes -sha512 -days 3650 \
- -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=koten.com" \
- -key ca/ca.key \
- -out ca/ca.crt
2、生成harbor主机证书
- #1、生成harbor主机的私钥
- [root@Docker01 build]# openssl genrsa -out server/harbor.koten.com.key 4096
-
- #2、生成harbor主机的证书申请
- [root@Docker01 build]# openssl req -sha512 -new \
- -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.koten.com" \
- -key server/harbor.koten.com.key \
- -out server/harbor.koten.com.csr
-
- #3、生成x509 v3扩展文件
- [root@Docker01 build]# cat > server/v3.ext <<-EOF
- authorityKeyIdentifier=keyid,issuer
- basicConstraints=CA:FALSE
- keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
- extendedKeyUsage = serverAuth
- subjectAltName = @alt_names
-
- [alt_names]
- DNS.1=koten.com
- DNS.2=koten
- DNS.3=harbor.koten.com
- EOF
-
- #4、使用v3.ext给harbor主机签发证书
- [root@Docker01 build]# openssl x509 -req -sha512 -days 3650 \
- -extfile server/v3.ext \
- -CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
- -in server/harbor.koten.com.csr \
- -out server/harbor.koten.com.crt
-
- #5、将crt文件转换为cert客户端证书文件
- [root@Docker01 build]# openssl x509 -inform PEM -in server/harbor.koten.com.crt -out server/harbor.koten.com.cert
-
- #提示:docker程序认为"*.crt"文件是CA证书文件,"*.cert"客户端证书文件,于是上面需要转换一下,其实使用cp一下也是可以的,内容并没有变化。
3、配置harbor服务器使用证书
- #1、修改harbor的配置文件
- [root@Docker01 build]# cat /koten/softwares/harbor/harbor.yml
- ......
- hostname: harbor.koten.com
- ......
- certificate: /koten/softwares/harbor/certs/build/se
- rver/harbor.koten.com.crt
- private_key: /koten/softwares/harbor/certs/build/se
- rver/harbor.koten.com.key
- ......
- harbor_admin_password: 1
-
- #2、安装harbor服务
- [root@Docker01 build]# cd /koten/softwares/harbor && ./install.sh
-
- #提示:如果已经安装harbor服务的话,就不需要重复执行"./install.sh"脚本,仅需执行"./prepare"并搭配"docker-compose down"和"docker-compose up -d"即可。
此时windows进行hosts解析,浏览器已经可以访问到带证书的链接
4、客户端配置证书,推荐配置目录,偏于后续维护
- [root@Docker01 build]# cp ca/ca.crt server/harbor.koten.com.key server/harbor.koten.com.cert client
- [root@Docker01 build]# ll -R
- .:
- total 0
- drwxr-xr-x 2 root root 48 Jun 13 20:57 ca
- drwxr-xr-x 2 root root 77 Jun 13 21:38 client
- drwxr-xr-x 2 root root 133 Jun 13 20:58 server
-
- ./ca:
- total 12
- -rw-r--r-- 1 root root 2021 Jun 13 20:55 ca.crt
- -rw-r--r-- 1 root root 3243 Jun 13 20:54 ca.key
- -rw-r--r-- 1 root root 17 Jun 13 20:57 ca.srl
-
- ./client:
- total 12
- -rw-r--r-- 1 root root 2021 Jun 13 21:38 ca.crt
- -rw-r--r-- 1 root root 2094 Jun 13 21:38 harbor.koten.com.cert
- -rw-r--r-- 1 root root 3243 Jun 13 21:38 harbor.koten.com.key
-
- ./server:
- total 20
- -rw-r--r-- 1 root root 2094 Jun 13 20:58 harbor.koten.com.cert
- -rw-r--r-- 1 root root 2094 Jun 13 20:57 harbor.koten.com.crt
- -rw-r--r-- 1 root root 1712 Jun 13 20:56 harbor.koten.com.csr
- -rw-r--r-- 1 root root 3243 Jun 13 20:56 harbor.koten.com.key
- -rw-r--r-- 1 root root 263 Jun 13 20:57 v3.ext
5、将客户端证书拷贝到需要登录harbor服务器的节点上
- #1、创建自定义域名的证书存放路径,注意以域名命名
- [root@Docker02 ~]# mkdir -p /etc/docker/certs.d/harbor.koten.com
-
- #2、拷贝证书文件
- [root@Docker01 build]# scp client/* 10.0.0.202:/etc/docker/certs.d/harbor.koten.com
-
- #3、将不安全访问的域名在配置文件里删除,以保证能使用https
- [root@Docker02 ~]# cat /etc/docker/daemon.json
- {
- "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
- }
- [root@Docker02 ~]# systemctl restart docker
-
- #4、客户端登录验证
- [root@Docker02 ~]# docker login -u admin -p 1 harbor.koten.com
- WARNING! Using --password via the CLI is insecure. Use --password-stdin.
- WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
- Configure a credential helper to remove this warning. See
- https://docs.docker.com/engine/reference/commandline/login/#credentials-store
-
- Login Succeeded
-
- #注意:Error response from daemon: Get "https://harbor.koten.com/v2/": x509: certificate signed by unknown authority
- #此报错说明证书是自签证书,需要单独配置信任。
我们解决harbor的单点问题,实现高可用,一般有两种办法,一种是两个服务器里只有harbor,数据目录单独放在一台服务器,用nfs挂载到两台harbor服务器,再起一台服务器做nfs的备份数据库,定时备份数据;另一种是两个一模一样的harbor,两个数据目录。做主从复制,一台宕机,另一台可以立即启用。
1、两个节点安装harbor,同步harbor数据
- [root@Docker01 softwares]# pwd
- /koten/softwares
- [root@Docker01 softwares]# scp -r harbor 10.0.0.202:`pwd`
- [root@Docker01 softwares]# scp -r /data/ 10.0.0.202:/
-
- [root@Docker02 ~]# cd /koten/softwares/harbor/
- [root@Docker02 harbor]# ./install.sh
2、所有节点安装nfs服务
centos201、centos202、centos203(nfs服务端)
- [root@Docker01 ~]# yum -y install nfs-utils
- [root@Docker02 ~]# yum -y install nfs-utils
- [root@Docker03 ~]# yum -y install nfs-utils
3、nfs服务端配置nfs共享
- [root@Docker03 ~]# mkdir -p /koten/harbor
- [root@Docker03 ~]# cat > /etc/exports <<'EOF'
- /koten/harbor *(rw,no_root_squash)
- EOF
4、配置nfs服务开机自启动
[root@Docker03 ~]# systemctl enable --now nfs
5、NFS服务端检查NFS暴露信息
- [root@Docker03 ~]# exportfs
- /koten/harbor <world>
6、客户端节点手动挂载测试,完成数据的拷贝
- [root@Docker01 ~]# mount -t nfs 10.0.0.203:/koten/harbor /data/
- [root@Docker01 ~]# echo 'mount -t nfs 10.0.0.203:/koten/harbor /data/' >> /etc/rc.local
- [root@Docker01 ~]# chmod +x /etc/rc.d/rc.local
-
- [root@Docker02 ~]# mount -t nfs 10.0.0.203:/koten/harbor /data/
- [root@Docker02 ~]# echo 'mount -t nfs 10.0.0.203:/koten/harbor /data/' >> /etc/rc.local
- [root@Docker02 ~]# chmod +x /etc/rc.d/rc.local
7、安装keepalived
- [root@Docker01 ~]# yum -y install keepalived
- [root@Docker02 ~]# yum -y install keepalived
8、配置keepalived,实现VIP飘逸
- [root@Docker01 ~]# cat > /etc/keepalived/keepalived.conf <<EOF
- global_defs {
- router_id 201
- }
-
- vrrp_instance VI_1 {
- state MASTER
- interface ens33
- virtual_router_id 50
- priority 150
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.250
- }
- }
- EOF
- [root@Docker01 ~]# systemctl enable --now keepalived
-
- [root@Docker02 ~]# cat > /etc/keepalived/keepalived.conf <<EOF
- global_defs {
- router_id 202
- }
-
- vrrp_instance VI_1 {
- state BACKUP
- interface ens33
- virtual_router_id 50
- priority 100
- advert_int 1
- authentication {
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 10.0.0.250
- }
- }
- EOF
- [root@Docker02 ~]# systemctl enable --now keepalived
9、检查节点vip是否会飘
一开始在docker01,关闭docker01的keepalived,发现飘到了docker02,由于我们配置的是抢占时的keepalived,所以再次启用keepalived,vip会飘回来
- [root@Docker01 ~]# ip a|grep 250
- inet 10.0.0.250/32 scope global ens33
-
- [root@Docker02 ~]# ip a|grep 250
-
- [root@Docker01 ~]# systemctl stop keepalived
-
- [root@Docker02 ~]# ip a|grep 250
- inet 10.0.0.250/32 scope global ens33
-
- [root@Docker01 ~]# ip a|grep 250
- [root@Docker01 ~]# systemctl start keepalived
- [root@Docker01 ~]# ip a|grep 250
- inet 10.0.0.250/32 scope global ens33
-
- [root@Docker02 ~]# ip a|grep 250
10、修改windows的hosts解析,可以访问到harbor,若访问不到,可以重复下关闭开启keepalived的动作
10.0.0.250 harbor.koten.com
11、后续可以准备一台备份服务器,专门定时备份NFS的数据
scp报一堆错误,可能是因为指纹发生了变化,执行ssh-keygen -R 10.0.0.202,后面可以跟IP也可以跟主机名,解决。
- [root@Docker01 softwares]# scp -r harbor 10.0.0.202:`pwd`
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
- @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
- Someone could be eavesdropping on you right now (man-in-the-middle attack)!
- It is also possible that a host key has just been changed.
- The fingerprint for the ECDSA key sent by the remote host is
- SHA256:/oLW3vMiEm7Y9Dwi9K0pRyxF/ZBofuL2w7v6iroHJJI.
- Please contact your system administrator.
- Add correct host key in /root/.ssh/known_hosts to get rid of this message.
- Offending ECDSA key in /root/.ssh/known_hosts:1
- ECDSA host key for 10.0.0.202 has changed and you have requested strict checking.
- Host key verification failed.
- lost connection
- [root@Docker01 softwares]# ssh-keygen -R 10.0.0.202
- # Host 10.0.0.202 found: line 1
- /root/.ssh/known_hosts updated.
- Original contents retained as /root/.ssh/known_hosts.old
1、我们恢复之前的模式,还是两台主机各用各的数据目录,取消挂载即可,还可以利用之前的keepalived高可用
- [root@Docker01 ~]# umount /data
- [root@Docker02 ~]# umount /data
2、用10.0.0.201登录,在web界面创建仓库管理
此时我们测试目标链接一直链接不通,可能是配置文件没改hostname,可以尝试下用不同域名,也可能是因为自建证书的问题
修改主机名,注释https的内容并重启harbor
- [root@Docker01 harbor]# cat harbor.yml
- ......
- hostname: 10.0.0.201 #docker02修改为10.0.0.202
- ......
- # https related config
- #https:
- # # https port for harbor, default is 443
- # port: 443
- # # The path of cert and key files for nginx
- # certificate: /koten/softwares/harbor/certs/offici
- al/www.koten.vip.crt
- # private_key: /koten/softwares/harbor/certs/offici
- al/www.koten.vip.key
- ......
- [root@Docker01 harbor]# ./prepare
- [root@Docker01 harbor]# docker-compose down
- [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官网遭到了DNS污染,无法正常访问了,所以不再详细列举流程,只介绍大概。
注册-->登录-->创建项目,选择是否公开项目,公开了所有人都可以拉取-->会提供给你push的代码-->用docker hub的账号密码在linux终端登录-->运行它给的代码进行push-->推送成功后退出hub的登录-->在官网点进镜像,可以看到我们写的dockerfile,可以删除项目,也可以复制拉取代码-->其他用户可以直接拉取,无需登录官网
这个流程总感觉类似于gitlab,又是拉取,又是推动的,涉及web界面的多点就好了,连推送拉取的代码,人家都在界面上写好了
harbor除了推送给harbor节点,还可以与很多hub仓库互通,我这里列举下推送至阿里云镜像
上面有很多镜像可以供我们使用
我们也可以把它当做仓库,把自己镜像推送上去,我这边创建个人版实例给大家展示
命名空间随机起,仓库名称一般是项目的名字哈,我这边随意
有很多代码源可以选择,我们在Linux终端上传,选择本地仓库即可
镜像仓库里,基本信息里有代码可以供我们推送和拉取
- [root@Docker01 ~]# docker login --username=admin registry.cn-hangzhou.aliyuncs.com
- Password:
- WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
- Configure a credential helper to remove this warning. See
- https://docs.docker.com/engine/reference/commandline/login/#credentials-store
-
- Login Succeeded
- [root@Docker01 ~]# docker tag nginx:1.14.2 registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
- [root@Docker01 ~]# docker push registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
- The push refers to repository [registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse]
- 82ae01d5004e: Pushed
- b8f18c3b860b: Pushed
- 5dacd731af1b: Pushed
- v1.0: digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078 size: 948
- [root@Docker01 ~]# docker logout registry.cn-hangzhou.aliyuncs.com
- Removing login credentials for registry.cn-hangzhou.aliyuncs.com
推送后可以上传我们的版本
当然,我们也可以去拉取,虽然是私有的,但是我们可以登录自己的账号拉取,注意账号用完及时删除,不然会很危险!!!存放账号密码的文件只是做了base64的加密!
- [root@Docker02 ~]# docker login --username=admin registry.cn-hangzhou.aliyuncs.com
- [root@Docker02 ~]# docker pull registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
- v1.0: Pulling from kotenspace/kotenwarehouse
- Digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078
- Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
- registry.cn-hangzhou.aliyuncs.com/kotenspace/kotenwarehouse:v1.0
- [root@Docker02 ~]# docker logout registry.cn-hangzhou.aliyuncs.com
- Removing login credentials for registry.cn-hangzhou.aliyuncs.com
如果删除仓库,里面的镜像也会随之消失,跟harbor不一样,这个可以直接删外面,harbor需要先删里面的镜像再删外面项目。
github上有一些海外镜像,无法直接拉取使用,此时我们可以在github上编写dockerfile,FROM海外镜像,再用阿里云去拉取我们写的dockerfile并打包成镜像,这样我们的阿里云中就包含了我们的海外镜像。用阿里云的机器帮我们做事情,有点类似于借鸡生蛋!
新建仓库,设置公开-->在界面上直接新建文件,编写dockerfile-->dockerfile上FROM:<我们需要拉取的海外镜像
- FROM gcr.io/cadvisor/cadvisor-amd64:v0.47.0
-
- LABEL name=koten
阿里云创建镜像仓库
下一步,代码源选择github,按提示绑定github账号
再次创建仓库,选择github代码源,此时显示了我们的账号
选择github的命名空间和仓库,选择海外机器构建,创建镜像仓库
进入镜像仓库,在构建里添加规则
我们这里选择主分支,因为github我们创建的那个项目上就是主分支
立即构建
构建成功
此时镜像版本中成功显示,我们就可以正常在阿里云镜像仓库中拉取这个镜像了
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。