文章目录
- 前言
- 一、为什么需要私有镜像仓库?
- [二、官方 Registry 镜像快速搭建](#二、官方 Registry 镜像快速搭建)
- 三、推送镜像到私有仓库
- 四、从私有仓库拉取镜像
- 五、生产环境增强配置(推荐)
-
- [1. 启用 HTTPS(必需)](#1. 启用 HTTPS(必需))
- [2. 配置身份认证](#2. 配置身份认证)
- 六、harbor私有镜像仓库实战
- 总结
前言
Docker 私有镜像仓库用于在企业或团队内部安全地存储、管理和分发 Docker 镜像,避免将敏感代码或配置暴露到公共平台(如 Docker Hub)。它支持镜像版本控制、访问权限管理,并可与 CI/CD 流水线集成。
一、为什么需要私有镜像仓库?
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
安全性:避免将包含业务逻辑、密钥或内部依赖的镜像上传到公有仓库。
网络效率:本地部署可加速镜像拉取,减少对外网依赖。
合规性:满足企业数据不出内网的安全合规要求。
版本管理:集中管理镜像生命周期(构建、测试、发布)。
二、官方 Registry 镜像快速搭建
1.启动私有仓库容器
bash
docker run -d \
--name registry \
-p 5000:5000 \
-v /opt/registry:/var/lib/registry \
registry:2
⚠️ 默认情况下,该仓库不启用身份认证和 HTTPS,仅适用于内网测试环境。
三、推送镜像到私有仓库
步骤 1:给本地镜像打标签(tag)
bash
docker tag my_nginx_image:v1 localhost:5000/my_nginx_image:v1
步骤 2:推送镜像
bash
docker push localhost:5000/my_nginx_image:v1
四、从私有仓库拉取镜像
bash
docker pull <仓库地址>/<镜像名>:<标签>
# 示例:
docker pull 192.168.1.100:5000/my_nginx_image:v1
五、生产环境增强配置(推荐)
1. 启用 HTTPS(必需)
Docker 客户端默认拒绝连接非 HTTPS 的私有仓库(除非配置为 insecure registry)。
使用 Let's Encrypt 或自签名证书配置 TLS。
将证书部署到所有客户端机器的信任库中。
2. 配置身份认证
使用 htpasswd 创建用户:
bash
mkdir auth
docker run --entrypoint htpasswd httpd:2 -Bbn user1 password123 > auth/htpasswd
启动带认证的 registry:
bash
docker run -d \
--name registry \
-p 5000:5000 \
-v /opt/registry:/var/lib/registry \
-v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:2
推送前需登录哦亲
六、harbor私有镜像仓库实战
前提条件:
你的服务器必须已配置 insecure-registries(因为你用的是 HTTP)。
bash
cat /etc/docker/daemon.json
往里面加入
bash
{
"insecure-registries": ["xxx.xx.xx:xx:xx"]
}
注意纯IP加端口不要什么http或https,如果是追加到末尾的话,不要忘记前⾯的英⽂逗号。
运⾏命令重新加载配置和重启docker
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
登录docker
bash
sudo docker login xxx.xx.xx.xx:xx
登录用户名明文显示的密码不会显示所以自己注意不要惊讶。输完直接回车。
✅ 成功提示:
bash
Login Succeeded
| 错误 | 原因 | 解决 |
|---|---|---|
http: server gave HTTP response to HTTPS client |
没配置 insecure-registries |
将仓库地址(如 xxx.xx.xx.xx:xx)添加到 /etc/docker/daemon.json 的 insecure-registries 列表中,并重启 Docker 服务 |
unauthorized |
账号密码错误 或 用户无项目权限 | 核对用户名和密码;确认用户 habor_E021 是 Harbor 项目的成员(至少拥有 Developer 权限) |
connection refused |
Harbor 服务未启动 或 防火墙/网络拦截 | 联系管理员确认 Harbor 服务正常运行,且端口 8000 对外开放、网络可达 |
推送镜像
bash
sudo docker tag <镜像名称>:<tag> xxx.xx.xx.xx:xx/<项⽬名称>/<镜像名称>:<tag>
sudo docker push xxx.xx.xx.xx:xx/<项⽬名称>/<镜像名称>:<tag>
举个例子
bash
sudo docker tag redis:alpine xxx.xx.xx.xx:xx/library/redis:alpine
sudo docker push xxx.xx.xx.xx:xx/library/redis:alpine
看到类似
158f2d9bcbaf: Pushed
1.1: digest: sha256:a1b2c3d4... size: 1234
就是成功了,自己不断改变版本进行传送,然后你升级版本传送的时候看到 Layer already exists 不要慌,因为其他层 之前已经推过,Harbor 里已经有了,不需要重复上传(Docker 的分层机制很高效!)
总结
最后希望能帮到你,不喜勿喷,欢迎交流指正。
