如何创建和管理 Docker 镜像

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面的 Docker 教程探讨了 Docker 镜像的基本概念,为开发者提供有关创建、管理和理解容器技术的实用见解。通过研究镜像架构、Dockerfile 配置和部署策略,学习者将获得现代软件开发和容器化所需的基本技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/tag("Tag an Image") docker/ImageOperationsGroup -.-> docker/push("Push Image to Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/ImageOperationsGroup -.-> docker/search("Search Images in Repository") docker/ImageOperationsGroup -.-> docker/save("Save Image") docker/ImageOperationsGroup -.-> docker/load("Load Image") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/tag -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/push -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/rmi -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/images -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/search -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/save -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/load -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} docker/build -.-> lab-391563{{"如何创建和管理 Docker 镜像"}} end

Docker 镜像基础

理解 Docker 镜像

Docker 镜像是容器技术的基础,它作为只读模板,包含一组用于创建 Docker 容器的指令。这些镜像将应用程序代码、运行时环境、库、环境变量和配置文件打包成一个单一的、可移植的单元。

镜像架构与组件

graph TD A[Dockerfile] --> B[基础镜像] A --> C[第 1 层:应用程序代码] A --> D[第 2 层:依赖项] A --> E[第 3 层:配置]
组件 描述 用途
基础镜像 基础层 提供操作系统和基本环境
应用层 自定义代码 包含特定的应用程序文件
依赖层 运行时库 包括必要的软件包

创建你的第一个 Docker 镜像

要创建 Docker 镜像,开发者使用 Dockerfile,它定义了镜像的结构和内容。以下是一个 Python 网络应用的实际示例:

## 为项目创建一个新目录
mkdir python-webapp
cd python-webapp

## 创建 Dockerfile
touch Dockerfile

## 使用最小配置编辑 Dockerfile
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3 python3-pip
WORKDIR /app
COPY. /app
RUN pip3 install flask
EXPOSE 5000
CMD ["python3", "app.py"]
EOL

## 创建一个简单的 Flask 应用
cat > app.py << EOL
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Docker Image Example'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
EOL

## 构建 Docker 镜像
docker build -t python-webapp:v1.

## 运行容器
docker run -p 5000:5000 python-webapp:v1

关键镜像特性

Docker 镜像由多个只读层组成,这些层在容器运行时堆叠并合并。Dockerfile 中的每条指令都会创建一个新层,从而实现高效存储和快速的容器部署。

镜像管理概念

镜像可以来源于:

  • 官方 Docker Hub 仓库
  • 自定义构建的 Dockerfile
  • 本地镜像仓库
  • 私有容器注册表

Docker 镜像的不可变特性确保了在不同开发和部署阶段的一致应用环境。

镜像管理工作流程

Docker 注册表与镜像分发

Docker 注册表是用于存储、共享和管理容器镜像的集中式平台。它们能够在不同的开发和生产环境中实现高效的镜像分发。

graph LR A[本地 Docker 客户端] --> B[Docker 注册表] B --> C[远程仓库] B --> D[私有仓库] B --> E[公共仓库]

镜像检索策略

命令 用途 示例
docker pull 下载镜像 docker pull ubuntu:22.04
docker search 查找镜像 docker search nginx
docker images 列出本地镜像 docker images

实际的镜像管理工作流程

## 更新本地 Docker 注册表
sudo docker login

## 拉取官方 Ubuntu 镜像
docker pull ubuntu:22.04

## 拉取特定的应用镜像
docker pull python:3.10

## 列出已下载的镜像
docker images

## 删除不必要的镜像
docker rmi <镜像 ID>

## 标记并推送自定义镜像
docker tag myapp:v1 username/myapp:v1
docker push username/myapp:v1

镜像版本控制与标记

有效的镜像管理需要策略性的版本控制:

## 使用语义化版本控制标记镜像
docker tag webapp:latest webapp:1.0.0
docker tag webapp:latest webapp:development

## 推送多个镜像版本
docker push username/webapp:latest
docker push username/webapp:1.0.0

高级镜像管理技术

Docker 通过以下方式支持复杂的镜像管理:

  • 多阶段构建
  • 镜像优化
  • 自动化构建管道
  • 安全镜像扫描

该工作流程可确保在各种计算环境中实现一致、可重现的容器部署。

高级 Docker 技术

多阶段构建

多阶段构建通过减小最终镜像大小和提高构建效率来优化 Docker 镜像。

## 复杂的多阶段 Dockerfile
FROM golang:1.17 AS builder
WORKDIR /app
COPY..
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

镜像优化策略

graph TD A[原始镜像] --> B[减少层数] A --> C[最小化依赖项] A --> D[缓存优化]
优化技术 描述 影响
Alpine 基础镜像 最小化的 Linux 发行版 减小镜像大小
选择性复制 仅包含必要文件 更小的镜像占用空间
层合并 合并 RUN 命令 减少镜像层数

高级 Dockerfile 配置

## 用于 Python 应用的高效 Dockerfile
FROM python:3.9-slim

## 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

## 创建非 root 用户
RUN useradd -m appuser
USER appuser

WORKDIR /app

## 高效安装依赖项
COPY --chown=appuser:appuser requirements.txt.
RUN pip install --no-cache-dir -r requirements.txt

COPY --chown=appuser:appuser..

CMD ["gunicorn", "app:main"]

容器配置管理

高级容器配置涉及:

  • 运行时环境定制
  • 资源分配
  • 网络配置
  • 安全强化
## 高级容器运行时配置
docker run -d \
  --cpus="2" \
  --memory="4g" \
  --restart=always \
  --network=custom_network \
  -v /host/config:/container/config \
  myapp:latest

动态镜像生成

使用构建参数和特定于环境的配置来实现动态镜像生成:

## 构建时配置
docker build \
  --build-arg ENV=production \
  --build-arg VERSION=1.0.0 \
  -t myapp:latest.

总结

Docker 镜像是容器技术的关键组成部分,使开发者能够将应用及其依赖项打包成可移植、可重现的单元。通过掌握镜像创建技术、理解层架构并实施最佳实践,开发者可以简化应用部署、提高系统一致性并优化整体软件开发工作流程。