一、Harbor简介
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
Harbor特性:
1.基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
2.图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
3.AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
4.RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
5.部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
二、Harbor组件
Harbor在架构上主要由6个组件构成:
Proxy
:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry
: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services
: 这是Harbor的核心功能,主要提供以下服务:
UI
:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务
:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database
:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services
:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector
:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
各个组件之间的关系如下图所示:
三、安装Harbor
- 前置条件
安装Harbor需要先安装docker 17.06.0+
和docker-compose
。
python3.6 并且安装:
[root@localhost]# yum install python3
[root@localhost]# update-alternatives --config python
[root@localhost]# pip3 install Flask
# 查看Docker安装,必须为17.06+
[root@localhost ~]# docker version
# 运行docker服务
[root@localhost]# systemctl start docker
# 重启Docker
[root@localhost]# systemctl restart docker
# 设置Docker开机自启
[root@localhost]# systemctl enable docker
# 查看Docker系统信息,包括镜像和容器数
[root@localhost]# docker info
- 下载安装包
官网:https://goharbor.io/
有两个包Harbor offline installer 和 Harbor online installer,两者的区别的是 Harbor offline installer 里就包含的 Harbor 需要使用的镜像文件。
# 下载
[root@localhost ~]# wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.1.tgz
# 安装
[root@localhost ~]# tar -zxvf harbor-offline-installer-v1.9.1.tgz -C /usr/local/
harbor/harbor.v1.9.1.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/harbor.yml
harbor.v1.9.1.tar.gz里就是 Harbor 用到的镜像。
四、编辑配置文件
- 配置文件为:/usr/local/harbor/harbor.yml
配置的内容为:
[root@localhost ~]# vi /usr/local/harbor/harbor.yml
# 修改 hostname 选项
hostname: 192.168.247.130
# 修改端口
port: 8388
- 配置免https
# 修改 /etc/docker/daemon.json
vi /etc/docker/daemon.json
# 加上 允许的仓库
{
"insecure-registries":[
"192.168.247.130:8388"
]
}
五、运行
- 安装运行
# 更新配置文件
[root@localhost ~]# cd /usr/local/harbor/
[root@localhost harbor]# ./prepare
prepare base dir is set to /usr/local/harbor
Unable to find image 'goharbor/prepare:v1.9.1' locally
Trying to pull repository docker.io/goharbor/prepare ...
v1.9.1: Pulling from docker.io/goharbor/prepare
a1fd40743af1: Pull complete
5fe2fbac9b11: Pull complete
8d43177d2a4c: Pull complete
557de2fd72ae: Pull complete
947583f1d6b6: Pull complete
77e6da92f0c8: Pull complete
d90d4c01ca3e: Pull complete
# 安装并启动
[root@localhost harbor]# ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 18.03.1
Note: docker-compose version: 1.24.1
[Step 1]: loading Harbor images ...
# 在harbor 目录中执行docker-compose 停止:docker-compose stop
[root@localhost harbor]# docker-compose up -d
harbor-log is up-to-date
registry is up-to-date
harbor-portal is up-to-date
registryctl is up-to-date
harbor-db is up-to-date
redis is up-to-date
harbor-core is up-to-date
nginx is up-to-date
harbor-jobservice is up-to-date
- 浏览器中访问测试
http://192.168.247.130:8388
默认账号:admin
默认密码: Harbor12345
六、测试上传和下载镜像
- 登录
# 重启docker
[root@localhost harbor]# systemctl daemon-reload
[root@localhost harbor]# systemctl restart docker.service
# 重启harbor
[root@localhost harbor]# docker-compose stop
Stopping nginx ... done
Stopping harbor-jobservice ... done
Stopping harbor-core ... done
Stopping harbor-db ... done
Stopping harbor-portal ... done
Stopping registryctl ... done
Stopping redis ... done
Stopping registry ... done
Stopping harbor-log ... done
[root@localhost harbor]# docker-compose up -d
Starting harbor-log ... done
Starting harbor-db ... done
Starting registry ... done
Starting harbor-portal ... done
Starting redis ... done
Starting registryctl ... done
Starting harbor-core ... done
Starting harbor-jobservice ... done
Starting nginx ... done
# 登录
[root@localhost harbor]# docker login 192.168.247.130:8388
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
Error response from daemon: Get https://192.168.247.130:8388/v2/: http: server gave HTTP response to HTTPS client
修改:修改/etc/docker/daemon.json,参见配置免https。
出现这问题的原因是:Docker自从1.3.X之后docker registry交互默认使用的是HTTPS,但是搭建私有镜像默认使用的是HTTP服务,所以与私有镜像交时出现以上错误。
-
新建项目
新建一个项目,命名为 xtsz,并设置访问级别为公开。
前置条件: 必须登录
- 查看镜像
# 查看镜像
[root@localhost ~]# docker images
# 拉取镜像Docker Hub
[root@localhost ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8d691f585fa8: Already exists
047cb16c0ff6: Pull complete
b0bbed1a78ca: Pull complete
Digest: sha256:77ebc94e0cec30b20f9056bac1066b09fbdc049401b71850922c63fc0cc1762e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
- 镜像打标签
# docker tag 镜像名:标签 私服地址/仓库项目名/镜像名:标签
# 修改待上传镜像的tag,必须
[root@localhost ~]# docker tag nginx:latest 192.168.247.130:8388/xtsz/nginx:latest
说明:
192.168.247.130:8388 :私有hub域名
common :项目名称
nginx :镜像名称
latest :镜像版本号
- 上传镜像
推送到私服的命令
# docker push 私服地址/仓库项目名/镜像名:标签
[root@localhost ~]# docker push 192.168.247.130:8388/xtsz/nginx:latest
The push refers to repository [192.168.247.130:8388/xtsz/nginx]
cf2436e84ea8: Pushed
ed4a4820ee08: Pushed
b67d19e65ef6: Pushed
latest: digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44 size: 948
[root@localhost ~]# docker rmi 192.168.247.130:8388/xtsz/nginx
Untagged: 192.168.247.130:8388/xtsz/nginx:latest
Untagged: 192.168.247.130:8388/xtsz/nginx@sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5a9061639d0a 32 hours ago 126MB
httpd latest 66a97eeec7b8 34 hours ago 154MB
goharbor/chartmuseum-photon v0.9.0-v1.9.1 0aa7451af9b8 3 weeks ago 131MB
goharbor/harbor-migrator v1.9.1 a83f1be1ec94 3 weeks ago 362MB
- 下载镜像
从私服拉取镜像的命令
# docker pull 私服地址/仓库项目名/镜像名:标签
[root@localhost ~]# docker pull 192.168.247.130:8388/xtsz/nginx
Using default tag: latest
latest: Pulling from xtsz/nginx
Digest: sha256:224f1b76ad5d6d5878c2dccba5b3dcc8e9a263ff04efdf0f8e0ef8f68c208a44
Status: Downloaded newer image for 192.168.247.130:8388/xtsz/nginx:latest
192.168.247.130:8388/xtsz/nginx:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.247.130:8388/xtsz/nginx latest 5a9061639d0a 32 hours ago 126MB
nginx latest 5a9061639d0a 32 hours ago 126MB
httpd latest 66a97eeec7b8 34 hours ago 154MB
七、常见问题:
PermissionError: [Errno 13] Permission denied: '/config/log'
导致原因:py脚本在写入数据时打开了文件导致写入终止。
此错误可以不处理,主要是没有安装Python3.6。✖ Need to install docker-compose(1.18.0+) by yourself first and run this script again.
官网:https://github.com/docker/compose/releases
# 安装docker-compose
[root@localhost harbor]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@localhost harbor]# chmod +x /usr/local/bin/docker-compose
[root@localhost harbor]# docker-compose --version
docker-compose version 1.24.1, build 4667896b
- 镜像加速
# 添加镜像配置
[root@localhost harbor]# vi /etc/docker/daemon.json
# 内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/","https://mirror.ccs.tencentyun.com"]
}
# 重启docker
[root@localhost harbor]# sudo systemctl restart docker
- linux切换python版本
[root@localhost]# yum install python3 -y
[root@localhost]# sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2
[root@localhost]# sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 1
# 显示python版本
[root@localhost]# update-alternatives --display python
python - status is auto.
link currently points to /usr/bin/python2.7
/usr/bin/python2.7 - priority 2
/usr/bin/python3.6 - priority 1
Current `best' version is /usr/bin/python2.7.
# 切换版本
[root@localhost]# update-alternatives --config python
There are 2 programs which provide 'python'.
Selection Command
-----------------------------------------------
*+ 1 /usr/bin/python2.7
2 /usr/bin/python3.6
Enter to keep the current selection[+], or type selection number: 2
- File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
这是因为yum采用python作为命令解释器,原来系统自带的python解释器为python2.7,然后我之前为了方便将python默认的解释器设为了python3.6,导致按python3.6解析2.7的语法出错了。
[root@localhost harbor]# update-alternatives --config python
There are 2 programs which provide 'python'.
Selection Command
-----------------------------------------------
* 1 /usr/bin/python2.7
+ 2 /usr/bin/python3.6
Enter to keep the current selection[+], or type selection number: 1
Need to upgrade docker package to 17.06.0+.
# 卸载原来的docker
[root@localhost ~]# yum remove docker*
root@localhost]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost]# sudo yum install docker-ce docker-ce-cli containerd.io
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 19.03.4-rc1
API version: 1.40
Go version: go1.12.10
Git commit: 4ba2b1c606
Built: Mon Oct 14 21:34:38 2019
OS/Arch: linux/amd64
Experimental: false
Cannot connect to the Docker daemon at tcp://0.0.0.0:2375. Is the docker daemon running?
- No package dacker available. Error: Nothing to do
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
- WARNING: IPv4 forwarding is disabled. Networking will not work.
Traceback (most recent call last):
[root@localhost]# vi /usr/lib/sysctl.d/00-system.conf
追加
net.ipv4.ip_forward=1
[root@localhost]# systemctl restart network