推送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.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 的分层机制很高效!)

总结

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

相关推荐
程序猿老A17 分钟前
轻量云服务器总是卡,内存占比高?
运维·服务器
一只鹿鹿鹿1 小时前
智算算力、AI-芯片与产品解析(PPT文件)
大数据·运维·网络·人工智能·物联网·1024程序员节
Kobebryant-Manba2 小时前
C/S和B/S结构
运维·服务器
是枚小菜鸡儿吖3 小时前
Home Assistant跨品牌智能家居教程:Docker部署、米家接入、vivo桥接与远程访问
docker·容器·智能家居
AI_Lab013 小时前
宝塔用了两年,有没有必要换成轻量方案?
linux·运维·服务器
众壹新能源科技3 小时前
逆变器直流开关柜温度监测与预防:红外巡检发现3个120度热点
运维·人工智能·自动化
by209993 小时前
Linux GDB 调试与 CGDB 使用
linux·运维·服务器·经验分享
小Ti客栈4 小时前
Netty 零拷贝原理与实战
运维·服务器·网络
ai_coder_ai4 小时前
AIOps 智能运维架构设计及其应用
运维
静以修身zzz4 小时前
计算云服务
运维·网络·云计算