如何在Linux上高效搭建Docker Registry并实现公网访问

如何在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:

  1. # 更新软件包索引
  2. sudo apt-get update
  3. # 安装依赖包
  4. sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  5. # 添加Docker官方GPG密钥
  6. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  7. # 添加Docker APT仓库
  8. sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  9. # 安装Docker CE
  10. sudo apt-get update
  11. sudo apt-get install docker-ce docker-ce-cli containerd.io
  12. # 验证安装
  13. sudo docker run hello-world

二、搭建本地Docker Registry

2.1 基础Registry部署

使用Docker官方提供的Registry镜像,快速启动一个本地Registry服务:

  1. 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目录下。若需持久化存储,可挂载宿主机目录:

  1. sudo mkdir -p /data/registry
  2. sudo docker run -d -p 5000:5000 --restart=always --name registry \
  3. -v /data/registry:/var/lib/registry \
  4. registry:2

2.3 验证Registry服务

推送一个测试镜像到本地Registry:

  1. # 拉取一个测试镜像
  2. sudo docker pull alpine:latest
  3. # 标记镜像,指向本地Registry
  4. sudo docker tag alpine:latest localhost:5000/myalpine:latest
  5. # 推送镜像
  6. sudo docker push localhost:5000/myalpine:latest
  7. # 验证镜像是否已推送
  8. curl http://localhost:5000/v2/_catalog

输出应包含{"repositories":["myalpine"]},表示镜像已成功推送。

三、实现公网访问

3.1 配置HTTPS

为确保数据传输安全,需为Registry配置HTTPS证书。这里以Let’s Encrypt免费证书为例:

3.1.1 安装Certbot

  1. # Ubuntu 20.04
  2. sudo apt-get install certbot python3-certbot-nginx
  3. # CentOS 7
  4. sudo yum install epel-release
  5. sudo yum install certbot python3-certbot-nginx

3.1.2 获取证书

假设Registry的域名为registry.example.com

  1. 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证书:

  1. sudo docker run -d -p 5000:5000 --restart=always --name registry \
  2. -v /data/registry:/var/lib/registry \
  3. -v /etc/letsencrypt/live/registry.example.com/fullchain.pem:/certs/fullchain.pem \
  4. -v /etc/letsencrypt/live/registry.example.com/privkey.pem:/certs/privkey.pem \
  5. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  6. -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  7. registry:2

3.2 端口映射与防火墙配置

确保宿主机的5000端口已开放,并映射到公网IP:

  1. # 开放5000端口(Ubuntu使用ufw)
  2. sudo ufw allow 5000/tcp
  3. # CentOS使用firewalld
  4. sudo firewall-cmd --permanent --add-port=5000/tcp
  5. sudo firewall-cmd --reload

3.3 配置Nginx反向代理(可选)

若需更灵活的路由和负载均衡,可配置Nginx作为反向代理:

  1. server {
  2. listen 443 ssl;
  3. server_name registry.example.com;
  4. ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
  5. ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;
  6. location / {
  7. proxy_pass http://localhost:5000;
  8. proxy_set_header Host $host;
  9. proxy_set_header X-Real-IP $remote_addr;
  10. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11. proxy_set_header X-Forwarded-Proto $scheme;
  12. }
  13. }

重启Nginx服务:

  1. sudo systemctl restart nginx

四、高级配置与优化

4.1 认证与授权

为Registry添加基本认证,防止未授权访问:

  1. # 创建密码文件
  2. sudo mkdir -p /auth
  3. sudo docker run --entrypoint htpasswd httpd:2 -Bbn username password > /auth/htpasswd
  4. # 修改Registry启动命令
  5. sudo docker run -d -p 5000:5000 --restart=always --name registry \
  6. -v /data/registry:/var/lib/registry \
  7. -v /auth:/auth \
  8. -e REGISTRY_AUTH=htpasswd \
  9. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  10. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
  11. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  12. -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  13. registry:2

4.2 镜像清理与垃圾回收

Registry默认不会自动删除未引用的镜像层,需手动执行垃圾回收:

  1. # 进入Registry容器
  2. sudo docker exec -it registry sh
  3. # 执行垃圾回收(需先停止Registry服务或确保无写入操作)
  4. registry garbage-collect /etc/docker/registry/config.yml

4.3 日志与监控

配置Registry日志输出,便于故障排查:

  1. sudo docker run -d -p 5000:5000 --restart=always --name registry \
  2. -v /data/registry:/var/lib/registry \
  3. -v /var/log/registry:/var/log/registry \
  4. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  5. -e REGISTRY_LOG_LEVEL=debug \
  6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem \
  7. -e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
  8. registry:2

五、总结与展望

通过本文的介绍,读者已掌握在Linux系统上搭建本地Docker Registry镜像仓库,并通过配置HTTPS和端口映射实现公网访问的全过程。本地Registry不仅提升了镜像管理效率,还增强了数据安全性。未来,随着容器化技术的不断发展,本地Registry将进一步集成CI/CD流程,成为企业DevOps体系的重要组成部分。建议读者持续关注Docker官方文档和社区动态,及时更新Registry版本,以获得更好的性能和安全性。