如何配置和使用自己的私有 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 容器:

bash 复制代码
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

    bash 复制代码
    sudo apt-get update
    sudo apt-get install apache2-utils

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

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

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

    bash 复制代码
    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 文件

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

  • 重启 Docker 服务

bash 复制代码
sudo systemctl restart docker

4. 推送与拉取镜像

4.1 推送镜像到私有 Docker Registry
  1. 登录到私有 Docker Registry: 在执行任何操作前,必须先登录你的私有仓库:
bash 复制代码
docker login <你的服务器公网IP>:8089
  • 系统会提示你输入用户名和密码。成功登录后,你可以推送镜像。

  • 推送镜像

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

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

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

5. 保证 Docker Registry 的安全性

5.1 开放必要的端口

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

bash 复制代码
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 效率。

相关推荐
多多*17 分钟前
OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发
linux·服务器·前端·ubuntu·docker·前端框架
卑微的码蚁19 分钟前
服务器相关问题
运维·服务器
博洋科技21 分钟前
网站建设的服务器该如何选择?
运维·服务器·网站建设·保定响应式网站建设·保定h5网站建设·保定网站建设
人类群星闪耀时25 分钟前
服务器管理:从零开始的服务器安装与配置指南
运维·服务器
NiNg_1_2341 小时前
使用Docker Compose一键部署
运维·docker·容器
萠哥啥都行1 小时前
Linux安装Docker以及Docker入门操作
运维·docker·容器
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
小江湖19941 小时前
元数据保护者,Caesium压缩不丢重要信息
运维·学习·软件需求·改行学it
gopher95111 小时前
linux驱动开发-中断子系统
linux·运维·驱动开发
汀、人工智能2 小时前
修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
docker·容器