Docker-Harbor
Harbor概述
Harbor是VMware公司开源的企业级Docker Registry项目,相比官方registry提供了更多企业级功能,适合企业内部使用。
Harbor特性
- 基于角色的访问控制(RBAC):用户与Docker镜像仓库通过"项目"进行权限管理,一个用户可以对多个镜像仓库在同一个命名空间(project)里有不同的权限。
- 镜像漏洞扫描:自动扫描镜像中的安全漏洞。
- 图形化用户界面:用户可以通过浏览器来浏览、检索当前Docker镜像仓库,管理项目和命名空间。
- 镜像复制同步:镜像可以在多个Registry实例中复制(同步),尤其适合于负载均衡、高可用、混合云和多云的场景。
- AD/LDAP支持:Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
- 支持Helm Charts:除了Docker镜像外,还支持Helm Charts的存储和管理。
- RESTful API:提供给管理员对于Harbor更多的操控,使得与其它管理软件集成变得更容易。
- 审计日志:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 国际化支持(包括中文):拥有英文、中文、德文、日文和俄文的本地化版本。
Harbor高可用部署
环境准备
| 服务器名称 | IP | 说明 | 操作系统 | 预装软件 |
|---|---|---|---|---|
| nginx | 192.168.148.130 | Nginx负载均衡 | openEuler-24.03(LTS) | Nginx |
| harbor-01 | 192.168.148.131 | Harbor节点 | openEuler-24.03(LTS) | Docker、docker-compose、Harbor |
| harbor-02 | 192.168.148.132 | Harbor节点 | openEuler-24.03(LTS) | Docker、docker-compose、Harbor |
| nfs | 192.168.148.133 | 共享存储 | openEuler-24.03(LTS) | NFS |
| client | 192.168.148.134 | Docker客户端 | openEuler-24.03(LTS) | Docker |
NFS部署
在NFS服务器上操作
bash
# 安装NFS相关软件
dnf install -y nfs-utils rpcbind
# 创建共享目录
mkdir -p /data/harbor
chmod 755 -R /data
chown -R nobody:nobody /data
# 配置NFS共享
echo "/data 192.168.1.0/24(rw,sync,no_root_squash)" > /etc/exports
# 内核优化
cat >> /etc/sysctl.conf <<EOF
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
EOF
sysctl -p # 立即生效
# 启动服务
systemctl enable rpcbind nfs --now
# 检测端口
showmount -e部署Harbor
在harbor-01和harbor-02上操作
挂载NFS
bash
# 安装NFS客户端
dnf install -y nfs-utils
# 配置开机自动挂载
echo "192.168.148.133:/data/harbor /data/harbor nfs defaults,_netdev 0 0" >> /etc/fstab
# 立即挂载
mount -aDocker安装
bash
# 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 替换centos识别版本号
sed -i 's+$releasever+9+' /etc/yum.repos.d/docker-ce.repo
# 安装Docker
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 设置配置文件
cat > /etc/docker/daemon.json << 'EOF'
{
"data-root":"/data/docker",
"bip":"172.18.0.1/16",
"exec-opts":["native.cgroupdriver=systemd"],
"live-restore":true,
"ipv6": false
}
EOF
# 重新加载配置并启动Docker
systemctl daemon-reload
systemctl start dockerHarbor安装
bash
# 下载Harbor安装包
wget https://github.com/goharbor/harbor/releases/download/v2.13.0/harbor-offline-installer-v2.13.0.tgz
# 解压到指定目录
tar -xvf harbor-offline-installer-v2.13.0.tgz -C /usr/local
# 进入Harbor目录
cd /usr/local/harbor
# 复制配置文件模板
cp harbor.yml.tmpl harbor.yml
# 编辑配置文件
vim harbor.yml
# 修改以下配置:
# hostname: 192.168.148.131 # 本地地址
# # 注释 https 模块
# #https:
# # https port for harbor, default is 443
# # port: 443
# # The path of cert and key files for nginx
# # certificate: /your/certificate/path
# # private_key: /your/private/key/path
# harbor_admin_password: Harbor12345 # 登录密码
# data_volume: /data/harbor # 设置存储路径启动Harbor
bash
# 执行安装脚本
./install.sh
# 配置开机自启(可选)
echo "/usr/local/harbor/install.sh" >> /etc/rc.local
chmod +x /etc/rc.local
# 通过Web界面访问
# 默认地址:http://your-server-ip
# 用户名:admin
# 密码:Harbor12345部署Nginx负载均衡
在Nginx服务器上操作
bash
# 安装依赖
dnf -y install gcc gcc-c++ make cmake pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载Nginx安装包
wget -q http://nginx.org/download/nginx-1.26.3.tar.gz
# 解压
tar xf nginx-1.26.3.tar.gz -C /usr/src/
# 创建Nginx用户
useradd -Ms /sbin/nologin www
# 预配置
cd /usr/src/nginx-1.26.3
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_v2_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-file-aio \
--user=www \
--group=www
# 编译安装
make -j$(nproc) && make install
# 创建软连接
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
# 配置Nginx负载均衡
cat > /usr/local/nginx/conf/nginx.conf << 'EOF'
worker_processes auto;
user www;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
client_max_body_size 102400M; # 允许传输大文件
upstream harbor {
server 192.168.148.131;
server 192.168.148.132 backup;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://harbor;
}
}
}
EOF
# 启动Nginx
nginx
# 配置开机自启
echo "nginx" >> /etc/rc.local && chmod +x /etc/rc.localHarbor界面配置
创建新项目
在harbor-01操作
- 登录Harbor Web界面
- 点击「项目」→「新建项目」
- 填写项目名称(如:web)
- 选择访问级别:勾选「公开」任何人都可访问,否则需要
docker login登录
创建备用仓库
如果想push就在harbor-01上操作,如果想pull就在harbor-02上操作
- 登录Harbor Web界面
- 点击「系统管理」→「仓库管理」→「新建目标」
- 配置以下参数:
- 提供者:选择
harbor - 目标名:自定义(如:
harbor-backup) - 描述:自定义(如:主)
- 目标URL:对端IP地址(如:
http://192.168.148.132) - 访问ID:admin
- 访问密码:
Harbor12345 - 验证远程证书:如果没有证书的话就取消勾选
- 提供者:选择
- 点击「测试」验证通过后保存
创建同步规则
Push模式
在harbor-01操作
- 点击「系统管理」→「复制管理」→「新建规则」
- 配置以下参数:
- 名称:自定义(如:push-backup)
- 描述:自定义(如:推送到源端仓库)
- 复制模式:勾选
Push-based - 源仓库:
harbor-backup - 源资源过滤器:根据需要配置
- 目标:
- 名称空间:如果为空,资源会同步到和源相同名称空间下
- 仓库扁平化:默认即可
- 触发模式:选择
时间驱动并勾选删除本地资源时同时也删除远程的资源 - 带宽:根据需要配置
- 选项:勾选
覆盖,勾选分块复制
Pull模式
在harbor-02操作
- 点击「系统管理」→「复制管理」→「新建规则」
- 配置以下参数:
- 名称:自定义(如:pull-master)
- 描述:自定义(如:从远端仓库拉取)
- 复制模式:勾选
Pull-based - 源仓库:
harbor-master - 源资源过滤器:根据需要配置
- 目标:
- 名称空间:如果为空,资源会同步到和源相同名称空间下
- 仓库扁平化:默认即可
- 触发模式:选择
定时,Cron:0 * * * * *(第一个0不能修改) - 带宽:根据需要配置
- 选项:勾选
覆盖,勾选分块复制
客户端配置
安装Docker
bash
# 添加软件源信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 替换centos识别版本号
sed -i 's+$releasever+9+' /etc/yum.repos.d/docker-ce.repo
# 安装Docker
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 设置配置文件,添加insecure-registries
cat > /etc/docker/daemon.json << 'EOF'
{
"data-root":"/data/docker",
"bip":"172.18.0.1/16",
"exec-opts":["native.cgroupdriver=systemd"],
"insecure-registries": ["192.168.148.130:80"],
"live-restore":true,
"ipv6": false
}
EOF
# 重新加载配置并启动Docker
systemctl daemon-reload
systemctl start docker验证Harbor
bash
# 登录Harbor
docker login http://192.168.148.130:80
Username: admin
Password: Harbor12345 # 隐藏密码,输入不显示
# 适合脚本中执行
echo "your_password" | docker login -u your_username --password-stdin
# 下载镜像测试
docker pull nginx:latest
# 标记镜像
docker tag nginx:latest 192.168.148.130:80/web/nginx:latest
# 推送镜像到Harbor
docker push 192.168.148.130:80/web/nginx:latest配置镜像清理策略
为什么需要清理
在开发、测试环境中,由于构建频繁,很快磁盘就会被撑爆,因此建议一定要配置镜像清理。
配置清理规则
- 通过Web登录进入Harbor
- 选择需要清理的项目 → 策略 → 添加规则
- 配置清理条件:
- 以artifact数量或天数为条件
- 例如:保留最近推送的#个镜像
配置垃圾回收
配置完清理规则后,还需要配置垃圾回收(GC),否则磁盘空间不会释放:
- 进入「系统管理」→「清理服务」→「垃圾清理」
- 配置定时任务执行时间
- 建议根据构建频率配置,如每日或每周
Harbor最佳实践
- 合理规划命名空间:根据团队或项目划分命名空间,便于管理和权限控制
- 启用镜像扫描:定期扫描镜像漏洞,确保镜像安全
- 配置镜像清理策略:避免磁盘空间被撑爆
- 使用高可用部署:确保生产环境的可靠性
- 定期备份数据:防止数据丢失
- 合理设置权限:遵循最小权限原则,避免不必要的安全风险
