【容器运维】docker搭建私有仓库
一、基础方案:使用 Docker Registry 快速搭建
1. 拉取并启动 Registry 镜像
# 拉取官方镜像
docker pull registry:2# 运行容器(数据持久化到宿主机目录)
docker run -d -p 5000:5000 \--name my-registry \-v /opt/data/registry:/var/lib/registry \registry:2
- 关键参数:
-v挂载数据目录防止镜像丢失,-p映射端口(默认 5000)224960。
2. 配置 Docker 客户端
编辑 /etc/docker/daemon.json,添加私有仓库地址(需重启 Docker):
{"insecure-registries": ["http://<私有仓库IP>:5000"]
}
- 说明:非 HTTPS 仓库需添加
insecure-registries配置以绕过安全验证222460。
3. 推送/拉取镜像
# 标记镜像
docker tag nginx:latest <私有仓库IP>:5000/my-nginx:latest# 推送镜像
docker push <私有仓库IP>:5000/my-nginx:latest# 拉取镜像
docker pull <私有仓库IP>:5000/my-nginx:latest
4. 验证仓库内容
# 查看仓库镜像列表
curl http://<私有仓库IP>:5000/v2/_catalog
二、进阶方案:部署 Harbor 企业级仓库
1. 环境准备
- 安装依赖:Docker 和 Docker Compose(需单独安装)156。
- 下载 Harbor:
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz tar -zxvf harbor-offline-installer-v2.10.0.tgz
2. 配置 Harbor
cd harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml # 修改以下核心参数
hostname: 192.168.x.x # 服务器IP或域名
http:port: 8080 # 访问端口
harbor_admin_password: YourPassword # 管理员密码
data_volume: /data # 数据存储路径
3. 安装与启动
./prepare # 生成配置文件
./install.sh # 启动服务
- 访问管理界面:
http://<IP>:8080,默认账号admin14856。
4. 镜像管理
# 登录 Harbor
docker login <HarborIP> -u admin -p YourPassword# 推送镜像(需包含项目名)
docker tag nginx:latest <HarborIP>/my-project/nginx:latest
docker push <HarborIP>/my-project/nginx:latest
三、高级配置(可选)
-
HTTPS 加密
- Harbor:在
harbor.yml中配置 SSL 证书路径4853。 - Docker Registry:通过 Nginx 反向代理实现 HTTPS,并配置 Let’s Encrypt 证书53。
- Harbor:在
-
身份认证
- Harbor:自带 RBAC 权限管理148。
- Registry:通过 Nginx 配置 HTTP 基础认证或集成 OAuth53。
-
可视化管理
- Registry:部署
docker-registry-frontend提供 Web 界面24。 - Harbor:原生支持 Web 界面,提供漏洞扫描、复制策略等功能148。
- Registry:部署
四、方案对比
| 特性 | Docker Registry | Harbor |
|---|---|---|
| 部署复杂度 | 简单(单容器) | 中等(需配置组件) |
| 功能 | 基础镜像存储 | 企业级权限、漏洞扫描等 |
| 适用场景 | 个人/小型团队 | 企业生产环境 |
| 维护成本 | 低 | 中高(需定期更新) |
常见问题
-
推送镜像失败
- 检查
insecure-registries配置,确保客户端信任私有仓库2224。 - 确认防火墙是否开放仓库端口(如 5000/8080)。
- 检查
-
Harbor 启动报错
- 确保已安装 Docker Compose,且版本兼容156。
- 检查
harbor.yml格式(YAML 缩进敏感)56。
如需更详细操作(如 HTTPS 证书申请、集群部署),可参考 Harbor 官方文档 或 Docker Registry 配置指南。
二、允许http通过docker login登录
要让 Docker 客户端通过 HTTP 协议连接私有仓库(而非默认的 HTTPS),需要修改 Docker 的配置以明确允许不安全连接。以下是具体步骤及原理说明:
一、核心配置方法
1. 修改 Docker 守护进程配置
在 Docker 的配置文件 /etc/docker/daemon.json 中添加 insecure-registries 字段,指定允许通过 HTTP 连接的仓库地址(IP 或域名 + 端口):
{"insecure-registries": ["your.registry.com:5000", "192.168.1.100:80"]
}
- 作用:禁用 HTTPS 强制验证,允许 Docker 客户端通过 HTTP 通信 1225。
- 注意事项:
- 若文件不存在则需创建。
- 多个仓库地址用逗号分隔。
2. 修改 Docker 服务启动参数(替代方案)
若无法通过 daemon.json 生效(如旧版本 Docker),可编辑服务文件 /etc/systemd/system/docker.service,在 ExecStart 行添加 --insecure-registry 参数:
ExecStart=/usr/bin/dockerd --insecure-registry=your.registry.com:5000
- 生效步骤:
systemctl daemon-reload systemctl restart docker
115
二、常见错误及处理
1. 错误:http: server gave HTTP response to HTTPS client
- 原因:Docker 客户端尝试使用 HTTPS 协议,但服务端仅支持 HTTP。
- 解决:确认
insecure-registries配置正确,并重启 Docker 服务 22534。
2. 错误:dial tcp IP:80: connect: connection refused
- 原因:Docker 服务未正确重启或网络配置问题。
- 解决:
- 检查防火墙是否开放对应端口。
- 确保仓库服务(如 Harbor)已启动并监听 HTTP 端口 115。
三、域名与 Hosts 配置
若使用域名而非 IP,需确保域名解析正确:
- 编辑
/etc/hosts,添加:192.168.1.100 your.registry.com - 重启网络服务或 Docker 134。
四、登录命令示例
docker login your.registry.com:5000 -u username -p password
- 成功标志:输出
Login Succeeded。 - 警告处理:若提示密码未加密存储,可通过配置 Docker 凭证助手解决 206465。
五、安全性权衡
- 风险:HTTP 协议传输数据未加密,可能被中间人攻击。
- 建议:
- 仅在内部测试环境使用 HTTP。
- 生产环境应配置 HTTPS 证书 5166。
通过以上配置,Docker 客户端将允许通过 HTTP 协议与指定仓库通信。若问题仍存在,可检查仓库服务日志(如 Harbor 的 core.log)排查服务端问题。
三、获取docker.service地址
根据 Docker 的安装方式及系统环境,docker.service 文件的位置可能存在差异。以下是常见位置的整理及优先级说明:
1. 默认安装位置
在大多数 Linux 系统(如 CentOS、Ubuntu)中,Docker 通过 systemd 管理服务,其默认服务文件路径为:
/lib/systemd/system/docker.service
这是 Docker 官方包安装后生成的标准位置 1347。
2. 用户自定义或覆盖位置
若用户手动修改过 Docker 服务配置(如调整启动参数),可能会在以下路径生成覆盖文件:
/etc/systemd/system/docker.service
- 优先级:此路径下的文件会覆盖默认文件,
systemd优先读取此处的配置 2860。
3. 其他可能路径
- 旧版本或源码安装:部分非标准安装可能将服务文件放在
/usr/lib/systemd/system/docker.service47。 - Drop-in 片段文件:若存在分片配置,可能位于
/etc/systemd/system/docker.service.d/目录下(如override.conf等)2728。
验证实际使用的文件
可通过以下命令查看当前生效的 docker.service 路径:
systemctl status docker | grep "Loaded"
输出示例:
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
此处显示的路径即为实际加载的文件 2833。
注意事项
- 修改配置:直接编辑默认文件可能被包管理器覆盖,建议通过
systemctl edit docker创建覆盖片段 2760。 - 服务重启:修改后需执行
systemctl daemon-reload && systemctl restart docker使配置生效 147。
如需进一步分析 Docker 服务配置问题,可提供 systemctl status docker 的输出内容。
四、加了参数后docker启动失败
根据搜索结果,在 Docker 服务配置中添加 --insecure-registry 参数后启动失败,通常由配置冲突或语法错误导致。以下是具体原因及解决方案:
一、核心原因分析
1. 配置重复冲突
若同时通过 /etc/docker/daemon.json 和 docker.service 文件设置 insecure-registries,Docker 会因参数重复而启动失败。
- 表现:报错
unable to configure the Docker daemon with file...,提示insecure-registries参数在配置文件和命令行中重复设置13。 - 示例:
// daemon.json 中存在: { "insecure-registries": ["your.registry.com:5000"] }// docker.service 中同时存在: ExecStart=/usr/bin/dockerd --insecure-registry=your.registry.com:5000
2. 语法格式错误
在 docker.service 文件中修改 ExecStart 行时,若未正确保留原有参数(如 -H fd://),会导致服务启动失败1。
- 错误示例:
ExecStart=/usr/bin/dockerd --insecure-registry=your.registry.com:5000 # 缺少默认参数
3. 域名解析问题
若使用域名而非 IP,需确保已配置正确的 DNS 解析或 /etc/hosts 文件14。
- 验证方法:
ping your.registry.com # 检查是否能解析到正确 IP
二、解决方案
1. 统一配置方式
方式一:仅使用 daemon.json
① 删除 docker.service 中的 --insecure-registry 参数,恢复默认配置。
② 在 /etc/docker/daemon.json 中写入:
{ "insecure-registries": ["your.registry.com:5000"] }
③ 重启服务:
systemctl daemon-reload && systemctl restart docker
方式二:仅使用 docker.service
① 在 docker.service 的 ExecStart 行添加参数,并保留原有参数:
ExecStart=/usr/bin/dockerd --insecure-registry=your.registry.com:5000 -H fd:// --containerd=/run/containerd/containerd.sock
② 删除 daemon.json 中的相关配置。
③ 重启服务:
systemctl daemon-reload && systemctl restart docker
2. 检查语法与参数
- 保留必要参数:确保
ExecStart行包含 Docker 默认参数(如-H fd://)1。 - 使用覆盖文件(推荐):通过
systemctl edit docker创建片段文件,避免直接修改主配置文件66:# 输入以下内容保存 [Service] ExecStart= ExecStart=/usr/bin/dockerd --insecure-registry=your.registry.com:5000 -H fd://
3. 查看日志定位问题
通过以下命令获取详细错误信息:
journalctl -u docker --no-pager -n 100 # 查看最近 100 行日志
- 常见日志线索:
http: server gave HTTP response to HTTPS client:需确认insecure-registries已生效51。dial tcp IP:port: connect: connection refused:检查防火墙或仓库服务是否运行14。
三、验证配置生效
执行以下命令确认参数已加载:
docker info | grep "Insecure Registries"
输出应显示:
Insecure Registries:your.registry.com:5000
四、其他注意事项
- 域名与 Hosts 配置:若使用域名,需在
/etc/hosts中添加解析:echo "192.168.1.100 your.registry.com" >> /etc/hosts - 安全风险:HTTP 协议存在数据泄露风险,建议生产环境配置 HTTPS14。
通过以上步骤可解决因 --insecure-registry 配置导致的启动失败问题。若仍存在问题,可结合具体日志进一步排查。
相关文章:
【容器运维】docker搭建私有仓库
一、基础方案:使用 Docker Registry 快速搭建 1. 拉取并启动 Registry 镜像 # 拉取官方镜像 docker pull registry:2# 运行容器(数据持久化到宿主机目录) docker run -d -p 5000:5000 \--name my-registry \-v /opt/data/registry:/var/lib…...
深入理解 Spring 框架中的 AOP 技术
一、引言 在 Java 开发领域,Spring 框架凭借其强大的功能和丰富的特性,成为了众多开发者构建企业级应用的首选。其中,面向切面编程(AOP)作为 Spring 框架的核心技术之一,为开发者提供了一种全新的程序结构…...
磁盘清理工具-TreeSize Free介绍
TreeSizeFree是一个磁盘空间管理工具,主要用于分析磁盘使用情况,帮助用户找到占用空间大的文件和文件夹: 特点:按大小排序:快速找到占用空间最大的文件或文件夹 一般可以删除: 扫描 C:\Users\XXX\AppData\Local\Temp 或 C:\Window…...
redis MISCONF Redis is configured to save RDB snapshots报错解决
直接上解决方案 修改redis配置文件 stop-writes-on-bgsave-error no 重启redis...
c#知识点补充2
1.非静态类能否调用静态方法可以 2.对string类型扩展方法,如何进行 类用静态类,参数是this 调用如下 3.out的用法 一定要给a赋值 这种写法不行 这样才行 4.匿名类 5.委托的使用 无论是匿名委托,还是具命委托,委托实例化后一定要…...
循环神经网络(Recurrent Neural Network, RNN)与 Transformer
循环神经网络(RNN)与 Transformer 1. 循环神经网络(RNN)简介 1.1 RNN 结构 循环神经网络(Recurrent Neural Network, RNN)是一种适用于处理序列数据的神经网络。其核心特点是通过隐藏状态(Hi…...
力扣45.跳跃游戏
45. 跳跃游戏 II - 力扣(LeetCode) 代码区: #include<vector> class Solution {public:int jump(vector<int>& nums) {int ans[10005] ;memset(ans,1e4,sizeof(ans));ans[0]0;for(int i0;i<nums.size();i){for(int j1;j…...
招聘面试季--方法论--如何从零到-规划一个新的app产品
规划一个新APP产品的系统化步骤及关键要点: 一、需求验证阶段 明确目标用户与核心需求 通过用户调研(问卷、访谈)定义目标人群的痛点和场景,例如购物类APP需优先满足浏览、支付等核心需求。判断APP的必要性:若功…...
MacOS安装 nextcloud 的 Virtual File System
需求 在Mac上安装next cloud实现类似 OneDrive 那样,文件直接保存在服务器,需要再下载到本地。 方法 在 官网下载Download for desktop,注意要下对版本,千万别下 Mac OS默认的那个。 安装了登录在配置过程中千万不要设置任何同…...
OpenCV Imgproc 模块使用指南(Python 版)
一、模块概述 imgproc 模块是 OpenCV 的图像处理核心,提供从基础滤波到高级特征提取的全流程功能。核心功能包括: 图像滤波:降噪、平滑、锐化几何变换:缩放、旋转、透视校正颜色空间转换:BGR↔灰度 / HSV/Lab 等阈值…...
C/C++蓝桥杯算法真题打卡(Day6)
一、P8615 [蓝桥杯 2014 国 C] 拼接平方数 - 洛谷 方法一:算法代码(字符串分割法) #include<bits/stdc.h> // 包含标准库中的所有头文件,方便编程 using namespace std; // 使用标准命名空间,避免每次调用…...
ORACLE RAC ASM双存储架构下存储部分LUN异常的处理
早上接到用户电话,出现有表空间不足的告警,事实上此环境经常巡检并且有告警系统,一开始就带着有所疑惑的心理,结果同事在扩大表空间时,遇到报错 ORA-15401/ORA-17505,提示ASM空间满了: ALERT日志࿱…...
【设计模式】SOLID 设计原则概述
SOLID 是面向对象设计中的五大原则,不管什么面向对象的语言, 这个准则都很重要,如果你没听说过,赶紧先学一下。它可以提高代码的可维护性、可扩展性和可读性,使代码更加健壮、易于测试和扩展。SOLID 代表以下五个设计原…...
从边缘到核心:群联云防护如何重新定义安全加速边界?
一、安全能力的全方位碾压 1. 协议层深度防护 四层防御: 动态过滤畸形TCP/UDP包(如SYN Flood),传统CDN仅限速率控制。技术示例:基于AI的协议指纹分析,拦截异常连接模式。 七层防御: 精准识别业…...
others-rustdesk远程
title: others-rustdesk远程 categories: Others tags: [others, 远程] date: 2025-03-19 10:19:34 comments: false mathjax: true toc: true others-rustdesk远程, 替代 todesk 的解决方案 前篇 官方 服务器 - https://rustdesk.com/docs/zh-cn/self-host/rustdesk-server-o…...
记录 macOS 上使用 Homebrew 安装的软件
Homebrew 是 macOS 上最受欢迎的软件包管理器之一,能够轻松安装各种命令行工具和 GUI 应用。本文记录了我通过 Homebrew 安装的各种软件,并对它们的用途和基本使用方法进行介绍。 🍺 Homebrew 介绍 Homebrew 是一个开源的包管理器ÿ…...
springmvc中使用interceptor拦截
HandlerInterceptor 是Spring MVC中用于在请求处理之前、之后以及完成之后执行逻辑的接口。它与Servlet的Filter类似,但更加灵活,因为它可以访问Spring的上下文和模型数据。HandlerInterceptor 常用于日志记录、权限验证、性能监控等场景。 ### **1. 创…...
C++基础 [八] - list的使用与模拟实现
目录 list的介绍 List的迭代器失效问题 List中sort的效率测试 list 容器的模拟实现思想 模块分析 作用分析 list_node类设计 list 的迭代器类设计 迭代器类--存在的意义 迭代器类--模拟实现 模板参数 和 成员变量 构造函数 * 运算符的重载 运算符的重载 -- 运…...
使用excel.EasyExcel实现导出有自定义样式模板的excel数据文件,粘贴即用!!!
客户要求导出的excel文件是有好看格式的,当然本文举例模板文件比较简单,内容丰富的模板可以自行设置,话不多说,第一步设置一个"好看"的excel文件模板 上面要注意的地方是{.变量名} ,这里的变量名对应的就是…...
Spring Boot 集成 Elasticsearch怎样在不启动es的情况下正常启动服务
解释 在spingboot 集成es客户端后,每当服务启动时,服务默认都会查看es中是否已经创建了对应的索引,如果没有索引则创建。基于上面的规则我们可以通过配置不自动创建索引来达到在没有es服务的情况下正常启动服务。 解决办法 在entity类的Docu…...
Java面试黄金宝典8
1. 什么是 Spring MVC 定义 Spring MVC 是 Spring 框架里用于构建 Web 应用程序的模块,它严格遵循 MVC(Model - View - Controller)设计模式。这种设计模式把应用程序清晰地划分成三个主要部分: Model(模型࿰…...
JVM常见概念之条件移动
问题 当我们有分支频率数据时,有什么有趣的技巧可以做吗?什么是条件移动? 基础知识 如果您需要在来自一个分支的两个结果之间进行选择,那么您可以在 ISA 级别做两件不同的事情。 首先,你可以创建一个分支ÿ…...
Android AI ChatBot-v1.6.3-28-开心版[免登录使用GPT-4o和DeepSeek]
Android AI ChatBot- 链接:https://pan.xunlei.com/s/VOLi1Ua071S6QZBGixcVL5eeA1?pwdp3tt# 免登录使用GPT-4o和DeepSeek...
集成学习(上):Bagging集成方法
一、什么是集成学习? 在机器学习的世界里,没有哪个模型是完美无缺的。就像古希腊神话中的"盲人摸象",单个模型往往只能捕捉到数据特征的某个侧面。但当我们把多个模型的智慧集合起来,就能像拼图一样还原出完整的真相&a…...
DeepSeek R1 本地部署指南 (3) - 更换本地部署模型 Windows/macOS 通用
0.准备 完成 Windows 或 macOS 安装: DeepSeek R1 本地部署指南 (1) - Windows 本地部署-CSDN博客 DeepSeek R1 本地部署指南 (2) - macOS 本地部署-CSDN博客 以下内容 Windows 和 macOS 命令执行相同: Windows 管理员启动:命令提示符 CMD ma…...
【TI MSPM0】Timer学习
一、计数器 加法计数器:每进入一个脉冲,就加一减法计算器:每进入一个脉冲,就减一 当计数器减到0,触发中断 1.最短计时时间 当时钟周期为1khz时,最短计时时间为1ms,最长计时时间为65535ms 当时…...
Windows部署deepseek R1训练数据后通过AnythingLLM当服务器创建问答页面
如果要了解Windows部署Ollama 、deepseek R1请看我上一篇内容。 这是接上一篇的。 AnythingLLM是一个开源的全栈AI客户端,支持本地部署和API集成。它可以将任何文档或内容转化为上下文,供各种语言模型(LLM)在对话中使用。以下是…...
重删算法中的Bloom滤波器详解与C++实现
一、Bloom滤波器基础概念 Bloom滤波器(Bloom Filter)是一种空间高效的概率型数据结构,用于快速判断某个元素是否存在于集合中。其核心特性: 存在不确定性:可能出现假阳性(False Positive)&…...
信奥赛CSP-J复赛集训(模拟算法专题)(27):P5016 [NOIP 2018 普及组] 龙虎斗
信奥赛CSP-J复赛集训(模拟算法专题)(27):P5016 [NOIP 2018 普及组] 龙虎斗 题目背景 NOIP2018 普及组 T2 题目描述 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n n n 个兵营(自左至右编号 1 ∼ n 1 \sim n 1∼n),相邻编号的兵营之间…...
多模态大模型常见问题
1.视觉编码器和 LLM 连接时,使用 BLIP2中 Q-Former那种复杂的 Adaptor 好还是 LLaVA中简单的 MLP 好,说说各自的优缺点? Q-Former(BLIP2): 优点:Q-Former 通过查询机制有效融合了视觉和语言特征…...
