如何理解 Docker 镜像基础

DockerDockerBeginner
立即练习

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

简介

本全面教程探讨了 Docker 镜像的基本概念,为开发者和 DevOps 专业人员提供了有关创建、构建和管理容器镜像的深入见解。通过理解 Docker 镜像架构的核心原理,读者将获得构建高效且可重复的软件部署解决方案的实用知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/info("Display System-Wide Information") docker/SystemManagementGroup -.-> docker/system("Manage Docker") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/rmi -.-> lab-393093{{"如何理解 Docker 镜像基础"}} docker/images -.-> lab-393093{{"如何理解 Docker 镜像基础"}} docker/info -.-> lab-393093{{"如何理解 Docker 镜像基础"}} docker/system -.-> lab-393093{{"如何理解 Docker 镜像基础"}} docker/prune -.-> lab-393093{{"如何理解 Docker 镜像基础"}} end

Docker 镜像基础

什么是 Docker 镜像?

Docker 镜像是轻量级、独立的可执行包,其中包含运行应用程序所需的一切:代码、运行时环境、系统工具、库和设置。它们是容器技术的基本构建块,能够在不同的计算环境中实现一致且可移植的软件部署。

Docker 镜像的关键组件

graph TD A[Docker 镜像] --> B[基础层] A --> C[应用层] A --> D[配置层] B --> E[操作系统] B --> F[系统库] C --> G[应用代码] C --> H[依赖项] D --> I[环境变量] D --> J[启动命令]

镜像结构与层

层类型 描述 示例
基础层 基础操作系统 Ubuntu 22.04
中间层 系统依赖项 Python 运行时
应用层 源代码和应用文件 Web 应用程序
配置层 运行时设置 端口映射

创建 Docker 镜像:实际示例

## 创建项目目录
mkdir my-docker-app
cd my-docker-app

## 创建一个简单的 Python 应用程序
echo "print('Hello, Docker!')" > app.py

## 创建 Dockerfile
cat > Dockerfile << EOL
FROM ubuntu:22.04
RUN apt-get update && apt-get install -y python3
COPY app.py /app/app.py
WORKDIR /app
CMD ["python3", "app.py"]
EOL

## 构建 Docker 镜像
docker build -t my-python-app.

## 运行容器
docker run my-python-app

此示例展示了如何使用最小化的 Ubuntu 基础创建 Docker 镜像、安装 Python 并运行一个简单的 Python 脚本。Dockerfile 定义了镜像的每一层,确保在不同环境中具有可重复性和一致性。

镜像特性

Docker 镜像是不可变的,这意味着一旦创建,它们就不会改变。每个镜像由多个只读层组成,这些层可以在不同镜像之间共享,从而提高存储和下载效率。

管理 Docker 镜像

基本镜像管理命令

Docker 提供了一套全面的命令,用于在 Ubuntu 22.04 系统上高效管理镜像。了解这些命令对于维护一个干净且优化的容器环境至关重要。

graph LR A[Docker 镜像管理] --> B[列出镜像] A --> C[删除镜像] A --> D[拉取镜像] A --> E[标记镜像]

镜像列表与检查

## 列出所有本地镜像
docker images

## 详细检查镜像
docker inspect ubuntu:latest

## 按特定条件过滤镜像
docker images --filter "dangling=true"

镜像管理操作

操作 命令 描述
拉取镜像 docker pull 从仓库下载镜像
删除镜像 docker rmi 删除本地镜像
删除未使用镜像 docker image prune 清理未使用的镜像
标记镜像 docker tag 创建镜像别名

高级镜像清理技术

## 删除所有未使用的镜像
docker image prune -a

## 删除特定镜像
docker rmi image_name:tag

## 删除没有运行容器的镜像
docker image prune -f

镜像大小优化策略

## 检查镜像大小
docker images --format "{{.Repository}}:{{.Tag}}: {{.Size}}"

## 使用多阶段构建创建最小化镜像
FROM ubuntu:22.04 AS builder
## 构建依赖项

FROM ubuntu:22.04
## 仅复制必要的工件

镜像版本管理

## 标记特定的镜像版本
docker tag original_image:latest new_image:v1.0

## 将标记的镜像推送到仓库
docker push new_image:v1.0

镜像仓库最佳实践

Docker 仓库架构

graph TD A[Docker 仓库] --> B[公共仓库] A --> C[私有仓库] B --> D[Docker Hub] C --> E[自托管注册表] C --> F[云提供商注册表]

仓库类型及特点

仓库类型 访问级别 使用场景
Docker Hub 公共/私有 社区镜像、官方仓库
私有注册表 受限 企业环境、敏感项目
云注册表 托管 可扩展的、集成的云部署

认证与安全实践

## 登录 Docker Hub
docker login

## 创建私有注册表认证
docker login private-registry.example.com

## 生成注册表凭证
htpasswd -Bc registry.password username

镜像存储优化

## 限制本地镜像存储
docker system prune -a --volumes

## 删除悬空镜像
docker image prune

## 设置存储限制
docker system df

自动化镜像管理

#!/bin/bash
## Docker 镜像清理脚本

## 删除超过 30 天的镜像
docker image prune -a --filter "until=720h"

## 删除未使用的卷
docker volume prune -f

## 删除未使用的网络
docker network prune -f

仓库同步

## 拉取最新镜像
docker pull ubuntu:latest
docker pull nginx:stable

## 标记并推送到私有注册表
docker tag ubuntu:latest private-registry.com/ubuntu:latest
docker push private-registry.com/ubuntu:latest

安全扫描集成

## 扫描镜像中的漏洞
docker scan ubuntu:latest

## 与持续集成/持续交付 (CI/CD) 管道集成
trivy image ubuntu:latest

总结

Docker 镜像是现代容器化技术的关键组成部分,能够在各种不同的计算环境中实现一致且可移植的软件部署。通过掌握镜像创建、层管理和仓库实践,开发者可以简化应用程序打包、提高部署效率,并确保在不同平台和基础设施上可靠地分发软件。