Docker 镜像仓库
本文从实际场景出发,介绍了 Docker 镜像仓库的完整体系:公共仓库(Docker Hub、阿里云容器镜像服务加速器)和私有仓库(Docker Registry、Harbor)。详细记录了镜像的推送(docker push)、拉取(docker pull)操作,Harbor 的安装配置(Docker Compose、Nginx 反向代理、HTTPS 配置),以及 Web UI 管理、镜像同步、权限管理等企业级功能。是搭建私有镜像仓库的实用指南。
本文仅从一个实际场景出发:自己制作的镜像该如何分享与管理? 重点记录从公共仓库(Docker Hub、阿里云)到私有镜像仓库(Registry、Harbor)的搭建与使用过程。
一、Docker Hub
首先介绍官方的 Docker Hub。
推送与拉取镜像
推送自己的镜像到 Docker Hub 上。因为网速原因……这里我用一个超小的镜像 busybox 来做实验。
[root@bogon ~]# docker images | grep busy
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest af2f74c517aa 6 days ago 1.2MB1. 打标签 (Tag)
docker tag busybox:latest thxiex/busybox:1.0[root@bogon ~]# docker images | grep busy
busybox latest af2f74c517aa 6 days ago 1.2MB
thxiex/busybox latest af2f74c517aa 6 days ago 1.2MB注意:这里的
thxiex就是我在 Docker Hub 中的 username。必须对应,否则推不上去。
2. 推送 (Push)
docker push thxiex/busybox:1.0去自己的镜像仓库看下吧,已经有了!
踩坑提示:如果推送过程中提示
denied: requested access to the resource is denied,说明未授权,先执行docker login登录一下即可。
拉取镜像(Pull)大家都很熟悉了:
docker pull thxiex/busybox:1.0二、国内镜像仓库
国内也有很多镜像托管服务,例如网易云、DaoCloud、阿里云等,上传和拉取镜像的“姿势”基本和 Docker Hub 一样。
吐槽:网易云的仓库这两天个人认证居然无法使用了,必须要企业认证。所以我这里改用阿里云的容器镜像服务来做实验。
首先需要在阿里云 - 容器镜像服务中创建一个命名空间,并设置仓库类型(公有或私有):

1. 推送和拉取
这里省略自己制作镜像的过程,以一个我已经拉取好的官方镜像 redis:latest 为例。
首先登录阿里云 Registry:
$ sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.comTag & Push & Pull:
# 打标签
docker tag redis:latest registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0
# 推送
docker push registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0
# 拉取
docker pull registry.cn-hangzhou.aliyuncs.com/thank/redis:1.0去阿里云控制台的镜像仓库看看吧,成功上传!

2. 基于代码源自动构建
上面的方式是自己在 Docker 环境中制作好镜像再手动 Push。这里介绍一种更极客的基于代码源自动构建方式。
以 GitHub 为例,代码源为:https://github.com/thxiex/spring-cloud-study2
- 创建镜像仓库:填写仓库名称,选择对应的命名空间。
- 设置代码源:选择 GitHub,第一次使用需要 OAuth 绑定账号。
- 构建设置:
- 开启代码变更自动构建镜像功能。
- 构建规则设置:设置代码源的分支/tag、Dockerfile 的相对路径及名称、需要构建的镜像版本标签。
- 开始构建:点击规则上的“立即构建”即可。
每次的构建过程会实时输出到构建日志中,方便排错查看。

三、私有仓库搭建
出于安全性、合规性以及内网传输速度的考虑,很多企业会选择搭建内部的私有镜像仓库。
1. 官方原生 Registry
这是一个官方提供的基础镜像仓库,安装极其简单!
# 拉取镜像并启动
docker pull registry:2
docker run -d -p 5000:5000 registry:2推送和拉取过程跟推送到公有仓库差不多:
# 打标签
docker tag busybox:latest localhost:5000/busybox:1.0
# 推送
docker push localhost:5000/busybox:1.0
# 拉取
docker pull localhost:5000/busybox:1.0注意避坑(HTTP Insecure 限制): 如果镜像仓库和 Docker 客户端不在同一台机器上,推送时大概率会报 HTTPS 安全错误。 解决办法:在 Client 端的
/etc/docker/daemon.json中加入免密白名单:json{ "insecure-registries": ["<Registry_IP>:5000"] }然后重启 Docker:
systemctl restart docker。
除了推送和拉取,Registry 还提供了一些 RESTful API,用于查看镜像信息等。例如:
[root@bogon ~]# curl localhost:5000/v2/_catalog
{"repositories":["busybox"]}Registry 的缺点: 虽然它很轻便,具备了基础的镜像管理功能,但有两个硬伤:
- 不具备授权认证功能,需要自己去折腾一层认证方案。
- 只有干巴巴的 API,没有好看且易用的 Web 界面。
2. 企业级私有仓库:Harbor
Harbor 意为“港湾”,非常贴合它的作用。
背景:Harbor 最初由 VMware 中国研发团队开源,后来捐赠给了 CNCF(云原生计算基金会),所以它的 GitHub 仓库地址现在也转到了 goharbor 下。
官方将 Harbor 定义为企业级私有 Registry 服务器。它底层实际也是依赖 Docker Registry,但在这之上封装了大量企业级特性:
- 提供直观友好的 Web UI 界面。
- 完善的 RBAC 安全机制(包含角色、项目权限控制、审计日志等)。
- 支持多实例水平扩展和镜像复制同步。
- 镜像分层传输优化,提升内网分发速度。
安装 Harbor
环境准备: 安装前需要宿主机已安装 Docker 和 Docker-Compose,这里不赘述了。
下载与解压:
在 GitHub Releases 中查看需要的版本(这里我用的是 v1.7.5)。
官方提供 offline(离线)和 online(在线)两种安装包。考虑到服务器网络和代理问题,我果断选择了 offline 离线包(约 500MB,内含所有依赖镜像)。
解压后大致看下目录结构:
[root@localhost opt]# tree harbor -CL 2
harbor
├── common
│ ├── config
│ └── templates
├── docker-compose.yml
├── harbor.cfg
├── install.sh
...修改配置 harbor.cfg:
编辑核心配置文件,按需修改:
# 强烈建议:不要设置成 localhost 或 127.0.0.1,换成本机 IP 或域名
hostname = hub.thank.com
# 邮箱相关的设置(按需)
email_server = smtp.163.com
email_server_port = 25
email_username = coderthank@163.com
email_password = ******
email_from = thank <coderthank@163.com>
# 修改 admin 默认的登录密码
harbor_admin_password = 123123执行安装:
运行 ./install.sh 即可一键傻瓜式安装:
[Step 0]: checking installation environment ...
Note: docker version: 1.13.1
Note: docker-compose version: 1.16.1
[Step 1]: loading Harbor images ...
...略
[Step 4]: starting Harbor ...
...略
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at http://hub.thank.com.通过 docker ps 可以看到,Docker-Compose 已经在后台帮我们拉起了一整套 Harbor 相关的微服务集群(包含 nginx、core、db、redis、jobservice 等)。
界面使用
因为刚才在配置文件配了一个假域名,这里我在本地修改下 hosts:
192.168.118.143 hub.thank.com浏览器访问 http://hub.thank.com(默认 80 端口),即可看到 Harbor 的登录页面。

基础测试:
登录 Admin 账号 -> 创建用户 thank -> 创建私有项目 cloudlink-base -> 在项目中添加用户 thank,赋予项目管理员角色。
其它功能就不做过多介绍了,中文简体界面,自己点一点摸索下就好啦!
镜像推送测试
这里测试一下如何往搭建好的 Harbor 中推送镜像。方法跟其它仓库基本一致,不啰嗦了:
# 登录
docker login hub.thank.com
# 重新打标签,注意命名空间对应项目名
docker tag redis:latest hub.thank.com/cloudlink-base/thank-redis:latest
# 推送
docker push hub.thank.com/cloudlink-base/thank-redis:latest
# 拉取测试
docker pull hub.thank.com/cloudlink-base/thank-redis:latest运维管理与 HTTPS 避坑
我们可以直接使用 Docker-Compose 来统一完成 Harbor 服务的运维启停:
- 停止:
docker-compose stop - 启动:
docker-compose start
HTTPS 避坑指南:
刚才在配置文件 harbor.cfg 中默认使用的是 HTTP 协议。如果从其它主机上传镜像,Docker 客户端默认会强制使用 HTTPS 访问 Harbor,这会导致报 connection refused 或证书错误。
两种解决办法:
- 简单粗暴法(开发测试用):
在所有 Client 端的
/etc/docker/daemon.json中加入非安全信任白名单:json{ "insecure-registries" : ["hub.thank.com"] } - 正规配置法(生产环境):
修改 Harbor 配置文件
ui_url_protocol = https,并配置合法的 TLS 证书。配置不算很复杂,具体可参考网上的相关教程(如:Harbor 配置 TLS 证书)。