推送docker镜像至私有 Docker 镜像仓库(附企业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.jsoninsecure-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 的分层机制很高效!)

总结

最后希望能帮到你,不喜勿喷,欢迎交流指正。

相关推荐
m0_485614672 小时前
Docker基础
docker·容器·php
二等饼干~za8986682 小时前
碰一碰发视频系统源码开发搭建--技术分享
java·运维·服务器·重构·django·php·音视频
爱学大树锯2 小时前
【Docker本地化超级实践】Docker 镜像离线构建方案
运维·docker·容器
熙丫 133814823862 小时前
CISAW-RM风险管理认证培训|2026年度课程计划全面发布:筑牢安全防线
运维·安全
默恋~微凉2 小时前
Docker
运维·docker·容器
玥轩_5212 小时前
防火墙技术-综合应用实验
运维·网络·网络协议·网络安全·智能路由器·路由器·防火墙
Lynnxiaowen3 小时前
今天我们继续学习devops内容基于Jenkins构建CICD环境
linux·运维·学习·jenkins·devops
小尧嵌入式3 小时前
Linux网络介绍网络编程和数据库
linux·运维·服务器·网络·数据库·qt·php
qq_455760853 小时前
docker - 存储卷
运维·docker·容器