简介
本全面的 Docker 教程为开发者和 DevOps 专业人员提供了有关创建、管理和理解 Docker 镜像的基本知识。通过探索镜像组件、层结构和实际实现技术,学习者将获得容器化和应用程序打包方面的实用技能。
本全面的 Docker 教程为开发者和 DevOps 专业人员提供了有关创建、管理和理解 Docker 镜像的基本知识。通过探索镜像组件、层结构和实际实现技术,学习者将获得容器化和应用程序打包方面的实用技能。
Docker 镜像是用于创建容器的只读模板。它们包含预配置的软件环境、应用程序代码、依赖项和运行时设置。Docker 镜像充当蓝图,用于在不同系统上部署一致且可重现的应用程序环境。
组件 | 描述 | 示例 |
---|---|---|
基础层 | 基础操作系统 | Ubuntu 22.04 |
应用层 | 软件和依赖项 | Python 3.9, nginx |
配置层 | 运行时设置 | 环境变量 |
以下是创建一个简单的 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 镜像通过以下方式唯一标识:
示例:ubuntu:22.04
或 python-web-app:latest
Dockerfile 是一个文本文件,其中包含构建 Docker 镜像的指令。每条指令都会在镜像中创建一个新层,定义环境、依赖项和应用程序配置。
指令 | 用途 | 示例 |
---|---|---|
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"] |
## 创建项目结构
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 语句来创建更小、更高效的镜像,将构建时依赖项与运行时环境分开。
高效的镜像管理包括减小镜像大小、最小化层数,并实施镜像创建和存储的最佳实践。
技术 | 描述 | 示例 |
---|---|---|
Alpine 基础镜像 | 最小化的 Linux 发行版 | FROM alpine:3.15 |
多阶段构建 | 分离构建和运行时环境 | 多个 FROM 语句 |
.dockerignore | 排除不必要的文件 | 防止大文件传输 |
## 列出本地镜像
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 会缓存镜像层以加快后续构建速度。按照变化频率从低到高的顺序排列 Dockerfile 指令,可将重新构建时间减到最短,并优化镜像创建过程。
Docker 镜像是现代软件部署的基础,它提供了一种将应用程序及其依赖项打包的一致且高效的方式。通过掌握镜像创建技术、理解层机制以及利用 Dockerfile 指令,开发者可以简化他们的开发工作流程,并确保在不同系统上拥有可靠、可移植的应用程序环境。