当前位置: 首页 > article >正文

如何配置和使用自己的私有 Docker Registry

Docker Registry 是 Docker 镜像仓库的核心组件,它可以存储和分发 Docker 镜像。在实际应用中,你可能希望有一个自己的私有 Docker Registry,用于安全地存储公司内部的镜像或个人项目的镜像。本文将详细介绍如何在服务器上搭建私有 Docker Registry,并确保它的安全性,使其能够只被授权用户访问。

目录:
  1. 什么是 Docker Registry?
  2. 搭建私有 Docker Registry
    • 运行 Docker Registry
    • 设置用户名和密码
  3. 配置客户端访问 Docker Registry
    • 修改客户端的 daemon.json
  4. 推送与拉取镜像
    • 推送镜像到私有 Docker Registry
    • 从私有 Docker Registry 拉取镜像
  5. 保证 Docker Registry 的安全性
    • 开放必要的端口
    • 设置身份验证
    • 使用 HTTPS 加密通信
  6. 总结

1. 什么是 Docker Registry?

Docker Registry 是存储 Docker 镜像的服务器端应用,它可以用于存储、管理、共享镜像。Docker 官方提供了一个公开的 Docker Hub,但对于许多企业来说,出于安全性或管理需求的考虑,往往需要自建私有 Docker Registry。自建私有仓库可以帮助你:

  • 保持敏感镜像的私密性。
  • 通过局域网或内网加速镜像的拉取和分发。
  • 提供更强的访问控制。

2. 搭建私有 Docker Registry

2.1 运行 Docker Registry

首先,我们需要在服务器上运行 Docker Registry。你可以使用以下命令快速启动一个 Docker Registry 容器:
 

docker run -d -p 8089:5000 --restart=always --name registry \
  -v /myregistry/data:/var/lib/registry \
  registry:2

解释:

  • -p 8089:5000:将宿主机的 8089 端口映射到容器内部的 5000 端口,容器内部的 Docker Registry 服务默认监听 5000 端口。
  • -v /myregistry/data:/var/lib/registry:将宿主机的 /myregistry/data 目录挂载到容器内部,用于持久化存储镜像数据。
  • --restart=always:确保容器在 Docker 重启或失败时会自动重启。

此时,Docker Registry 应该已经启动,并通过 http://<你的服务器公网IP>:8089 可以访问到它。

2.2 设置用户名和密码

默认情况下,Docker Registry 是公开的,任何人都可以通过访问你的服务器 IP 来拉取和推送镜像。为了保护你的私有仓库,应该为 Docker Registry 配置用户名和密码进行身份验证。

首先,你需要安装 htpasswd 工具来生成用户名和密码:

  1. 安装 htpasswd

    sudo apt-get update
    sudo apt-get install apache2-utils
    

    2.创建用户名和密码: 使用 htpasswd 命令创建加密的用户名和密码文件: 
 

mkdir -p /myregistry/auth
htpasswd -Bc /myregistry/auth/htpasswd myusername
  • 你会被提示输入密码并确认。这样会生成一个 htpasswd 文件,其中存储了加密后的用户名和密码。

    3.启动带身份验证的 Docker Registry: 使用以下命令重新启动 Docker Registry,并添加身份验证:
     

    docker run -d -p 8089:5000 --restart=always --name registry \
      -v /myregistry/data:/var/lib/registry \
      -v /myregistry/auth:/auth \
      -e "REGISTRY_AUTH=htpasswd" \
      -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
      -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
      registry:2
    

    此时,Docker Registry 启用了基本身份验证,只有通过验证的用户才能推送或拉取镜像。


    3. 配置客户端访问 Docker Registry

    在客户端上推送或拉取镜像时,需要先登录 Docker Registry。首先,确保 Docker 客户端知道如何访问你的私有仓库,特别是如果你没有使用 HTTPS。

    3.1 修改客户端的 daemon.json

    如果你没有为 Docker Registry 配置 HTTPS,那么你需要在客户端的 Docker 中允许通过 HTTP 访问私有仓库。可以通过编辑 /etc/docker/daemon.json 文件来实现:

  • 编辑 daemon.json 文件
     

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://<阿里云镜像加速器>"],
      "insecure-registries": ["<你的服务器公网IP>:8089"]
    }
    EOF
    
  • 这会告诉 Docker 使用镜像加速器,同时允许通过 HTTP 访问你的私有 Docker Registry。

  • 重启 Docker 服务

sudo systemctl restart docker

4. 推送与拉取镜像

4.1 推送镜像到私有 Docker Registry
  1. 登录到私有 Docker Registry: 在执行任何操作前,必须先登录你的私有仓库:

docker login <你的服务器公网IP>:8089
  • 系统会提示你输入用户名和密码。成功登录后,你可以推送镜像。

  • 推送镜像

    docker build -t <你的服务器公网IP>:8089/my-image .
    docker push <你的服务器公网IP>:8089/my-image
    

    这里 my-image 是你想要推送的镜像名称。

4.2 从私有 Docker Registry 拉取镜像
  1. 拉取镜像

docker pull <你的服务器公网IP>:8089/my-image
  1. 这将从你的私有仓库中拉取名为 my-image 的镜像。


5. 保证 Docker Registry 的安全性

5.1 开放必要的端口

确保你的服务器防火墙和云服务提供商的安全组允许访问 8089 端口。你可以通过以下命令来开放这个端口:
 

sudo ufw allow 8089

此外,在云服务器的管理控制台中,确保安全组规则也允许 8089 端口的入站访问。

5.2 设置身份验证

如上文所述,使用 htpasswd 工具为 Docker Registry 设置用户名和密码,可以有效防止未授权用户访问。

5.3 使用 HTTPS 加密通信

为了避免使用 HTTP 明文传输密码,建议你为 Docker Registry 配置 HTTPS 证书。可以使用 Nginx 作为反向代理,配置 SSL/TLS 证书。以下是大致步骤:

  1. 安装 Nginx 并申请 Let's Encrypt 证书。
  2. 将 Nginx 配置为监听 443 端口,并将请求反向代理到 Docker Registry 的 5000 端口。
  3. 更新客户端的 daemon.json 文件,移除 insecure-registries 配置,并使用 HTTPS 访问私有 Docker Registry。

6. 总结

通过上述步骤,你可以成功搭建并配置一个安全的私有 Docker Registry。它允许你将 Docker 镜像安全地推送到私有仓库,并根据需要从中拉取镜像。通过设置身份验证和防火墙规则,你可以确保这个私有仓库不会被未经授权的用户访问。此外,使用 HTTPS 可以进一步增强安全性,避免敏感信息在传输过程中泄露。

搭建自己的私有 Docker Registry 后,整个团队可以快速、可靠地分发和管理 Docker 镜像,而不依赖于第三方服务。这不仅提高了安全性,也大大提升了 DevOps 效率。


http://www.kler.cn/a/312233.html

相关文章:

  • 十五、Linux线程(二)
  • 数据结构:跳表实现(C++)
  • 下载mysql的jar,添加至jmeter中,编写jdbc协议脚本1106
  • (linux驱动学习 - 12). IIC 驱动实验
  • CSS外边距合并及解决办法
  • vue3使用easy-player播放hls监控流
  • python的6种常用数据结构
  • 3.大语言模型LLM的公开资源(API、语料库、算法库)
  • Python中的树与图:构建复杂数据结构的艺术
  • 图论三元环(并查集的高级应用)
  • 天润融通创新功能,将无效会话转化为企业新商机
  • 青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
  • Python 集合的魔法:解锁高效数据处理的秘密
  • 工厂模式(一):简单工厂模式
  • Web后端服务平台解析漏洞与修复、文件包含漏洞详解
  • 【Git原理与使用】多人协作与开发模型(2)
  • 杀死端口占用的进程
  • 常用函数式接口的使用
  • 3D GS 测试自己的数据
  • react 甘特图之旅
  • C语言 | Leetcode C语言题解之第405题数字转换为十六进制数
  • SpringBoot 数据库表结构文档生成
  • 深入Redis:核心的缓存
  • 【计算机网络 - 基础问题】每日 3 题(十四)
  • 百易云资产系统 house.save.php SQL注入
  • tomcat知识