文章目录
- 前言
- 一、Harbor的安装
- 第一步:安装docker
- 第二步:安装docker-compose
- 第三步:安装Harbor
- 二、Harbor登录
- 三、Harbor项目管理
- 第一步:创建项目
- 第二步:推送镜像
- 四、Harbor权限控制
- 五、Harbor自动清理多余的镜像
- 手动清理
- 自动清理
- 总结
前言
我们在使用docker时,镜像下载会默认到dockerHub上去下载。我们也可以将自己的应用发布到dockerHub上,但是dockerHub上都是公有镜像,任何人都可以下载。dockerHub上普通用户只能创建一个私有项目,创建多个是需要付费的。如果我们的项目需要私有化,那么使用Harbor可以来完成,而且Harbor是开源免费的。
关于如何将自己的项目打包成docker镜像并上传到dockerHub,可以参照我的文章【maven插件docker-maven-plugin打包镜像并发布到dockerHub】
下面来介绍Harbor的安装和基本的操作使用。
一、Harbor的安装
首先,的运行要依赖docker和docker-compose。如果已安装这两个组件可以直接到第三步
第一步:安装docker
这里为了方便我整理一个脚本,内容如下:
Centos/Redhat/Oracle系列脚本:
#!/bin/sh
echo '删除系统自带docker'
yum remove -y docker \docker-client \docker-client-latest \docker-ce-cli \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engineecho '安装docker依赖'
yum install -y yum-utils device-mapper-persistent-data lvm2echo '配置阿里云docker源'
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoecho '安装最新docker'
yum install -y docker-ceecho 'docker开机启动'
systemctl enable dockerecho '启动docker'
systemctl start dockerecho 'docker国内源替换(可选)'
echo -e '{"registry-mirrors": ["https://dockerhub.azk8s.cn","https://reg-mirror.qiniu.com","https://registry.docker-cn.com"],"exec-opts": ["native.cgroupdriver=systemd"]}' > /etc/docker/daemon.jsonecho '重新加载docker配置文件'
systemctl daemon-reloadecho '重启docker'
systemctl restart docker
Ubuntu/Debian系列安装脚本:
#!/bin/sh
echo '删除系统自带docker'
sudo apt-get remove -y docker \docker-client \docker-client-latest \docker-ce-cli \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine
echo '更新 apt-get'
sudo apt-get updateecho '安装docker依赖'
sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg-agent \software-properties-common -yecho '添加key'
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -echo '添加库下载地址'
sudo add-apt-repository \"deb [arch=amd64] https://download.docker.com/linux/ubuntu \$(lsb_release -cs) \stable"echo '安装最新docker'
sudo apt-get install docker.io -yecho 'docker开机启动'
sudo systemctl enable dockerecho '启动docker'
sudo systemctl start dockerecho 'docker国内源替换(可选)'
sudo echo -e '{"registry-mirrors": ["https://dockerhub.azk8s.cn","https://reg-mirror.qiniu.com","https://registry.docker-cn.com"],"exec-opts": ["native.cgroupdriver=systemd"]}' > /etc/docker/daemon.jsonecho '重新加载docker配置文件'
sudo systemctl daemon-reloadecho '重启docker'
sudo systemctl restart docker
第二步:安装docker-compose
sudo curl -# -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
第三步:安装Harbor
Harbor官网地址点击这里,查看releases列表,我们选择最新的:v2.10.0 Latest
这里有离线版本和在线版本,如果你服务器网络不错可以选择在线版本,这里我们选择离线版本。
快捷下载地址:
离线版本
在线版本
下载完成后并上传到服务器。
解压:
tar -xzvf harbor-offline-installer-v2.10.0.tgz
设置安装目录,这里我们安装到/usr/local目录下
mv harbor /usr/local/
进入目录:
cd /usr/local/harbor/
查看文件:
ls
common.sh harbor.v2.10.0.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
复制配置文件:
cp harbor.yml.tmpl harbor.yml
修改配置文件:
vim harbor.yml
- 修改hostname。这里我们改成IP:hostname: 192.168.101.170
- 修改http.端口,这里我们改成2280。http.port: 2280
- 注释掉HTTPS的配置,如果要使用,可以使用另外的NGINX来替代。
- 修改管理员密码,默认值:harbor_admin_password: Harbor12345
- 修改docker挂载目录,这里根据需要来修改。data_volume: /harbordata
然后运行prepare:
./prepare
运行完毕后执行安装:
./install.sh
如果有如下信息输出表示安装成功并启动:
[+] Running 9/10⠼ Network harbor_harbor Created 3.5s ✔ Container harbor-log Started 0.7s ✔ Container redis Started 1.2s ✔ Container harbor-db Started 1.4s ✔ Container registryctl Started 1.5s ✔ Container harbor-portal Started 1.3s ✔ Container registry Started 1.5s ✔ Container harbor-core Started 2.6s ✔ Container nginx Started 3.1s ✔ Container harbor-jobservice Started 3.0s
✔ ----Harbor has been installed and started successfully.----
使用docker检查:
docker ps
二、Harbor登录
安装成功后,我们便可以访问,上面我们监听的端口是2280,所以使用http://ip:2280直接访问:
默认管理员:admin
默认密码(harbor_admin_password配置):Harbor12345
登录后可以进行一些偏好设置,如修改主题,修改密码等操作:
三、Harbor项目管理
Harbor以项目为单位来管理镜像,一个项目可以包含多个镜像,下面我们来演示创建一个项目并推送镜像
第一步:创建项目
我们创建一个libs的项目,我们可以把一些常用的固定版本的公共镜像放进去,方便我们使用。
这个项目默认是私有的,点击项目可以查看操作详情:
第二步:推送镜像
- 这里我们找一个redis的镜像推送到我们的私有库。
docker pull redis:5.0.7
- 然后根据下面的命令进行重新命名:
docker tag SOURCE_IMAGE[:TAG] 8.137.81.52:2280/libs/REPOSITORY[:TAG]
SOURCE_IMAGE[:TAG] 表示源镜像
REPOSITORY[:TAG] 表示推送后的镜像
我们使用如下命令:
docker tag redis:5.0.7 8.137.81.52:2280/libs/myredis:5.0.7
- 登录harbor
docker login http://8.137.81.52:2280
输入用户名admin和密码,发现会报错误:
Error response from daemon: Get "https://8.137.81.52:2280/v2/": http: server gave HTTP response to HTTPS client
意思是本来是http的协议,结果客户端需要时HTTPS的返回。如果要添加docker登录HTTP协议,需要修改docker配置:
vim /etc/docker/daemon.json
在配置中加入:
"insecure-registries": ["http://8.137.81.52:2280"]
重启docker生效:
systemctl daemon-reload && systemctl restart docker
然后在登录,运行结果如下:
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-storeLogin Succeeded
登录成功
- 推送到Harbor仓库
docker push 8.137.81.52:2280/libs/myredis:5.0.7
查看结果:
说明已经成功推送到harbor了
四、Harbor权限控制
在上面的示例中,我们使用admin,我们可以专门来创建一些用户来进行不同的管理
这里我们创建一个test用户
然后回到项目点击项目详情:
点击添加用户
选择不同的角色
- 项目管理员 项目的最高权限,拥有项目的一切操作
- 维护人员 扫描镜像、查看复制作业以及删除镜像的能力
- 开发者 拥有项目的读写权限
- 访客 只读权限。可以拉取和重新标记镜像,但不能推送。
- 受限访客 不完全读取权限。可以拉取镜像但不能推送,看不到日志或项目的其他成员。
上面我们创建一个test用户,并设置为受限访客,下面我们来测试这个用户的使用。
回到我们自己的电脑,然后再登录docker
我们先不登录,直接拉取镜像:
docker pull 8.137.81.52:2280/libs/myredis:5.0.7
这样会返回如下错误:
Error response from daemon: unauthorized: unauthorized to access repository: libs/myredis, action: pull: unauthorized to access repository: libs/myredis, action: pull
说明需要登录才能拉取我们的镜像
下面我们使用test用户登录
docker login http://8.137.81.52:2280
如果还是报Error response from daemon: Get “https://8.137.81.52:2280/v2/”:的错误,请修改我们本地的docker配置
这时我们要输入test用户:
然后我们pull刚才的镜像:
docker pull 8.137.81.52:2280/libs/myredis:5.0.7
结果:
拉取成功
五、Harbor自动清理多余的镜像
我们在平常的开发中,可能会生成很多版本的镜像,如果是Java程序每个镜像一般都是几百M,需要的硬盘资源很大,特别是在开发环境下,版本迭代非常快,时间久了,一些很早的版本就完全没用了,直接清理掉以释放硬盘资源。
手动清理
这种方式需要人工“智能”,手动去筛选需要清理的无用镜像,操作如下所示:
自动清理
在项目中使用策略来控制
添加规则:
上面我们只保留最近推送的5个版本的镜像,还可以进行匹配操作,大家可以根据自身情况进行配置。
添加定时任务来执行,这样就可以保证会自动清理掉那些不需要的镜像文件。
总结
Harbor作为docker私有镜像库来使用还是不错的,而且运行时内存和CPU的占用都还能过得去,当然也还可以对Harbor的组件进行优化处理,比如使用外部的数据库和Redis,这样还能减少资源的占用,大家可以自行研究。