如何将私有Docker镜像推送至私网本地GitLab服务器容器注册表
私网部署GitLab推送本地自定义镜像操作指引
前置检查
先在机器2(10.2.3.100)上确认两个基础条件:
- 私网连通性正常:执行
ping 10.2.3.105无丢包,GitLab服务的Web端口、容器注册表端口可以正常访问 - GitLab侧已经完成容器注册表开启配置,提前在GitLab创建好用于存储镜像的目标项目,记录下项目的完整路径(项目主页URL中IP后跟随的路径,例如
devops/basic-images)
步骤1:配置Docker放行私有注册表(机器2操作)
纯私网IP部署的GitLab默认没有可信SSL证书,Docker默认会拦截非HTTPS可信仓库的推送请求,需要先修改Docker配置:
- 编辑Docker守护进程配置文件
vi /etc/docker/daemon.json
- 写入如下配置,将地址替换为你实际的GitLab容器注册表地址,如果注册表和GitLab主站共用443端口就直接写IP,若自定义了其他端口(常见为5005、5050)则带上端口:
{ "insecure-registries": ["10.2.3.105:<替换为实际的注册表端口,无自定义端口则直接写10.2.3.105>"] }
- 重载配置并重启Docker生效
systemctl daemon-reload systemctl restart docker
步骤2:登录GitLab容器注册表(机器2操作)
执行登录命令,地址和上一步配置的insecure-registries地址保持完全一致:
docker login 10.2.3.105:<注册表端口>
认证信息说明:用户名填GitLab个人账号即可;如果账号开启了双因素认证,密码需要使用勾选了
read_registry、write_registry权限的个人访问令牌,未开启双因素认证直接填GitLab登录密码即可。
步骤3:给本地镜像打符合注册表规则的标签
你已经在机器2上构建好的ansible:2.9.27镜像,需要重新打标签匹配GitLab注册表的路径规则,标签格式为:<注册表地址>/<GitLab目标项目全路径>/<镜像名>:<版本号>
举个实际例子,如果你存储镜像的GitLab项目路径是devops/basic-images,注册表用默认443端口,打标签命令为:
docker tag ansible:2.9.27 10.2.3.105/devops/basic-images/ansible:2.9.27
注意:项目路径必须和GitLab上的实际路径完全一致,路径写错会直接导致推送时报权限错误。
步骤4:推送镜像到GitLab容器注册表
标签打完直接执行推送命令即可:
docker push 10.2.3.105/devops/basic-images/ansible:2.9.27
等待镜像分层推送完成无报错,即推送成功,可以直接到GitLab对应项目的「容器注册表」菜单下查看已上传的镜像。
常见报错排查
- 报连接超时:用
telnet 10.2.3.105 <注册表端口>检查端口连通性,排查GitLab服务器的防火墙、iptables规则是否放通对应端口 - 报HTTPS证书相关错误:检查
daemon.json中配置的insecure-registries地址,和登录、打标签用的注册表地址是否完全一致,修改配置后必须重启Docker才能生效 - 报权限拒绝:先确认登录使用的账号/令牌对目标项目有写入权限,再检查镜像标签里的项目路径是否正确,个人访问令牌是否勾选了
write_registry权限
内容的提问来源于stack exchange,提问作者TRONG NGUYEN
相关产品推荐
相关产品推荐

