准备环境
软件版本信息
操作系统:
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仓库
文章评论