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

一、Docker 构建镜像详解

1.1 Dockerfile 核心语法

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

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

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

  1. # 使用官方 Python 镜像作为基础
  2. FROM python:3.9-slim
  3. # 设置工作目录
  4. WORKDIR /app
  5. # 复制依赖文件并安装
  6. COPY requirements.txt .
  7. RUN pip install --no-cache-dir -r requirements.txt
  8. # 复制应用代码
  9. COPY . .
  10. # 暴露端口并启动应用
  11. EXPOSE 8000
  12. CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]

1.2 构建镜像的完整流程

  1. 编写 Dockerfile:确保指令顺序合理(频繁变动的指令应放在后面)
  2. 执行构建命令

    1. docker build -t my-python-app:v1 .
    • -t 指定镜像名称和标签
    • . 表示使用当前目录的 Dockerfile
  3. 验证镜像

    1. docker images # 查看镜像列表
    2. docker history my-python-app:v1 # 查看构建层信息

1.3 优化镜像的最佳实践

  • 多阶段构建:减少最终镜像体积

    1. # 构建阶段
    2. FROM golang:1.18 AS builder
    3. WORKDIR /app
    4. COPY . .
    5. RUN go build -o myapp
    6. # 运行阶段
    7. FROM alpine:latest
    8. COPY --from=builder /app/myapp /usr/local/bin/
    9. CMD ["myapp"]
  • 使用 .dockerignore:排除不必要的文件(类似 .gitignore)
  • 选择轻量级基础镜像:如 alpinescratch

二、搭建私人镜像仓库

2.1 使用官方 Registry 快速部署

Docker 官方提供了轻量级的 Registry 镜像,适合个人或小型团队:

  1. # 启动 Registry 容器
  2. docker run -d -p 5000:5000 --name registry \
  3. -v /data/registry:/var/lib/registry \
  4. registry:2
  • 配置 TLS 加密(生产环境必需):

    1. openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key \
    2. -x509 -days 365 -out domain.crt -subj "/CN=registry.example.com"
    3. docker run -d -p 5000:5000 --name registry \
    4. -v /path/to/certs:/certs \
    5. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    6. -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    7. registry:2

2.2 使用 Harbor 搭建企业级仓库

Harbor 是 VMware 开源的企业级 Registry 解决方案,提供:

  • 基于角色的访问控制(RBAC)
  • 镜像复制与同步
  • 漏洞扫描
  • 图形化管理界面

安装步骤(以 Docker Compose 为例):

  1. 下载 Harbor 安装包:

    1. wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-online-installer-v2.5.0.tgz
    2. tar xvf harbor-online-installer-v2.5.0.tgz
    3. cd harbor
  2. 修改 harbor.yml 配置:

    1. hostname: registry.example.com
    2. http:
    3. port: 80
    4. https:
    5. certificate: /path/to/your/domain.crt
    6. private_key: /path/to/your/domain.key
    7. harbor_admin_password: Harbor12345
  3. 执行安装:

    1. ./install.sh

2.3 仓库使用指南

推送镜像到私人仓库:

  1. # 标记镜像
  2. docker tag my-python-app:v1 registry.example.com/library/my-python-app:v1
  3. # 登录仓库(Harbor 需要)
  4. docker login registry.example.com
  5. # 推送镜像
  6. docker push registry.example.com/library/my-python-app:v1

从私人仓库拉取镜像:

  1. docker pull registry.example.com/library/my-python-app:v1

三、高级配置与安全实践

3.1 镜像签名与验证

使用 Docker Content Trust (DCT) 确保镜像完整性:

  1. # 启用 DCT
  2. export DOCKER_CONTENT_TRUST=1
  3. # 首次推送会自动生成根密钥和仓库密钥
  4. docker push registry.example.com/library/my-python-app:v1

3.2 仓库访问控制

Harbor 的 RBAC 示例配置:

  • 创建项目:library
  • 添加用户:dev1(分配开发者角色)
  • 设置策略:仅允许特定标签格式(如 v*

3.3 监控与日志

  • Registry 日志
    1. docker logs -f registry
  • Harbor 监控:通过 Prometheus + Grafana 集成

四、常见问题解决方案

4.1 构建缓存失效问题

  • 现象:修改代码后未触发重新安装依赖
  • 解决:在 RUN 指令前添加 ARG 强制缓存失效
    1. ARG CACHE_DATE=not_set
    2. RUN apt-get update && apt-get install -y my-package

    构建时指定参数:

    1. docker build --build-arg CACHE_DATE=$(date) -t myapp .

4.2 仓库连接失败

  • 检查项
    1. 防火墙是否放行 5000/443 端口
    2. DNS 解析是否正确(Harbor 建议使用域名)
    3. 证书是否有效(openssl s_client -connect registry.example.com:443

4.3 镜像存储空间不足

  • 解决方案
    1. 定期清理未使用的镜像:
      1. docker system prune -a
    2. 设置 Registry 的存储配额(Harbor 支持)

五、总结与建议

  1. 开发阶段:使用官方 Registry 快速验证
  2. 生产环境:优先选择 Harbor 获得完整的企业功能
  3. 安全建议
    • 强制所有镜像通过签名验证
    • 定期扫描镜像漏洞(Harbor 内置 Clair 扫描器)
    • 限制仓库访问 IP 范围

通过本文的实践,读者可以掌握从 Docker 镜像构建到企业级私有仓库部署的全流程,为 CI/CD 流水线和微服务架构提供坚实的基础设施支持。