如何配置和使用自己的私有 Docker Registry
Docker Registry 是 Docker 镜像仓库的核心组件,它可以存储和分发 Docker 镜像。在实际应用中,你可能希望有一个自己的私有 Docker Registry,用于安全地存储公司内部的镜像或个人项目的镜像。本文将详细介绍如何在服务器上搭建私有 Docker Registry,并确保它的安全性,使其能够只被授权用户访问。
目录:
- 什么是 Docker Registry?
- 搭建私有 Docker Registry
- 运行 Docker Registry
- 设置用户名和密码
- 配置客户端访问 Docker Registry
- 修改客户端的
daemon.json
- 修改客户端的
- 推送与拉取镜像
- 推送镜像到私有 Docker Registry
- 从私有 Docker Registry 拉取镜像
- 保证 Docker Registry 的安全性
- 开放必要的端口
- 设置身份验证
- 使用 HTTPS 加密通信
- 总结
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
工具来生成用户名和密码:
-
安装
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
-
登录到私有 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 拉取镜像
-
拉取镜像:
docker pull <你的服务器公网IP>:8089/my-image
-
这将从你的私有仓库中拉取名为
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 证书。以下是大致步骤:
- 安装 Nginx 并申请 Let's Encrypt 证书。
- 将 Nginx 配置为监听 443 端口,并将请求反向代理到 Docker Registry 的 5000 端口。
- 更新客户端的
daemon.json
文件,移除insecure-registries
配置,并使用 HTTPS 访问私有 Docker Registry。
6. 总结
通过上述步骤,你可以成功搭建并配置一个安全的私有 Docker Registry。它允许你将 Docker 镜像安全地推送到私有仓库,并根据需要从中拉取镜像。通过设置身份验证和防火墙规则,你可以确保这个私有仓库不会被未经授权的用户访问。此外,使用 HTTPS 可以进一步增强安全性,避免敏感信息在传输过程中泄露。
搭建自己的私有 Docker Registry 后,整个团队可以快速、可靠地分发和管理 Docker 镜像,而不依赖于第三方服务。这不仅提高了安全性,也大大提升了 DevOps 效率。