DSM7.2群晖NAS:YAML配置实现Docker私有仓库与认证

引言

随着容器化技术的普及,Docker私有镜像仓库成为开发团队和企业内部镜像管理的核心基础设施。DSM7.2群晖NAS凭借其易用性和扩展性,成为搭建私有仓库的热门选择。本文将通过YAML配置文件,结合docker-compose工具,详细演示如何在DSM7.2上快速部署私有镜像仓库(Registry),并实现基于HTTP Basic Auth的基本登录认证,确保镜像存储的安全性。

一、环境准备与工具安装

1.1 DSM7.2系统要求

  • 硬件:建议4GB以上内存,100GB以上可用存储空间。
  • 软件:DSM7.2或更新版本,已安装Docker套件。
  • 网络:确保NAS可访问外网(用于拉取基础镜像),或已配置本地镜像源。

1.2 安装Docker套件

  1. 登录DSM管理界面,进入套件中心
  2. 搜索“Docker”,点击安装。
  3. 安装完成后,启动Docker服务。

1.3 安装docker-compose

DSM7.2默认未集成docker-compose,需通过SSH手动安装:

  1. sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. sudo chmod +x /usr/local/bin/docker-compose

验证安装:

  1. docker-compose --version

二、YAML配置文件详解

2.1 基础Registry配置

创建docker-compose.yml文件,内容如下:

  1. version: '3.8'
  2. services:
  3. registry:
  4. image: registry:2
  5. container_name: private_registry
  6. ports:
  7. - "5000:5000"
  8. volumes:
  9. - ./registry-data:/var/lib/registry
  10. restart: unless-stopped
  • image: registry:2:使用官方Registry 2.x镜像。
  • ports:将宿主机的5000端口映射到容器的5000端口(Registry默认端口)。
  • volumes:持久化存储镜像数据到宿主机目录./registry-data

2.2 添加HTTP Basic Auth认证

为实现登录认证,需生成用户名密码文件并配置Nginx反向代理。

2.2.1 生成密码文件
  1. 安装htpasswd工具(若未安装):
    1. sudo apt-get install apache2-utils # 通过SSH执行
  2. 创建密码文件:
    1. mkdir -p auth
    2. htpasswd -Bc auth/htpasswd <username>

    输入密码后,会生成加密的密码文件auth/htpasswd

2.2.2 配置Nginx反向代理

修改docker-compose.yml,添加Nginx服务:

  1. version: '3.8'
  2. services:
  3. registry:
  4. image: registry:2
  5. container_name: private_registry
  6. expose:
  7. - "5000"
  8. volumes:
  9. - ./registry-data:/var/lib/registry
  10. restart: unless-stopped
  11. nginx:
  12. image: nginx:alpine
  13. container_name: registry_nginx
  14. ports:
  15. - "5000:80"
  16. volumes:
  17. - ./nginx.conf:/etc/nginx/nginx.conf
  18. - ./auth:/etc/nginx/auth
  19. depends_on:
  20. - registry
  21. restart: unless-stopped

创建nginx.conf文件:

  1. events {}
  2. http {
  3. server {
  4. listen 80;
  5. server_name localhost;
  6. location / {
  7. auth_basic "Registry Authentication";
  8. auth_basic_user_file /etc/nginx/auth/htpasswd;
  9. proxy_pass http://registry:5000;
  10. proxy_set_header Host $host;
  11. proxy_set_header X-Real-IP $remote_addr;
  12. }
  13. }
  14. }
  • auth_basic:启用HTTP Basic Auth。
  • auth_basic_user_file:指定密码文件路径。
  • proxy_pass:将请求转发到Registry容器。

三、部署与验证

3.1 启动服务

docker-compose.yml所在目录执行:

  1. docker-compose up -d

等待服务启动完成后,检查容器状态:

  1. docker-compose ps

3.2 验证Registry访问

  1. 测试未认证访问

    1. curl http://<NAS_IP>:5000/v2/_catalog

    应返回401 Unauthorized错误。

  2. 测试认证访问

    1. curl -u <username>:<password> http://<NAS_IP>:5000/v2/_catalog

    若返回{}(空仓库列表),则表示认证成功。

3.3 推送与拉取镜像

  1. 标记镜像
    1. docker tag <local_image> <NAS_IP>:5000/<image_name>:<tag>
  2. 登录Registry

    1. docker login <NAS_IP>:5000

    输入用户名密码后,会生成~/.docker/config.json文件存储认证信息。

  3. 推送镜像

    1. docker push <NAS_IP>:5000/<image_name>:<tag>
  4. 拉取镜像
    1. docker pull <NAS_IP>:5000/<image_name>:<tag>

四、高级配置与优化

4.1 启用TLS加密

为避免明文传输密码,建议配置HTTPS:

  1. 生成自签名证书:
    1. mkdir -p certs
    2. openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt -subj "/CN=<NAS_IP>"
  2. 修改Nginx配置:

    1. server {
    2. listen 443 ssl;
    3. server_name localhost;
    4. ssl_certificate /etc/nginx/certs/domain.crt;
    5. ssl_certificate_key /etc/nginx/certs/domain.key;
    6. location / {
    7. auth_basic "Registry Authentication";
    8. auth_basic_user_file /etc/nginx/auth/htpasswd;
    9. proxy_pass http://registry:5000;
    10. }
    11. }
  3. 更新docker-compose.yml的卷映射:
    1. volumes:
    2. - ./nginx.conf:/etc/nginx/nginx.conf
    3. - ./auth:/etc/nginx/auth
    4. - ./certs:/etc/nginx/certs
  4. 重启Nginx容器:
    1. docker-compose restart nginx

4.2 配置存储驱动

Registry默认使用文件系统存储,可配置为S3等对象存储:

  1. services:
  2. registry:
  3. environment:
  4. REGISTRY_STORAGE_S3_ACCESSKEY: <access_key>
  5. REGISTRY_STORAGE_S3_SECRETKEY: <secret_key>
  6. REGISTRY_STORAGE_S3_BUCKET: <bucket_name>
  7. REGISTRY_STORAGE_S3_REGION: <region>
  8. volumes:
  9. - ./config.yml:/etc/docker/registry/config.yml

创建config.yml

  1. storage:
  2. s3:
  3. accesskey: <access_key>
  4. secretkey: <secret_key>
  5. bucket: <bucket_name>
  6. region: <region>

五、常见问题与解决

5.1 端口冲突

若5000端口被占用,修改docker-compose.yml中的端口映射:

  1. ports:
  2. - "<new_port>:5000"

5.2 认证失败

  • 检查htpasswd文件路径是否正确。
  • 确保Nginx配置中的auth_basic_user_file路径与卷映射一致。

5.3 镜像推送失败

  • 检查是否已登录Registry:
    1. docker logout <NAS_IP>:5000
    2. docker login <NAS_IP>:5000
  • 确认镜像标签是否包含Registry地址:
    1. docker tag <image> <NAS_IP>:5000/<image>

六、总结与扩展

通过YAML配置文件和docker-compose工具,DSM7.2群晖NAS可快速部署带认证的Docker私有镜像仓库。本文涵盖了基础部署、HTTP Basic Auth认证、TLS加密等核心功能,并提供了故障排查指南。进一步优化方向包括:

  • 集成LDAP/OAuth2认证。
  • 配置镜像清理策略。
  • 实现多节点高可用部署。

对于企业用户,建议结合群晖的Active Directory集成功能,实现与现有IT系统的无缝对接。通过私有镜像仓库,团队可高效管理内部镜像,提升开发协作效率。