docker Registry搭建私有仓库 | docker配置镜像仓库 17

作者 : 慕源网 本文共4051个字,预计阅读时间需要11分钟 发布时间: 2021-12-13 共352人阅读

docker配置镜像仓库

Docker Registry 用于存储 Docker 镜像,即只读模板。换句话说,Docker Registry 存储了 Docker 仓库,这些仓库包含不同标记版本的 Docker 镜像。它是一个开源、无状态且高度可扩展的服务器端应用程序。它允许我们控制我们想要存储 Docker 镜像的位置,我们完全拥有我们的镜像分发管道并将其与内部开发工作流程集成。Docker Registry 仅与 Docker 引擎版本 1.6.0 或更高版本兼容。我们可以使用默认存储驱动程序,即 POSIX 文件系统进行开发或小型部署,但建议使用支持的基于云的存储驱动程序,如 S3、Microsoft Azure、Openstack Swift 等。

docker Registry搭建私有仓库 | docker配置镜像仓库 17

docker 搭建私有仓库

我们可以运行我们自己的仓库来与我们的 CI/CD 管道集成。因此,如果对源代码有任何提交,SCM 工具将触发在我们的 CI 系统上构建,如果构建成功,它会将新映像推送到我们的仓库。然后,仓库中心发送将在临时环境中触发部署的通知。我们可以使用 CI/CD 模型在大型机器集群上快速部署新映像。我们可以使用 Docker Registry 在隔离网络内共享 Docker 镜像。它支持 TLS 和基本身份验证,以保护对我们托管镜像的访问。

我们可以使用以下命令将私有仓库作为容器运行:

代码:

$docker run -d -p 5000:5000 --restart=always --name my-registry registry:2
$docker tag alpine localhost:5000/alpine
$docker push localhost:5000/alpine

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

在上面的示例中,我们使用“registry:2”Docker 镜像启动了一个名为“my-registry”的registry容器,它正在侦听端口 5000 并且重新启动选项设置为“always”,因此如果容器在任何情况下停止,docker守护进程将自动启动它。

现在,如果我们想将任何 Docker 镜像推送到这个私有仓库,我们必须使用 ‘localhost:5000/<Docker_Image_name>’ 重新标记现有的 Docker 镜像,因为 Docker 镜像的第一部分告诉了这个镜像所在的仓库应该推。这也适用于我们拉取 Docker 镜像的情况。但是,如果我们只指定 Docker 镜像名称,Docker 守护进程默认会在 Docker 镜像名称之前添加 ‘docker.io/library/’ 并指示从官方 Docker Hub 拉取镜像。例如,如果我们想从官方 Docker Hub 中拉取 ‘ubuntu’ Docker 镜像,我们运行如下命令:

代码:

$docker pull ubuntu

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

当我们尝试推送 ‘alpine’ Docker Image 时,同样的事情发生了。Docker 守护进程会自动将“docker.io/library/”添加到镜像并尝试将其推送到官方 Docker Hub,但是它需要身份验证才能将镜像推送到官方 Docker Hub。我们可以创建我们的 Docker ID 并将 Docker 镜像推送到我们的 Docker ID,但是我们再次使用我们的 Docker ID 和 Docker 镜像名称重新标记 Docker 镜像。

代码:

$docker push alpine

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

代码:

$docker tag alpine sarab303/alpine
$docker push sarab303/alpine

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

我们可以通过附加选项参数或修改选项来更改仓库的基本配置。例如,更改默认侦听端口、自定义存储位置、实施 TLS 以保护仓库等。

假设我们已经有一个应用程序在监听 5000 端口,并且我们想在 5003 端口上公开仓库,我们可以这样做:

代码:

$docker run -d -p 5003:5000 --restart=always --name my-registry registry:2
$docker tag alpine localhost:5003/alpine
$docker push localhost:5003/alpine

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

如果我们想使用除默认端口之外的其他端口,registry在容器内侦听,我们也可以通过使用环境变量 REGISTRY_HTTP_ADDR 来更改它,如下面的命令所示:

代码:

$docker run -d \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5003 \
-p 5003:5003 \
--name my-registry \
registry:2

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

我们可以自定义存储位置来持久存储registry的存储库,我们可以通过将主机位置或卷挂载到容器来实现这一点。在这里,我们如下运行registry容器以将主机目录“/mnt/registry”绑定到registry容器“/var/lib/registry/”。

代码:

$docker run -d \
-p 5000:5000 \
--restart=always \
--name my-registry \
-v /mnt/registry:/var/lib/registry \
registry:2
$docker tag alpine localhost:5000/alpine
$docker push localhost:5000/alpine
$docker container stop my-registry &&docker container rm my-registry
$docker image rm alpine localhost:5000/alpine
$docker run -d \
-p 5000:5000 \
--restart=always \
--name my-registry \
-v /mnt/registry:/var/lib/registry \
registry:2
$docker pull localhost:5000/alpine

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

docker Registry搭建私有仓库 | docker配置镜像仓库 17

在上面的示例中,启动了一个名为“my-registry”的新本地仓库,并将“alpine”Docker 镜像标记为“localhost:5000/alpine”并将其推送到本地仓库,然后停止registry容器并将其删除。还从主机中删除了本地可用的“alpine”和“localhost:5000/alpine”Docker 镜像。现在,再次启动一个新的registry容器并将相同的主机目录安装到该容器并尝试拉取之前推送的 Docker 镜像,即“localhost:5000/alpine”,并且成功。

但是,上述实现仅用于测试目的,因为没有实现身份验证机制。让我们通过使用以下命令生成“htpasswd”文件和自签名证书来为我们的私有仓库实现基本身份验证。

代码:

$mkdirauth
$docker run --entrypointhtpasswd registry:2 -Bbn user1 P@ssw0rd>auth/htpasswd
$mkdir certs
$ opensslreq \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

docker Registry搭建私有仓库 | docker配置镜像仓库 17

在上面的示例中,我们创建了一个名为“auth”和“certs”的目录,分别用于存储 htpasswd 凭据和自签名证书。首先,我们使用密码“P@ssw0rd”创建用户“user1”并将其存储在“auth”文件夹下的“htpasswd”文件中,然后使用openssl生成自签名证书并存储“domain.key”和“ ‘certs’ 文件夹中的 domain.crt’ 文件将所有详细信息保留为空白,服务器的通用名称除外。

现在,我们创建一个带有附加选项的新容器,并将 certs 和 auth 文件夹安装到其中。

代码:

$docker run -d -p 443:443 --restart=always --name my-registry \
-v /home/ssingh/certs:/certs \
-v /home/ssingh/auth:/auth \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

代码:

$docker tag nginx localhost:443/nginx
$docker push localhost:443/nginx
$docker login localhost:443
$docker push localhost:443/nginx

输出:

docker Registry搭建私有仓库 | docker配置镜像仓库 17

在上面的快照中,将 ‘nginx’ Docker 映像标记为 ‘localhost:443/nginx’ 并尝试推送到新设置的私有仓库,但是我们可以看到它给出了“no basic auth credentials”的错误。使用“user1”的凭据登录到私有仓库,并且映像已成功推送到私有仓库。

结论

Docker Registry 是一个很好的托管预私有仓库的解决方案,但是,Docker Registry 有其他替代方案,例如 Docker Hub 可以免费使用,Docker 托管仓库,但需要支付额外的功能,以及 DTR,即 Docker Trusted Registry 是商业支持的仓库版本,随 Docker 企业版一起提供。

推荐文章

这是 docker Registry搭建私有仓库的指南。在这里,我们将讨论 Docker Registry 的介绍以及 docker配置镜像仓库。您也可以查看以下文章以了解更多信息 –

本文是docker快速入门教程系列的一部分您也可以查看以了解更多信息 –

 


慕源网 » docker Registry搭建私有仓库 | docker配置镜像仓库 17

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录