如何配置和使用自己的私有 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 效率。

相关推荐
运维&陈同学1 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列
是阿建吖!1 小时前
【Linux】进程状态
linux·运维
明明跟你说过1 小时前
Linux中的【tcpdump】:深入介绍与实战使用
linux·运维·测试工具·tcpdump
O&REO2 小时前
单机部署kubernetes环境下Overleaf-基于MicroK8s的Overleaf应用部署指南
云原生·容器·kubernetes
运维小文2 小时前
K8S资源限制之LimitRange
云原生·容器·kubernetes·k8s资源限制
登云时刻3 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Mr_Xuhhh3 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
朝九晚五ฺ10 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
Kkooe11 小时前
GitLab|数据迁移
运维·服务器·git
wuxingge11 小时前
k8s1.30.0高可用集群部署
云原生·容器·kubernetes