自建私有Docker Registry及Registry Browser
发布于2天前
前言
在国内拉取Docker镜像时,由于网络限制,直接从Docker Hub拉取镜像可能会遇到速度慢或无法拉取的问题。就算自己有国外服务器,拉完还要想办法弄到国内服务器,各种中转。虽然国内大厂有镜像服务,但也是不太方便,命名空间有限,还有点慢。所以就有了自建Registry的想法。
一、
我的服务器ip 192.210.xxx.xxx
准备使用的Registry域名 registry-docker.com(相当于官方源registry-1.docker.io)
目录结构:
/data/docker-registry/
├── auth/ # 认证文件
├── registry-data/ # 镜像数据
└── docker-compose.yml # 配置文件二、docker-compose.yml 配置文件
创建 /data/docker-registry/docker-compose.yml,内容如下:
version: '3'
services:
# 私有 Docker Registry(带认证,HTTP 模式)
registry:
image: registry:2
container_name: docker-registry
restart: always
ports:
- "5000:5000" # 暴露 5000 端口,供 registry-docker.com 反向代理
volumes:
- ./auth:/auth # 认证文件目录
- ./registry-data:/var/lib/registry # 镜像数据持久化
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=PrivateRegistry
- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
networks:
- registry-net
# Registry Browser(Web 管理端,端口 9090)
registry-browser:
image: klausmeyer/docker-registry-browser
container_name: registry-browser
restart: always
ports:
- "9090:8080" # 对外暴露 9090 端口
environment:
- SECRET_KEY_BASE=${SECRET_KEY} # 从环境变量获取密钥
- DOCKER_REGISTRY_URL=http://registry:5000 # 内部直接访问 Registry 服务
- DOCKER_REGISTRY_USER=admin123 # 你的用户名
- DOCKER_REGISTRY_PASSWORD=admin123456 # 你的密码
depends_on:
- registry # 等待 Registry 启动后再启动
networks:
- registry-net
networks:
registry-net: # 自定义网络,服务间可通过服务名访问
driver: bridge三、初始化部署步骤
进入目录并创建认证文件
cd /data/docker-registry # 生成认证文件(用户名 admin,按提示输入密码) htpasswd -Bc auth/htpasswd admin生成 SECRET_KEY 并启动服务
# 生成密钥(临时环境变量,仅本次启动有效) export SECRET_KEY=$(openssl rand -hex 64) # 启动所有服务 docker-compose up -d配置 Docker 客户端信任 HTTP 仓库
客户端需添加以下配置(避免 HTTP 访问被拒绝):# 编辑 Docker 配置 sudo vim /etc/docker/daemon.json添加内容:
{ "insecure-registries": [ "registry-docker.com", # 代理域名 "192.210.xxx.xxx:5000" # 服务器 IP:端口 ] }重启 Docker:
sudo systemctl daemon-reload sudo systemctl restart docker
四、验证部署
检查服务状态
docker-compose ps # 应显示 registry 和 registry-browser 均为 Up 状态测试 Registry 登录(通过代理域名)
docker login registry-docker.com # 输入用户名 admin 和密码,显示 Login Succeeded 即正常- 访问 Web 管理端
浏览器打开http://192.210.xxx.xxx:9090,可看到仓库列表(推送镜像后会显示内容)。
五、反向代理
registry-docker.com 反向代理到 192.210.xxx.xxx:5000 即可
server {
listen 80;
server_name registry-docker.com;
# 转发所有请求到 Registry 实际地址
location / {
proxy_pass http://192.210.xxx.xxx:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}如果是apache或其他Web服务器,或者需要https,自行百度,如何配置
六、使用
登录私有 Registry(IP 或域名均可)
# 用 IP 登录 docker login 192.210.xxx.xxx:5000 # 或用域名登录 docker login registry-docker.com- 输入用户名密码,显示「Login Succeeded」则认证通过
测试镜像推送
# 未登录,推送镜像 docker push registry-docker.com/hello-world:test
未认证,其他人无法push
已认证,正常push- 访问 Registry Browser
认证无法操作,确保私有性
- 浏览器打开
http://192.210.xxx.xxx:8080或http://服务器域名:8080 - 可看到推送的镜像
认证后的web界面
