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 容器:
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
工具来生成用户名和密码:
-
安装
htpasswd
:bashsudo 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,并添加身份验证:
bashdocker 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
文件 :bashsudo 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
- 登录到私有 Docker Registry: 在执行任何操作前,必须先登录你的私有仓库:
bash
docker login <你的服务器公网IP>:8089
-
系统会提示你输入用户名和密码。成功登录后,你可以推送镜像。
-
推送镜像:
bashdocker build -t <你的服务器公网IP>:8089/my-image . docker push <你的服务器公网IP>:8089/my-image
这里
my-image
是你想要推送的镜像名称。
4.2 从私有 Docker Registry 拉取镜像
- 拉取镜像:
bash
docker pull <你的服务器公网IP>:8089/my-image
- 这将从你的私有仓库中拉取名为
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 证书。以下是大致步骤:
- 安装 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 效率。