前言
本期,我们计划搭建一个 私有的 Docker 仓库,并实现一些基本的管理功能以及身份验证机制,以便更高效、安全地管理公司内部的 Docker 镜像。由于某些原因,我们在访问 Docker Hub 时遇到了一些障碍,可能是因为网络问题、访问限制或是其他原因。而且,随着公司项目的逐步展开,我们需要频繁地在不同的服务器上部署私有镜像。因此,拥有一个私有仓库不仅可以解决外部访问不便的问题,还能确保我们对镜像的控制和管理更加灵活。
通过搭建私有 Docker 仓库,我们可以:
- 提高镜像的访问速度:通过部署私有仓库,镜像存储和访问都能在本地完成,避免了从公共仓库拉取镜像时出现的延迟和带宽问题。
- 加强镜像管理:通过私有仓库,我们可以方便地管理公司内部的镜像版本,包括镜像的推送、拉取、删除等操作。所有的镜像都将集中存储,便于维护和跟踪。
- 增强安全性和合规性:私有仓库可以提供身份验证功能,确保只有授权人员才能访问和操作镜像。这样不仅能够保护公司内部镜像的安全性,还能确保合规性,防止泄露敏感信息。
- 支持离线部署:对于没有互联网连接的服务器或处于特殊网络环境中的机器,私有仓库将成为一个重要的支持点。我们可以确保在这些服务器上也能够顺利地部署和更新 Docker 镜像。
本次搭建的私有仓库将具备基础的管理功能,如镜像的上传、下载、删除等,并且会加入身份验证机制,确保镜像管理的安全性和权限控制。此外,我们也将关注仓库的可扩展性,以便未来能根据需要进行功能拓展或性能优化。
搭建私有仓库不仅能提高镜像的管理效率和部署速度,还能够降低与外部 Docker Hub 的依赖,提升公司内网部署的灵活性和自主性。这对于我们的项目开发和运维将带来非常大的帮助。
准备
我们将要用到以下一些东西,没错,私有仓库也是基于 docker 镜像进行管理的。
Docker registry 文档
https://github.com/distribution/distribution
UI界面
https://github.com/Joxit/docker-registry-ui
但是本期我们将使用宝塔面板来操作简化我们的流程,以便更多的新人朋友们能够友善的完成部署。
请提前解析一个域名到本机,需要申请 SSL 证书
docker push 操作通常需要 SSL(安全套接层)加密连接,尤其是当你将镜像推送到远程 Docker Registry 时。SSL/TLS 确保了数据在传输过程中是加密的,能够防止数据被第三方窃取或篡改。
{
"insecure-registries": ["myregistry.com"]
}
介绍
registry镜像
Docker Registry 是一个用于存储和管理 Docker 镜像的系统或服务,它是一个后端服务,可以存储一个或多个镜像。Docker Registry 允许用户上传、下载和管理 Docker 镜像文件,并且是 Docker 镜像的分发中心。
核心概念:
- Docker Registry 是一个镜像存储库,它可以是公共的(如 Docker Hub)或私有的。
- Docker Repository 是 Registry 内部组织镜像的方式,通常一个应用程序或者服务会对应一个 Repository,里面包含了该应用的多个版本镜像(tag)。
- Docker Image 是存储在 Registry 中的具体镜像,它是镜像的具体实例,可以被拉取(pull)到本地使用。
工作流程:
- Push:当用户构建一个 Docker 镜像后,使用
docker push
命令将镜像推送到 Docker Registry。这样,镜像就可以通过网络被其他人或其他机器下载和使用。 - Pull:当用户需要使用某个镜像时,可以通过
docker pull
命令从 Docker Registry 拉取该镜像。 - Tag:用户可以使用镜像标签(tag)来标识不同版本的镜像。例如,
myapp:latest
和myapp:v1.0
是同一个镜像的两个不同标签,指向镜像的不同版本。
Docker Registry 和 Docker Hub 的区别:
- Docker Registry 是一个镜像存储服务的概念,可以是任何地方的镜像存储服务。
- Docker Hub 是一个公共的、由 Docker 官方提供的 Docker Registry 服务,存储了很多常用的公共镜像,用户可以直接使用。
Docker Registry UI
Docker Registry UI 是一个图形用户界面(GUI)工具,用于与 Docker Registry 交互,帮助用户更方便地管理和浏览存储在 Docker Registry 中的镜像和仓库。虽然 Docker 自身提供了命令行工具用于与 Docker Registry 进行交互,但很多人倾向于使用 UI 来更直观地管理镜像、仓库、标签等内容。
常见的 Docker Registry UI 工具:
Portus
- Portus 是一个开源的 Docker Registry UI 和身份认证系统,它可以作为一个中间层来管理私有 Docker Registry。
特点:
- 用户认证和授权管理(LDAP、OAuth 支持)。
- 提供了一个基于 Web 的管理界面,方便浏览镜像和仓库。
- 监控功能,查看镜像的上传/下载情况。
- 能够管理镜像和镜像的标签。
安装:
- 可以通过官方文档中的步骤安装和配置 Portus,或者使用 Docker Compose 快速启动。
Docker Registry UI
- Docker Registry UI 是一个轻量级的 Web UI,用于访问和浏览 Docker Registry 中的镜像。
特点:
- 支持浏览镜像和标签。
- 轻量且易于配置。
- 支持 Docker Hub 和私有 Registry。
安装:
- 可以通过简单的 Docker 命令来启动
Harbor
- Harbor 是 VMware 提供的一个开源的 Docker Registry 解决方案,除了基本的 Registry 功能外,还提供了很多企业级的功能,比如:镜像扫描、角色-based 访问控制、镜像签名等。
特点:
- 支持用户和团队管理。
- 镜像的安全扫描和漏洞分析。
- 支持项目、用户角色管理。
- 提供友好的 Web UI。
安装:
- Harbor 使用 Docker Compose 进行部署,可以参考官方文档来进行安装。
操作实现
registry部署
打开宝塔-docker-线上镜像-搜索 registry 镜像。
创建容器-暴露 5000 端口,并允许外部访问(如果配置了反代就不需要了,我们后面会配置反代,所以不需要允许)。
映射-本机目录(这个自己选择)-权限读写-容器目录为/var/lib/registry
创建容器后-前往网站-添加反向代理
创建完成后申请SSL证书
然后访问网站发现是一片空白的,不要慌
访问/v2,返回响应,说明部署成功
registry-ui 部署
回到镜像搜索,docker-registry-ui-找到joxit/docker-registry-ui
创建容器-暴露端口 8080:80
返回 网站-找到反向代理
注意,如果是在 docker 管理中的网站的话 添加目录反代会有 bug。
访问反代目录,发现成功。
点击右上角添加网站
添加完成后,右下角会有提示 change to .....(这里没有截到图)
网站内显示没有镜像
添加简单的身份验证 和 其他配置
添加 http 认证
添加自定义配置
client_max_body_size 1000M; #这里是为了push大镜像的时候能够成功。
重新访问,发现需要登录才行,自此成功。
使用
查看当前镜像
docker image ls
拉取一个 hello-world 镜像
docker pull hello-world
docker image ls
查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 50296fefa2a2 2 months ago 625MB
hello-world latest ee301c921b8a 20 months ago 9.14kB
docker tag hello-world:latest docker.gzj2001.com/hello-world:latest
标记镜像到远程仓库
docker image ls
发现多了一个标记后的名字的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 50296fefa2a2 2 months ago 625MB
docker.gzj2001.com/hello-world latest ee301c921b8a 20 months ago 9.14kB
hello-world latest ee301c921b8a 20 months ago 9.14kB
docker push docker.gzj2001.com/hello-world
不带标签的话默认会使用 latest 标签
推送标记后的镜像
Using default tag: latest
The push refers to repository [docker.gzj2001.com/hello-world]
12660636fe55: Preparing
no basic auth credentials
发现验证失败,因为我们配置了http账户密码
docker login docker.gzj2001.com
登录我们刚刚搭建的私有仓库
Username: linweixin
Password:
Login Succeeded
登录成功
docker push docker.gzj2001.com/hello-world
再次推送,发现推送成功
Using default tag: latest
The push refers to repository [docker.gzj2001.com/hello-world]
12660636fe55: Pushed
latest: digest: sha256:a8ea96bb64d60208d6a56712042d1cf58aa4a7d3751b897b9320b0813c81cbb4 size: 524
查看 web ui 发现已经有推送后的内容了
保存我们修改过的镜像并上传
docker commit <container_id> <new_image_name>:<tag>
额外
推送到私有仓库时,通常需要 先 tag 镜像。这是因为 Docker 使用镜像的 标签(Tag) 来标识不同的版本,确保你推送到正确的镜像仓库和路径。
为什么需要 tag
?
- 指定仓库和镜像名称:
Docker 仓库(包括私有仓库)使用<仓库地址>/<用户名>/<镜像名称>:<标签>
的格式来标识镜像。在没有标签的情况下,Docker 会默认使用latest
标签。 - 私有仓库地址的要求:
如果你推送到私有仓库,镜像必须带有正确的仓库地址和标签。否则,Docker 会认为你推送的是到默认的公共仓库(如 Docker Hub)。
语法:
docker tag <source_image> <registry_url>/<repository>/<image_name>:<tag>
<source_image>
:本地已有的镜像名或 ID。<registry_url>
:私有仓库的地址,例如myregistry.com
。<repository>
:你的仓库名称(可以是用户名或组织名)。<image_name>
:镜像的名称。<tag>
:镜像的标签,例如v1.0
,latest
等。
示例:
假设你有一个名为 myapp
的本地镜像,并且你想将它推送到私有仓库 myregistry.com/myrepo
,标签为 v1.0
:
首先给镜像打标签:
docker tag myapp myregistry.com/myrepo/myapp:v1.0
推送到私有仓库:
docker push myregistry.com/myrepo/myapp:v1.0
例如,假设你有一个本地镜像 myapp
,直接推送到私有仓库:
docker push myregistry.com/myrepo/myapp
如果没有 tag
,Docker 会默认使用 latest
标签:
docker push myregistry.com/myrepo/myapp:latest
如果没有 latest
标签,或者你需要推送其他标签版本,则必须先进行 tag
操作。
关于我
我是一个爱折腾的文艺青年,喜欢计算机互联网等一些列新鲜的事物,关注我不迷路,和我一起在互联网的世界里面遨游吧~
发表评论 取消回复