logo

从零开始:Docker 构建镜像并搭建私人镜像仓库教程

作者:rousong2025.10.10 18:32浏览量:3

简介:本文详细讲解了如何使用Docker构建自定义镜像,并通过Docker Registry搭建私有镜像仓库,帮助开发者高效管理容器镜像,保障企业核心资产安全。

一、Docker 构建镜像:从基础到进阶

1.1 Dockerfile 核心语法解析

Dockerfile 是构建镜像的蓝图,其核心指令包括:

  • FROM:指定基础镜像(如 FROM alpine:latest
  • RUN:执行构建命令(如 RUN apt-get update && apt-get install -y nginx
  • COPY:复制文件到镜像(如 COPY ./app /app
  • EXPOSE:声明端口(如 EXPOSE 80
  • CMD:容器启动命令(如 CMD ["nginx", "-g", "daemon off;"]

示例:构建一个简单的 Python Web 应用镜像

  1. FROM python:3.9-slim
  2. WORKDIR /app
  3. COPY requirements.txt .
  4. RUN pip install --no-cache-dir -r requirements.txt
  5. COPY . .
  6. CMD ["python", "app.py"]

关键点

  • 使用 .dockerignore 文件排除无关文件(如 __pycache__/
  • 多阶段构建减少镜像体积(如先构建再复制产物)

1.2 镜像构建最佳实践

  1. 分层优化:合并 RUN 命令减少层数(如 RUN apt-get update && apt-get install -y package1 package2
  2. 缓存利用:将高频变更步骤(如代码复制)放在 Dockerfile 末尾
  3. 标签管理:使用语义化版本标签(如 :v1.0.0 而非 :latest
  4. 安全加固
    • 避免以 root 用户运行应用(通过 USER 指令切换)
    • 定期扫描基础镜像漏洞(如 docker scan 命令)

构建命令示例

  1. docker build -t myapp:v1.0.0 .

二、搭建私人镜像仓库:Docker Registry 实战

2.1 快速部署私有 Registry

Docker 官方提供了轻量级 Registry 镜像,可一键部署:

  1. docker run -d -p 5000:5000 --name registry registry:2

验证访问

  1. curl http://localhost:5000/v2/_catalog
  2. # 应返回 {"repositories":[]}

2.2 配置 HTTPS 与认证(生产环境必备)

2.2.1 生成自签名证书

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

2.2.2 启动带 HTTPS 的 Registry

  1. docker run -d \
  2. -p 5000:5000 \
  3. --name registry \
  4. -v "$(pwd)"/certs:/certs \
  5. -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  7. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  8. registry:2

2.2.3 配置基础认证

  1. 生成密码文件:
    1. mkdir auth
    2. docker run --entrypoint htpasswd httpd:2 -Bbn username password > auth/htpasswd
  2. 启动带认证的 Registry:
    1. docker run -d \
    2. -p 5000:5000 \
    3. --name registry \
    4. -v "$(pwd)"/auth:/auth \
    5. -e REGISTRY_AUTH=htpasswd \
    6. -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
    7. -e REGISTRY_AUTH_HTPASSWD_PATH="/auth/htpasswd" \
    8. -v "$(pwd)"/certs:/certs \
    9. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    10. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    11. registry:2

2.3 客户端配置与镜像推送

2.3.1 配置 Docker 信任私有仓库

编辑 /etc/docker/daemon.json(Linux):

  1. {
  2. "insecure-registries": ["registry.example.com:5000"]
  3. }

或对于 HTTPS 仓库:

  1. {
  2. "registry-mirrors": [],
  3. "allow-nondistributable-artifacts": ["registry.example.com:5000"]
  4. }

重启 Docker 服务:

  1. systemctl restart docker

2.3.2 标记并推送镜像

  1. docker tag myapp:v1.0.0 registry.example.com:5000/myapp:v1.0.0
  2. docker push registry.example.com:5000/myapp:v1.0.0

三、高级场景与运维技巧

3.1 镜像清理与存储管理

  1. 删除未使用的镜像
    1. docker system prune -a
  2. Registry 垃圾回收(需进入容器执行):
    1. docker exec -it registry bin/registry garbage-collect /etc/docker/registry/config.yml

3.2 镜像签名与内容信任

启用 Docker Content Trust(DCT):

  1. export DOCKER_CONTENT_TRUST=1

首次推送时会提示创建根密钥和存储库密钥。

3.3 多节点仓库部署

使用 HarborNexus Repository 实现高可用:

  • Harbor 特性:
    • 基于角色的访问控制
    • 漏洞扫描集成
    • 复制策略支持
  • Nexus 优势:
    • 支持多种包类型(Docker/Maven/NPM)
    • 企业级权限管理

四、常见问题解决方案

4.1 推送镜像报错 “x509: certificate signed by unknown authority”

原因:客户端不信任自签名证书
解决方案

  1. 将证书复制到 /etc/docker/certs.d/registry.example.com:5000/
  2. 重启 Docker 服务

4.2 认证失败 “401 Unauthorized”

检查项

  • 用户名密码是否正确
  • htpasswd 文件权限是否为 600
  • Registry 容器日志是否有错误(docker logs registry

4.3 镜像拉取慢

优化建议

  • 配置镜像加速器(如阿里云/腾讯云镜像服务)
  • 使用 CDN 加速 Registry 访问
  • 部署边缘节点 Registry

五、总结与延伸

5.1 核心流程回顾

  1. 镜像构建:通过 Dockerfile 定义应用环境
  2. 仓库部署:选择适合的 Registry 方案(简单/安全/企业级)
  3. 运维管理:配置认证、监控存储、定期维护

5.2 延伸学习方向

  • Kubernetes 集成:使用 Harbor 作为 OCI 注册表
  • 安全审计:结合 OpenPolicyAgent 实现策略管控
  • 性能优化:研究 Registry 存储驱动(filesystem/s3/azure)

通过本文的实践,开发者可以掌握从镜像构建到私有仓库部署的全流程,既能满足个人项目的快速迭代需求,也能构建企业级的安全镜像管理体系。实际生产环境中,建议结合 CI/CD 流水线实现镜像的自动构建与推送,进一步提升研发效率。

相关文章推荐

发表评论

活动