本篇文章继续介绍Docker内容,包含Harbor配置HTTPS证书的两种方式(阿里云官方证书与自建证书),Harbor两种方案实现高可用(共享存储目录与主从复制),镜像推送至Docker hub官方仓库和阿里云镜像仓库及拉取海外镜像技巧。
目录
Harbor配置HTTPS
一、配置阿里云官方证书
二、配置自建证书
Harbor高可用
一、Harbor共享储存目录高可用方案
1、小插曲:scp报错解决方案
二、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
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 < /etc/keepalived/keepalived.conf <
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年运维经验,持续分享运维干货,感谢大家的阅读和关注!