TONG-H

Docker速查笔记

Note2025-01-30

Docker速查笔记

1. Dockerfile 是什么?

Dockerfile 是一个文本文件,里面包含了一系列指令,用来定义如何构建一个 Docker 镜像。你可以把它想象成一个“菜谱”,Docker 会根据这个“菜谱”一步步构建出你想要的镜像。


2. Dockerfile 的基本结构

一个典型的 Dockerfile 由多个指令组成,每个指令对应一个操作。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 基础镜像
FROM ubuntu:20.04

# 设置工作目录
WORKDIR /app

# 复制文件到容器中
COPY . .

# 安装依赖
RUN apt-get update && apt-get install -y python3

# 暴露端口
EXPOSE 80

# 运行命令
CMD ["python3", "app.py"]

3. Dockerfile 常用指令详解

1. FROM

  • 作用:指定基础镜像。
  • 语法FROM <镜像名>:<标签>
  • 示例FROM ubuntu:20.04

2. WORKDIR

  • 作用:设置工作目录,后续命令会在此执行。
  • 示例WORKDIR /app

3. COPY

  • 作用:将本地文件复制到容器中。
  • 示例COPY . .

4. RUN

  • 作用:执行命令(通常用于安装依赖)。
  • 示例RUN apt-get update && apt-get install -y python3

5. EXPOSE

  • 作用:声明容器运行时监听的端口(不自动映射)。
  • 示例EXPOSE 80

6. CMD

  • 作用:指定容器启动时默认执行的命令。
  • 示例CMD ["python3", "app.py"]

7. ENV

  • 作用:设置环境变量。
  • 示例ENV PYTHON_VERSION=3.8

8. ADD

  • 作用:类似 COPY,但可解压或从 URL 下载文件。
  • 示例ADD https://example.com/file.tar.gz /app

9. ENTRYPOINT

  • 作用:设置容器启动时固定执行命令。
  • 示例
    1
    2
    ENTRYPOINT ["python3"]
    CMD ["app.py"]

10. VOLUME

  • 作用:声明挂载点,用于持久化数据。
  • 示例VOLUME /data

4. Dockerfile 最佳实践

1. 减少镜像层数

1
RUN apt-get update && apt-get install -y python3 && apt-get clean

2. 使用 .dockerignore

防止无关文件被复制到镜像中。

3. 多阶段构建

1
2
3
4
5
6
7
FROM node:14 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

5. 实战:编写一个 Python 应用的 Dockerfile

项目结构

1
2
3
4
my-app/
├── app.py
├── requirements.txt
└── Dockerfile

Dockerfile 内容

1
2
3
4
5
6
7
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

构建与运行

1
2
docker build -t my-python-app .
docker run -p 5000:5000 my-python-app

6. 常见基础镜像分类

操作系统镜像

镜像名 特点 示例标签
ubuntu 功能全面 ubuntu:22.04
alpine 轻量(5MB) alpine:latest
centos 稳定,常用于企业 centos:8
debian 稳定精简 debian:bullseye

语言运行时镜像

语言 官方镜像示例 说明
Python python:3.11-slim 轻量环境
Node.js node:18-alpine 带 npm/yarn
Go golang:1.20-alpine 编译环境
Java eclipse-temurin:17-jdk-alpine OpenJDK
PHP php:8.2-apache 带 Apache 支持

数据库镜像

数据库 镜像名 常用标签
MySQL mysql mysql:8.0
PostgreSQL postgres postgres:latest
Redis redis redis:6.2

Web 服务器镜像

服务 镜像名 示例标签
Nginx nginx nginx:latest
Apache HTTPD httpd httpd:2.4

特殊用途镜像

镜像 特点
scratch 空镜像,用于静态二进制
busybox 极轻量系统工具集

✅ 总结

  • 合理使用 .dockerignore 减少冗余。
  • 多阶段构建减少体积。
  • 优先选择官方轻量镜像。
  • 注意 CMD 与 ENTRYPOINT 的区别。