如何在Linux上搭建本地Docker Registry镜像仓库并实现公网访问
在容器化技术日益普及的今天,Docker已成为开发、测试和部署应用的标准工具。然而,频繁从公共镜像仓库(如Docker Hub)拉取镜像不仅存在网络延迟问题,还可能涉及隐私和安全风险。搭建本地Docker Registry镜像仓库,不仅能提升镜像管理效率,还能实现私有化部署。本文将详细介绍如何在Linux系统上搭建本地Docker Registry,并通过配置HTTPS和端口映射实现公网访问。
一、环境准备
1.1 硬件与软件要求
- 操作系统:推荐CentOS 7/8、Ubuntu 20.04 LTS等主流Linux发行版。
- Docker版本:建议使用Docker CE(社区版)或Docker EE(企业版),确保版本≥19.03。
- 硬件资源:根据镜像存储需求分配足够的磁盘空间(建议≥100GB),内存≥4GB。
1.2 安装Docker
以Ubuntu 20.04为例,执行以下命令安装Docker:
# 更新软件包索引sudo apt-get update# 安装依赖包sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common# 添加Docker官方GPG密钥curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -# 添加Docker APT仓库sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"# 安装Docker CEsudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io# 验证安装sudo docker run hello-world
二、搭建本地Docker Registry
2.1 基础Registry部署
使用Docker官方提供的Registry镜像,快速启动一个本地Registry服务:
sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2
-d:后台运行。-p 5000:5000:将宿主机的5000端口映射到容器的5000端口。--restart=always:容器退出时自动重启。--name registry:指定容器名称。registry:2:使用Registry 2.x版本镜像。
2.2 配置存储路径(可选)
默认情况下,Registry将镜像存储在容器的/var/lib/registry目录下。若需持久化存储,可挂载宿主机目录:
sudo mkdir -p /data/registrysudo docker run -d -p 5000:5000 --restart=always --name registry \-v /data/registry:/var/lib/registry \registry:2
2.3 验证Registry服务
推送一个测试镜像到本地Registry:
# 拉取一个测试镜像sudo docker pull alpine:latest# 标记镜像,指向本地Registrysudo docker tag alpine:latest localhost:5000/myalpine:latest# 推送镜像sudo docker push localhost:5000/myalpine:latest# 验证镜像是否已推送curl http://localhost:5000/v2/_catalog
输出应包含{"repositories":["myalpine"]},表示镜像已成功推送。
三、实现公网访问
3.1 配置HTTPS
为确保数据传输安全,需为Registry配置HTTPS证书。这里以Let’s Encrypt免费证书为例:
3.1.1 安装Certbot
# Ubuntu 20.04sudo apt-get install certbot python3-certbot-nginx# CentOS 7sudo yum install epel-releasesudo yum install certbot python3-certbot-nginx
3.1.2 获取证书
假设Registry的域名为registry.example.com:
sudo certbot --nginx -d registry.example.com --email your@email.com --agree-tos --no-eff-email
证书将保存在/etc/letsencrypt/live/registry.example.com/目录下。
3.1.3 配置Registry使用HTTPS
修改Registry启动命令,添加TLS证书:
sudo docker run -d -p 5000:5000 --restart=always --name registry \-v /data/registry:/var/lib/registry \-v /etc/letsencrypt/live/registry.example.com/fullchain.pem:/certs/fullchain.pem \-v /etc/letsencrypt/live/registry.example.com/privkey.pem:/certs/privkey.pem \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \registry:2
3.2 端口映射与防火墙配置
确保宿主机的5000端口已开放,并映射到公网IP:
# 开放5000端口(Ubuntu使用ufw)sudo ufw allow 5000/tcp# CentOS使用firewalldsudo firewall-cmd --permanent --add-port=5000/tcpsudo firewall-cmd --reload
3.3 配置Nginx反向代理(可选)
若需更灵活的路由和负载均衡,可配置Nginx作为反向代理:
server {listen 443 ssl;server_name registry.example.com;ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;location / {proxy_pass http://localhost:5000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
重启Nginx服务:
sudo systemctl restart nginx
四、高级配置与优化
4.1 认证与授权
为Registry添加基本认证,防止未授权访问:
# 创建密码文件sudo mkdir -p /authsudo docker run --entrypoint htpasswd httpd:2 -Bbn username password > /auth/htpasswd# 修改Registry启动命令sudo docker run -d -p 5000:5000 --restart=always --name registry \-v /data/registry:/var/lib/registry \-v /auth:/auth \-e REGISTRY_AUTH=htpasswd \-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \-e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \registry:2
4.2 镜像清理与垃圾回收
Registry默认不会自动删除未引用的镜像层,需手动执行垃圾回收:
# 进入Registry容器sudo docker exec -it registry sh# 执行垃圾回收(需先停止Registry服务或确保无写入操作)registry garbage-collect /etc/docker/registry/config.yml
4.3 日志与监控
配置Registry日志输出,便于故障排查:
sudo docker run -d -p 5000:5000 --restart=always --name registry \-v /data/registry:/var/lib/registry \-v /var/log/registry:/var/log/registry \-e REGISTRY_STORAGE_DELETE_ENABLED=true \-e REGISTRY_LOG_LEVEL=debug \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \registry:2
五、总结与展望
通过本文的介绍,读者已掌握在Linux系统上搭建本地Docker Registry镜像仓库,并通过配置HTTPS和端口映射实现公网访问的全过程。本地Registry不仅提升了镜像管理效率,还增强了数据安全性。未来,随着容器化技术的不断发展,本地Registry将进一步集成CI/CD流程,成为企业DevOps体系的重要组成部分。建议读者持续关注Docker官方文档和社区动态,及时更新Registry版本,以获得更好的性能和安全性。