局域网内部署 Docker Registry

简介:

在局域网内部署 Docker Registry 可以极大的提升平时 pull、push 镜像的速度,从而缩短自动化操作的过程。同时也可以缓解带宽不足的问题,真是一举多得。本文将从创建单机的 Docker Registry 开始,逐步完成局域网内可用的 Docker Registry 的创建,并重点解释如何使用 IP 地址访问 Registry 的方法。

注意,本文假设你已经在使用的 OS 中安装了 docker 引擎。

创建本机使用的 Docker Registry

这是一个非常简单的过程,简单到只需要运行一个 docker 容器就可以了:

$ docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/registry:/var/lib/registry \
registry:2

查看一下 5000 端口是否已被监听:

看起来还不错,让我们向本地的 Registry 中推送一个镜像试试。
先找个镜像,打上自己的 tag:

$ docker pull ubuntu
$ docker tag ubuntu localhost:5000/myubuntu:20170520

从上图我们可以看到,两个镜像完全是一样的,只不过我们创建的 tag 名称不一样而已。
接下来把镜像 push 到本地的 Registry 中:

$ docker push localhost:5000/myubuntu:20170520

上图显示 push 操作成功了,那再看看文件系统发生了什么变化:

在我们挂载的 ~/registry 目录的子目录中出现了保存镜像 myubuntu 的目录,在这个目录下保存了镜像相关的数据。
最后我们看看能不能从自己的库中 pull 镜像。先把本地的镜像 localhost:5000/myubuntu:20170520 删除掉:

$ docker rmi localhost:5000/myubuntu:20170520

然后从本地的库中 pull 镜像:

$ docker pull localhost:5000/myubuntu:20170520

是不是 pull 操作已经成功啦!

创建局域网内可用的 Docker Registry

前面创建的 Registry 可以在局域网内使用吗?我们来做个试验。
运行 Registry 的机器 IP 为:192.168.171.156,我们在局域网中的另一台机器上创建 tag 并执行推送命令:

推送失败了!原因是为了保证安全,跨机的镜像推送操作默认采用的都是 https 协议。也就是说,为了在局域网内使用 Docker Registry, 我们必须配置 https 版的 Registry 服务器。

选择通过 IP 地址访问 registry

由于种种原因,笔者无法为这台 Docker Registry Server 提供一个有效的域名。好在它的 IP 地址是固定的,因此决定通过 IP 地址来访问这台 Registry 服务器。假设这台机器的 IP 地址为:10.32.2.140,下面的描述都以此 IP 地址为例。

创建自签名的证书

既然是在局域网中使用,因此不会大动干戈的去购买 https 证书,自己生成一个自签名的就足够了。但这也存在一个缺点,就是需要在作为客户端的 docker daemon 中安装这个根证书,本文的稍后部分会介绍这一步骤。

在 ubuntu 系统中,下面的命令会在 dcerts 目录下生成秘钥和自签名的证书:

openssl req \
    -newkey rsa:4096 -nodes -sha256 \
    -keyout dcerts/domain.key \
    -x509 -days 356 \
    -out dcerts/domain.crt

注意,在执行此命令前需要在当前目录下创建 dcerts 目录。此命令的细节本文就不解释了,有兴趣的同学去查 openssl 命令的帮助文档。

生成证书时,openssl 要求我们输入相关的信息。比如地域和公司、部门的信息。比较重要的是 Common Name,如果你是要为某个域名生成证书,那么这里就应该是你的域名。我们使用的是 IP 地址,所以我就想当然的把 IP 地址放在了这里。很遗憾的是这并不正确!如果拿此时生成的证书去配置 Docker Registry,我们将无法完成 pull/push 操作。配置的 Registry 根本无法在局域网中使用。
此处是一个很隐晦的 openssl 配置问题,当我们使用 IP 地址作为访问服务器的名称时就会碰到。解决的方法也很简单,就是在生成证书的配置文件中指定 subjectAltName 。打开文件 /etc/ssl/openssl.cnf,在 [v3_ca] 节点添加配置项:
subjectAltName = IP:10.32.2.140

保存并退出,然后重新执行上面生成证书的命令。

运行 https 版的 Registry

有了前面创建的证书,我们就可以运行新版的 Registry 了:

复制代码
$ docker run -d -p 5000:5000 \
    --restart=always \
    --name registry \
    -v `pwd`/dstorage:/var/lib/registry \
    -v `pwd`/dcerts:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    registry:2
复制代码

命令中我们把证书所在的目挂载到了容器的 /certs 目录。然后分别指定了容器的环境变量 REGISTRY_HTTP_TLS_CERTIFICATE 和 REGISTRY_HTTP_TLS_KEY,这两个环境变量会引用我们常见的秘钥文件和证书文件。
好了,到目前为止新版的 Docker Registry 已经可以提供服务了。

在 client 端设置根证书

为了快速、方便和省钱,我们没有去购买商业版的证书。这种方式的弊端是:必须把我们生成的根证书安装到每一个需要访问 Registry 服务器的客户端上。具体做法如下:
把前面生成的证书文件 dcerts/domain.crt 复制到需要访问 Registry 服务器的机器上。放到目录 /etc/docker/certs.d/10.32.2.140:5000/ 中,并重命名为 ca.crt。当然这个目录需要你自己创建。最后重新启动 docker 服务:

$ sudo systemctl restart docker.service        // 不同的系统重启服务的命令可能不一样。

终于大功告成了,让我们往 Registry 中推送一个镜像吧:

看,redis:3.2 已经被 tag 为 10.32.2.140:5000/myredis:20170520,并推送到了局域网中的 Docker Registry Server 中。
为了验明正身,我们还是到 10.32.2.140 上去看一下文件存储的状态:

从这张图中我们可以看到,myredis:20170520 真的已经被 Registry 保存到文件系统中了。

总结

由于安全性的考虑,配置局域网内可用的 Docker Registry 稍微有点麻烦。尤其是使用 IP 地址的配置方式,需要配置证书的 subjectAltName 才能正常工作。但完成配置后,使用局域网内的 Registry 还是很爽的。希望本文对有类似需求的朋友们有所帮助。


本文转自sparkdev博客园博客,原文链接:http://www.cnblogs.com/sparkdev/p/6890995.html,如需转载请自行联系原作者

相关文章
|
Java Docker 容器
|
Docker 容器
docker使用阿里云镜像仓库
docker使用阿里云镜像仓库1:阿里云docker仓库 https://dev.aliyun.com/search.html 2:进去注册帐号后,点击自己的管理中心。 3:在管理中心点击加速器,右边面板会有你的加速地址,右边面板下面有详细设置步骤。
39690 2
|
缓存 Linux
centos yum的配置文件 repo文件详解
什么是repo文件?repo文件是Fedora中yum源(软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!YUM的工作原理并不复杂,每一个 RPM软件的头(header)里面都会纪录该软件的依赖关系,那么如果可以将该头的内容纪录下来并且进行分析,可以知道每个软件在安装之前需要额外安装 哪些基础软件。
3092 0
|
2月前
|
人工智能 自然语言处理 API
阿里云千问Qwen3.5-Omni:原生全模态大模型核心功能全解析
在通用人工智能向全模态感知演进的关键阶段,阿里云千问推出的Qwen3.5-Omni,凭借原生端到端全模态架构、顶尖的音视频理解能力与丰富的交互特性,成为全模态大模型领域的标杆产品。该模型彻底打破文本、图像、音频、视频的模态壁垒,实现“看、听、说、读、思”一体化感知,在215项音频与音视频任务中斩获SOTA成绩,全面对标并部分超越国际顶尖模型,同时提供Plus、Flash、Light三种尺寸版本,适配从高性能推理到低延迟实时交互的全场景需求。本文将从核心架构、基础能力、进阶功能、API调用、应用场景五大维度,全面解析Qwen3.5-Omni的功能特性,帮助开发者与企业用户快速掌握其核心价值与落地
837 2
|
开发工具
centos8  查看主机名和系统配置
centos8  查看主机名和系统配置
523 0
|
4月前
|
小程序 NoSQL 调度
外卖系统小程序开发怎么做?从平台搭建到配送系统完整解析
本文深度解析外卖系统小程序开发,涵盖用户端、商家后台、骑手配送端及平台管理后台四大核心模块,详解技术架构(UniApp/Java+MySQL+Redis+地图SDK)、订单流程、智能派单算法、实时消息推送与营销体系,助力商家打造低佣金、高自主、可沉淀私域流量的本地生活服务平台。(239字)
|
9月前
|
设计模式 人工智能 程序员
【架构演进】智能体来了(西南总部)深度解析:多智能体协作(Multi-Agent)系统的设计哲学与工程实践
本文探讨AI架构从单体大模型向多智能体系统(MAS)的范式跃迁,基于“智能体来了(西南总部)”技术研判,解析角色解耦、消息路由与共享记忆等核心设计,揭示如何构建高效协作的“数字蜂群”,推动分布式AI从理论走向工程化落地。
888 2
|
11月前
|
人工智能 自然语言处理 API
Dify+DeepSeek实战教程:从零搭建企业级AI应用
2025年,AI落地成本成关键。本文以Dify+DeepSeek-R1为核心,详解知识库、智能客服、代码生成、合同审核四大场景,手把手构建企业级AI应用流水线,助力开发者高效低成本实现AI转型。
|
11月前
|
边缘计算 JavaScript 前端开发
「玩透ESA」别只把 ESA 当 CDN 用!它的“边缘函数”如何极大扩展 DCDN 场景
阿里云ESA不止是CDN,更是一个可编程的边缘平台。通过边缘函数(ER),开发者能在全球3200+节点运行JavaScript代码,实现A/B测试、API鉴权、动态响应等场景,将逻辑前置到离用户最近处,实现毫秒级响应与源站减负,开启“编程思维”的边缘计算新时代。
731 1
|
运维 数据安全/隐私保护 Docker
Docker自建仓库之Docker Registry部署实战
关于如何使用Docker Registry镜像搭建本地私有Docker仓库的实战教程,包括了下载镜像、创建授权目录和用户名密码、启动Registry容器、验证端口和容器、测试登录仓库、上传和下载镜像的详细步骤。
5384 5

热门文章

最新文章