<返回目录     Powered by claude/xia兄

第4课: Dockerfile编写

什么是Dockerfile?

Dockerfile是一个文本文件,包含一系列指令,用于自动化构建Docker镜像。每条指令创建一个新的镜像层。

基本结构

# 基础镜像
FROM ubuntu:20.04

# 维护者信息
LABEL maintainer="your@email.com"

# 执行命令
RUN apt-get update && apt-get install -y nginx

# 复制文件
COPY index.html /var/www/html/

# 设置工作目录
WORKDIR /app

# 暴露端口
EXPOSE 80

# 启动命令
CMD ["nginx", "-g", "daemon off;"]

FROM - 指定基础镜像

# 使用官方镜像
FROM python:3.9

# 使用特定版本
FROM node:16-alpine

# 使用轻量级镜像
FROM alpine:latest

# 多阶段构建的第二阶段
FROM nginx:alpine AS production
常用基础镜像:

RUN - 执行命令

# Shell形式
RUN apt-get update

# Exec形式(推荐)
RUN ["apt-get", "update"]

# 合并多条命令减少层数
RUN apt-get update && \
    apt-get install -y nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 使用反斜杠换行提高可读性
RUN pip install --no-cache-dir \
    flask \
    requests \
    redis

COPY vs ADD

# COPY - 复制文件(推荐)
COPY app.py /app/
COPY requirements.txt /app/
COPY . /app/

# ADD - 复制并支持URL和自动解压
ADD https://example.com/file.tar.gz /tmp/
ADD archive.tar.gz /app/

# 使用.dockerignore排除文件
# 创建.dockerignore文件:
# node_modules
# .git
# *.log

WORKDIR - 设置工作目录

# 设置工作目录
WORKDIR /app

# 后续命令都在/app目录执行
COPY . .
RUN npm install

# 可以多次使用
WORKDIR /app/src
WORKDIR /app/dist

ENV - 设置环境变量

# 设置单个环境变量
ENV NODE_ENV production

# 设置多个环境变量
ENV APP_HOME=/app \
    APP_PORT=8080 \
    APP_USER=appuser

# 在后续指令中使用
WORKDIR $APP_HOME
EXPOSE $APP_PORT

EXPOSE - 声明端口

# 声明容器监听的端口
EXPOSE 80
EXPOSE 443
EXPOSE 8080/tcp
EXPOSE 8081/udp

# 注意:EXPOSE只是声明,实际映射需要-p参数

CMD vs ENTRYPOINT

# CMD - 容器启动时的默认命令(可被覆盖)
CMD ["python", "app.py"]
CMD ["nginx", "-g", "daemon off;"]

# ENTRYPOINT - 容器启动时的固定命令
ENTRYPOINT ["python", "app.py"]

# 组合使用
ENTRYPOINT ["python"]
CMD ["app.py"]
# 运行:docker run myimage server.py  # 执行python server.py

完整示例 - Python Web应用

FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# 暴露端口
EXPOSE 5000

# 创建非root用户
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser

# 启动命令
CMD ["flask", "run", "--host=0.0.0.0"]

最佳实践

实践练习

  1. 编写一个Dockerfile构建Python Flask应用
  2. 编写一个Dockerfile构建Node.js应用
  3. 创建.dockerignore文件排除node_modules
  4. 对比使用alpine和ubuntu基础镜像的大小差异