logo

如何在Linux搭建并远程访问Docker Registry:无公网IP解决方案详解

作者:很菜不狗2025.10.10 18:40浏览量:0

简介:本文详细讲解在Linux系统上部署Docker Registry本地镜像仓库的完整流程,涵盖基础部署、安全配置及无公网IP环境下的远程连接方案,提供分步操作指南和配置示例。

如何在Linux部署Docker Registry本地镜像仓库并实现无公网IP远程连接

一、部署Docker Registry本地镜像仓库

1.1 基础环境准备

在开始部署前,需确保Linux系统满足以下条件:

  • 已安装Docker引擎(建议版本20.10+)
  • 具备root或sudo权限的用户
  • 至少10GB可用磁盘空间(用于存储镜像)
  • 开放5000端口(默认Registry端口)

验证Docker安装:

  1. docker --version
  2. # 应输出类似:Docker version 24.0.7, build 311be9e

1.2 基础Registry部署

使用官方Registry镜像启动服务:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. registry:2

关键参数说明:

  • -d:后台运行
  • -p 5000:5000:端口映射(主机:容器)
  • --restart=always:容器退出时自动重启
  • registry:2:使用官方v2版本镜像

验证服务状态:

  1. docker ps | grep registry
  2. # 应显示运行中的registry容器

1.3 基础功能测试

推送测试镜像:

  1. # 拉取测试镜像
  2. docker pull alpine:latest
  3. # 标记镜像(替换<server_ip>为实际IP)
  4. docker tag alpine:latest <server_ip>:5000/my-alpine
  5. # 推送镜像
  6. docker push <server_ip>:5000/my-alpine

二、安全增强配置

2.1 启用HTTPS认证

生成自签名证书(需OpenSSL):

  1. mkdir -p /certs
  2. openssl req -newkey rsa:4096 -nodes -sha256 \
  3. -keyout /certs/domain.key \
  4. -x509 -days 365 \
  5. -out /certs/domain.crt \
  6. -subj "/CN=registry.local"

启动带HTTPS的Registry:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /certs:/certs \
  6. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  7. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  8. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  9. registry:2

2.2 基本认证配置

创建认证文件:

  1. mkdir -p /auth
  2. docker run --entrypoint htpasswd \
  3. httpd:2 -Bbn testuser testpass > /auth/htpasswd

启动带认证的Registry:

  1. docker run -d \
  2. -p 5000:5000 \
  3. --restart=always \
  4. --name registry \
  5. -v /certs:/certs \
  6. -v /auth:/auth \
  7. -e REGISTRY_AUTH=htpasswd \
  8. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  9. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
  10. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  11. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  12. registry:2

三、无公网IP远程连接方案

3.1 内网穿透方案(推荐)

方案一:frp内网穿透

服务端配置(有公网IP的服务器):

  1. # frps.ini
  2. [common]
  3. bind_port = 7000
  4. dashboard_port = 7500
  5. dashboard_user = admin
  6. dashboard_pwd = admin

客户端配置(无公网IP的Registry主机):

  1. # frpc.ini
  2. [common]
  3. server_addr = <公网服务器IP>
  4. server_port = 7000
  5. [docker-registry]
  6. type = tcp
  7. local_ip = 127.0.0.1
  8. local_port = 5000
  9. remote_port = 6000

启动服务:

  1. # 服务端
  2. ./frps -c ./frps.ini
  3. # 客户端
  4. ./frpc -c ./frpc.ini

远程访问:<公网IP>:6000

方案二:ngrok反向代理

  1. # 下载ngrok
  2. wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
  3. unzip ngrok-stable-linux-amd64.zip
  4. # 启动隧道(需注册token)
  5. ./ngrok tcp 5000
  6. # 输出类似:Forwarding tcp://2.tcp.ngrok.io:12345 -> localhost:5000

3.2 VPN组网方案

OpenVPN服务器配置

  1. 安装OpenVPN:

    1. apt install openvpn easy-rsa
    2. make-cadir ~/openvpn-ca
    3. cd ~/openvpn-ca
  2. 生成证书:

    1. ./build-ca
    2. ./build-key-server server
    3. ./build-key client1
  3. 创建服务器配置:

    1. # /etc/openvpn/server.conf
    2. port 1194
    3. proto udp
    4. dev tun
    5. ca ca.crt
    6. cert server.crt
    7. key server.key
    8. dh dh2048.pem
    9. server 10.8.0.0 255.255.255.0
    10. ifconfig-pool-persist ipp.txt
    11. push "route 192.168.1.0 255.255.255.0"
    12. keepalive 10 120
    13. persist-key
    14. persist-tun
    15. status openvpn-status.log
    16. verb 3

客户端配置

  1. # client.ovpn
  2. client
  3. dev tun
  4. proto udp
  5. remote <服务器IP> 1194
  6. resolv-retry infinite
  7. nobind
  8. persist-key
  9. persist-tun
  10. ca ca.crt
  11. cert client1.crt
  12. key client1.key
  13. remote-cert-tls server
  14. verb 3

连接后,客户端可通过服务器内网IP访问Registry。

四、高级配置选项

4.1 存储配置

使用本地存储:

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

使用S3兼容存储:

  1. docker run -d \
  2. -e REGISTRY_STORAGE=s3 \
  3. -e REGISTRY_STORAGE_S3_ACCESSKEY=<access_key> \
  4. -e REGISTRY_STORAGE_S3_SECRETKEY=<secret_key> \
  5. -e REGISTRY_STORAGE_S3_REGION=us-east-1 \
  6. -e REGISTRY_STORAGE_S3_BUCKET=my-registry \
  7. -e REGISTRY_STORAGE_S3_ENCRYPT=true \
  8. registry:2

4.2 缓存配置

启用镜像缓存:

  1. docker run -d \
  2. -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
  3. registry:2

五、常见问题解决方案

5.1 推送镜像失败

错误示例:

  1. The push refers to repository [192.168.1.100:5000/my-alpine]
  2. Get https://192.168.1.100:5000/v2/: http: server gave HTTP response to HTTPS client

解决方案:

  1. 修改客户端Docker配置(/etc/docker/daemon.json):
    1. {
    2. "insecure-registries" : ["192.168.1.100:5000"]
    3. }
  2. 重启Docker服务:
    1. systemctl restart docker

5.2 认证失败

错误示例:

  1. no basic auth credentials

解决方案:

  1. 确保已正确登录:
    1. docker login <registry_ip>:5000
  2. 检查认证文件权限:
    1. chmod 600 /auth/htpasswd

六、最佳实践建议

  1. 定期备份:设置cron任务备份/var/lib/registry目录
  2. 镜像清理:配置垃圾回收策略:
    1. docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml
  3. 监控配置:使用Prometheus监控Registry指标:

    1. docker run -d \
    2. -p 9090:9090 \
    3. --name prometheus \
    4. -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
    5. prom/prometheus
  4. 日志管理:配置syslog或ELK收集Registry日志

七、完整部署示例

综合配置示例:

  1. # 创建必要目录
  2. mkdir -p /opt/registry/{auth,certs,data}
  3. # 生成自签名证书
  4. openssl req -newkey rsa:4096 -nodes -sha256 \
  5. -keyout /opt/registry/certs/domain.key \
  6. -x509 -days 365 \
  7. -out /opt/registry/certs/domain.crt \
  8. -subj "/CN=registry.local"
  9. # 生成认证文件
  10. docker run --entrypoint htpasswd \
  11. httpd:2 -Bbn admin P@ssw0rd > /opt/registry/auth/htpasswd
  12. # 启动Registry
  13. docker run -d \
  14. -p 5000:5000 \
  15. --restart=always \
  16. --name registry \
  17. -v /opt/registry/auth:/auth \
  18. -v /opt/registry/certs:/certs \
  19. -v /opt/registry/data:/var/lib/registry \
  20. -e REGISTRY_AUTH=htpasswd \
  21. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  22. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
  23. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  24. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  25. -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  26. registry:2

通过以上配置,您将获得一个具备以下特性的Docker Registry:

  • 支持HTTPS安全连接
  • 基本的用户认证
  • 持久化存储
  • 镜像删除功能
  • 可以通过内网穿透或VPN实现远程访问

这种部署方式特别适合中小企业内部使用,既保证了数据安全性,又解决了无公网IP的访问难题。根据实际需求,您可以进一步扩展存储后端、添加镜像缓存或集成CI/CD流程。

相关文章推荐

发表评论

活动