一步步创建 Docker 镜像

DockerDockerBeginner
立即练习

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

简介

本全面的 Docker 教程为开发者和 DevOps 专业人员提供了有关创建、管理和理解 Docker 镜像的基本知识。通过探索镜像组件、层结构和实际实现技术,学习者将获得容器化和应用程序打包方面的实用技能。

Docker 镜像基础

什么是 Docker 镜像?

Docker 镜像是用于创建容器的只读模板。它们包含预配置的软件环境、应用程序代码、依赖项和运行时设置。Docker 镜像充当蓝图,用于在不同系统上部署一致且可重现的应用程序环境。

Docker 镜像的关键组件

graph TD A[Docker 镜像] --> B[基础层] A --> C[应用层] A --> D[配置层]
组件 描述 示例
基础层 基础操作系统 Ubuntu 22.04
应用层 软件和依赖项 Python 3.9, nginx
配置层 运行时设置 环境变量

创建基础 Docker 镜像

以下是创建一个简单的 Python 网络应用镜像的示例:

## 创建项目目录
mkdir docker-demo
cd docker-demo

## 创建 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.py.
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():
    return "Docker Image Example"

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

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

镜像层与存储

Docker 镜像是由多个只读层组成的。Dockerfile 中的每条指令都会创建一个新层,从而实现高效存储并加快镜像创建速度。在构建镜像时,Docker 会缓存这些层,以优化构建时间并减少磁盘空间使用。

镜像标识

Docker 镜像通过以下方式唯一标识:

  • 仓库名称
  • 标签
  • 镜像 ID

示例:ubuntu:22.04python-web-app:latest

构建 Docker 镜像

Dockerfile:镜像创建蓝图

Dockerfile 是一个文本文件,其中包含构建 Docker 镜像的指令。每条指令都会在镜像中创建一个新层,定义环境、依赖项和应用程序配置。

graph TD A[Dockerfile] --> B[基础镜像] A --> C[安装依赖项] A --> D[复制应用程序代码] A --> E[配置运行时]

Dockerfile 指令类型

指令 用途 示例
FROM 指定基础镜像 FROM ubuntu:22.04
RUN 执行命令 RUN apt-get update
COPY 将文件复制到镜像中 COPY app/ /application
WORKDIR 设置工作目录 WORKDIR /app
EXPOSE 定义网络端口 EXPOSE 8080
CMD 默认容器命令 CMD ["python", "app.py"]

实际的 Docker 镜像构建示例

## 创建项目结构
mkdir -p /tmp/docker-nodejs-app
cd /tmp/docker-nodejs-app

## 创建 Dockerfile
cat > Dockerfile << EOL
FROM node:16-alpine
WORKDIR /app
COPY package.json.
RUN npm install
COPY..
EXPOSE 3000
CMD ["node", "server.js"]
EOL

## 创建 package.json
cat > package.json << EOL
{
  "name": "nodejs-docker-app",
  "version": "1.0.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOL

## 创建简单的 Express 服务器
cat > server.js << EOL
const express = require('express');
const app = express();
const PORT = 3000;

app.get('/', (req, res) => {
  res.send('Docker Image Build Example');
});

app.listen(PORT, () => {
  console.log(\$(Server running on port ${PORT}));
});
EOL

## 构建 Docker 镜像
docker build -t nodejs-web-app.

## 验证镜像创建
docker images

镜像构建上下文

构建上下文是包含 Dockerfile 和引用文件的目录。在镜像构建期间,Docker 将整个目录发送到 Docker 守护进程,从而实现全面的镜像创建。

多阶段构建

多阶段构建允许通过在单个 Dockerfile 中使用多个 FROM 语句来创建更小、更高效的镜像,将构建时依赖项与运行时环境分开。

镜像管理技术

Docker 镜像优化策略

高效的镜像管理包括减小镜像大小、最小化层数,并实施镜像创建和存储的最佳实践。

graph TD A[镜像管理] --> B[减小大小] A --> C[层优化] A --> D[镜像版本控制] A --> E[仓库管理]

镜像大小减小技术

技术 描述 示例
Alpine 基础镜像 最小化的 Linux 发行版 FROM alpine:3.15
多阶段构建 分离构建和运行时环境 多个 FROM 语句
.dockerignore 排除不必要的文件 防止大文件传输

Docker 镜像生命周期管理

## 列出本地镜像
docker images

## 删除未使用的镜像
docker image prune

## 标记并为镜像打版本号
docker tag original-image:latest myregistry/image:v1.0

## 推送到 Docker 仓库
docker push myregistry/image:v1.0

## 拉取特定版本的镜像
docker pull myregistry/image:v1.0

高级镜像优化示例

## 创建优化后的 Dockerfile
cat > Dockerfile << EOL
## 用于 Python 应用的多阶段构建
FROM python:3.9-alpine AS builder
WORKDIR /app
COPY requirements.txt.
RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.9-alpine
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
COPY..
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
CMD ["python", "app.py"]
EOL

## 创建需求文件
cat > requirements.txt << EOL
flask==2.1.0
gunicorn==20.1.0
EOL

## 构建优化后的镜像
docker build -t optimized-python-app:slim.

## 分析镜像大小
docker images | grep optimized-python-app

Docker 仓库管理

Docker 仓库提供集中式的镜像存储和分发。它们支持版本控制、访问控制,并能在不同开发团队和环境之间高效地共享镜像。

镜像层缓存

Docker 会缓存镜像层以加快后续构建速度。按照变化频率从低到高的顺序排列 Dockerfile 指令,可将重新构建时间减到最短,并优化镜像创建过程。

总结

Docker 镜像是现代软件部署的基础,它提供了一种将应用程序及其依赖项打包的一致且高效的方式。通过掌握镜像创建技术、理解层机制以及利用 Dockerfile 指令,开发者可以简化他们的开发工作流程,并确保在不同系统上拥有可靠、可移植的应用程序环境。