序言
在容器化和微服务架构逐渐成为主流的背景下,镜像仓库已经成为 CI/CD 体系中不可或缺的基础组件。无论是应用的持续集成、持续交付,还是多环境(开发 / 测试 / 生产)的版本管理,稳定、可控、安全的镜像仓库都是保障交付效率与系统稳定性的关键。
Harbor 是 CNCF 毕业项目之一,也是目前企业级私有镜像仓库中使用最为广泛的解决方案之一。相比原生 Docker Registry,Harbor 不仅提供了完整的 Web UI,还内置了 权限管理、项目隔离、镜像扫描、镜像复制、审计日志 等企业级能力,非常适合在内网或私有云环境中使用。
本文将从零开始介绍 Harbor 在单机环境下的部署过程,重点覆盖以下内容:
- Harbor 的下载、初始化配置与启动流程
- 常见核心配置项的含义与修改建议
- Docker 客户端与 Harbor 私服的对接方式(HTTP / HTTPS)
- 镜像的推送、拉取及基础管理思路
- 在实际生产环境中常见的扩展场景(如公网 HTTPS 访问)
本文偏向实战与可落地,示例配置均来自真实部署场景,适合以下读者参考:
- 正在搭建或计划搭建 CI/CD 平台的运维 / 后端工程师
- 需要在内网部署私有 Docker 镜像仓库的团队
- 希望快速了解 Harbor 部署与使用要点的技术人员
如果你已经具备 Docker 和 Docker Compose 的基础使用经验,那么可以直接按照本文步骤进行部署;如果你是首次接触 Harbor,也可以将本文作为一份入门级部署指南逐步实践。
部署步骤
下载安装
1 | cd /data/ci_cd |
初始化配置
对于配置文件,大概需要处理以下参数项:
- hostname:修改为部署服务器的 ip 或域名
- http.port: 修改为可用的端口,如 80 -> 28080
- https: 关闭 https,将相关配置注释,如果需要公网配置,可以获取证书后进行相关配置
- data_volume:修改挂载目录
- log.location:修改挂载目录
- 查看默认密码:在 harbor_admin_password 中默认密码为 Harbor12345
1 | cd /data/ci_cd/harbor |
1 | #hostname: reg.mydomain.com |
配置 docker-compose.yml
执行如下脚本生成 docker-compose.yml 文件
1 | cd /data/ci_cd/harbor |
启动 Harbor
1 | docker-compose up -d |
访问 Web 界面
访问 http://your-server-ip:28080出现如下界面即代表 Harbor 安装成功!

注意,默认账户密码如下(一般建议更改,登录 web 界面后修改即可):
- 用户:
admin - 密码:
Harbor12345
配置私服
当我们安装完 harbor 私服后,其他安装了 docker 的服务器如果想从私服拉取镜像或者将镜像打包推送到私服,需要和私服打通。
要想实现上述目标,需要在服务器上做几步配置,这大概分为三类情况:
- 如果私服是 https + 合法证书:直接 docker login 就行
- 如果私服是 http:需要先执行 docker login,之后配置 insecure-registries
- 如果私服是 https+自签证书:需要先执行 docker login,之后 配置 ca.crt
https + 合法证书的私服
首先,需要使用 docker login 命令登录私有仓库。这会将您的认证信息保存到服务器上,Docker 在拉取镜像时会自动使用这些信息。
1 | docker login <私服地址>:<端口> |
然后,输入用户名、密码(登录成功后,凭证会保存在):
1 | ~/.docker/config.json |
拉取时直接:
1 | docker pull <私服地址>:<端口>/<项目>/<镜像>:<tag> |
登录命令格式说明
1 | docker login [OPTIONS] [SERVER:PORT] |
默认格式
1 | # 如果你的私服使用的是标准端口(80/443),可以省略端口号 |
执行后,命令行会提示您输入用户名和密码。
指定端口的私有仓库
1 | # 如果您的私服运行在 5000 端口 |
直接认证
1 | # 使用命令行参数直接输入认证信息(适用于自动化脚本) |
注意: 出于安全考虑,在生产环境中不建议直接使用 -p 参数,因为密码会出现在命令历史中。建议使用密码管理器或脚本从安全的地方获取密码。
登录成功后,可以看到 Login Succeeded 的提示。您的认证信息会被加密保存在 /root/.docker/config.json 文件中。
http 协议的私服
如果 Harbor 仓库使用的是 HTTP(而不是 HTTPS)或者使用了 自签名的 HTTPS 证书,必须修改 Docker Daemon 的配置,告诉它信任私有仓库地址。否则,由于 Docker 默认只信任 HTTPS,会因安全原因拒绝连接。
- 编辑 Docker Daemon 的配置文件。
1 | sudo vi /etc/docker/daemon.json |
- **在
daemon.json文件中添加insecure-registries。
1 | { |
- 保存文件并重启 Docker 服务。 修改配置后,必须重启 Docker 才能使更改生效。
1 | sudo systemctl restart docker |
- 验证配置是否生效。
1 | sudo docker info |
在输出的信息中,您应该能看到 Insecure Registries: 或 Registry Mirrors: 部分包含您刚刚配置的地址。
私服是自签证书
一般无此情况,不做说明。
推送镜像到私服
假设我们现在仓库存在一个如下镜像需要推送到 docker 私服,必须给事先它打上包含私服地址和项目名称的特殊Tag,因为 Docker 客户端通过镜像的标签(Tag) 来确定这个镜像应该被推送到哪个仓库服务器。
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
因此,我们首先需要将其重命名:
1 | docker tag visual-screen:v1.0 192.168.3.30:28080/library/visual-screen:v1.0 |
之后,才能成功推送到私服:
1 | docker push 192.168.3.30:28080/library/visual-screen:v1.0 |
由于以上操作过于繁琐,所以我们也可以在 docker build 构建镜像时,直接使用符合 Harbor 规范的完整镜像名作为 -t 参数的值。这样就能省去后续单独执行 docker tag 命令的步骤,一步到位。
扩展──镜像管理
在 Harbor 中,我们需要根据具体的业务处理以下事务:
- 学会使用过期的策略,镜像多久后会过期.
- 镜像根据环境的不同覆盖或新增,对于测试环境和生产环境需要分别取进行处理:
- 测试环境的镜像直接覆盖就行:此处我们的镜像使用固定版本就行
- 生产环境的镜像可能需要注意回滚情况:此处我们的镜像根据 commit 来方便回滚
扩展──https访问
上面部署的 Nginx 只能通过内网访问,如果希望通过公网访问,可以在公网服务器的 Nginx 上进行反向代理,实现公网 https 方式访问。
要实现上述目标,需要修改两个配置,harbor.yml增加如下配置(harbor.xxx.com请修改为对应的公网域名)。
1 | # external_url 必须是公网可访问的完整 URL |
公网 Nginx 配置如下(harbor.xxx.com请修改为对应的公网域名):
1 | # harbor_backend 前缀同一代理 |
文章信息
| 时间 | 说明 |
|---|---|
| 2025-09-22 | 小结独立一文 |