Skip to content

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说明操作系统预装软件
nginx192.168.148.130Nginx负载均衡openEuler-24.03(LTS)Nginx
harbor-01192.168.148.131Harbor节点openEuler-24.03(LTS)Docker、docker-compose、Harbor
harbor-02192.168.148.132Harbor节点openEuler-24.03(LTS)Docker、docker-compose、Harbor
nfs192.168.148.133共享存储openEuler-24.03(LTS)NFS
client192.168.148.134Docker客户端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 -a

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

# 设置配置文件
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 docker

Harbor安装

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.local

Harbor界面配置

创建新项目

在harbor-01操作

  1. 登录Harbor Web界面
  2. 点击「项目」→「新建项目」
  3. 填写项目名称(如:web)
  4. 选择访问级别:勾选「公开」任何人都可访问,否则需要docker login登录

创建备用仓库

如果想push就在harbor-01上操作,如果想pull就在harbor-02上操作

  1. 登录Harbor Web界面
  2. 点击「系统管理」→「仓库管理」→「新建目标」
  3. 配置以下参数:
    • 提供者:选择harbor
    • 目标名:自定义(如:harbor-backup
    • 描述:自定义(如:主)
    • 目标URL:对端IP地址(如:http://192.168.148.132
    • 访问ID:admin
    • 访问密码:Harbor12345
    • 验证远程证书:如果没有证书的话就取消勾选
  4. 点击「测试」验证通过后保存

创建同步规则

Push模式

在harbor-01操作

  1. 点击「系统管理」→「复制管理」→「新建规则」
  2. 配置以下参数:
    • 名称:自定义(如:push-backup)
    • 描述:自定义(如:推送到源端仓库)
    • 复制模式:勾选Push-based
    • 源仓库:harbor-backup
    • 源资源过滤器:根据需要配置
    • 目标:
      • 名称空间:如果为空,资源会同步到和源相同名称空间下
      • 仓库扁平化:默认即可
    • 触发模式:选择时间驱动并勾选删除本地资源时同时也删除远程的资源
    • 带宽:根据需要配置
    • 选项:勾选覆盖,勾选分块复制
Pull模式

在harbor-02操作

  1. 点击「系统管理」→「复制管理」→「新建规则」
  2. 配置以下参数:
    • 名称:自定义(如: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

配置镜像清理策略

为什么需要清理

在开发、测试环境中,由于构建频繁,很快磁盘就会被撑爆,因此建议一定要配置镜像清理。

配置清理规则

  1. 通过Web登录进入Harbor
  2. 选择需要清理的项目 → 策略 → 添加规则
  3. 配置清理条件:
    • 以artifact数量或天数为条件
    • 例如:保留最近推送的#个镜像

配置垃圾回收

配置完清理规则后,还需要配置垃圾回收(GC),否则磁盘空间不会释放:

  1. 进入「系统管理」→「清理服务」→「垃圾清理」
  2. 配置定时任务执行时间
  3. 建议根据构建频率配置,如每日或每周

Harbor最佳实践

  1. 合理规划命名空间:根据团队或项目划分命名空间,便于管理和权限控制
  2. 启用镜像扫描:定期扫描镜像漏洞,确保镜像安全
  3. 配置镜像清理策略:避免磁盘空间被撑爆
  4. 使用高可用部署:确保生产环境的可靠性
  5. 定期备份数据:防止数据丢失
  6. 合理设置权限:遵循最小权限原则,避免不必要的安全风险