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

总结

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

相关推荐
C_心欲无痕5 小时前
nginx - 开启 gzip 压缩
运维·前端·nginx
王阿巴和王咕噜5 小时前
【WSL】安装并配置适用于Linux的Windows子系统(WSL)
linux·运维·windows
Xの哲學6 小时前
深入剖析Linux文件系统数据结构实现机制
linux·运维·网络·数据结构·算法
Wpa.wk7 小时前
性能测试工具 - JMeter工具组件介绍二
运维·经验分享·测试工具·jmeter·自动化·json
朝阳5817 小时前
Ubuntu 22.04 安装 Fcitx5 中文输入法完整指南
linux·运维·ubuntu
开开心心就好7 小时前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
永远在Debug的小殿下7 小时前
wsl安装Ubuntu and ROS2
linux·运维·ubuntu
❀͜͡傀儡师7 小时前
docker一键部署HFish蜜罐
运维·docker·容器
DO_Community7 小时前
DigitalOcean容器注册表推出多注册表支持功能
服务器·数据库·docker·kubernetes
dnpao7 小时前
linux onlyoffice服务向docker容器中添加中文字体
linux·运维·docker