实例1
创建Dockerfile
FROM ubuntu:22.04 # 安装LNMP(替换为实际安装命令) RUN apt-get update && apt-get install -y wget && \ wget -O lnmp1.9.tar.gz http://soft.vpser.net/lnmp/lnmp1.9.tar.gz && \ tar zxf lnmp1.9.tar.gz && cd lnmp1.9 && ./install.sh lnmp # 设置启动命令 CMD ["/bin/bash", "-c", "/lnmp start && tail -f /dev/null"]
构建镜像
docker build -t my-lnmp-image .
运行容器
docker run -d --name my-lnmp-container my-lnmp-image
实例2
# 第一阶段:构建阶段(使用完整环境编译依赖) FROM python:3.9-slim as builder # 设置工作目录 WORKDIR /app # 安装构建依赖(编译某些Python包可能需要gcc等工具) RUN apt-get update && \ apt-get install -y --no-install-recommends gcc python3-dev # 复制 requirements 文件(利用Docker层缓存,避免重复安装依赖) COPY requirements.txt . # 安装依赖到虚拟环境(减少最终镜像大小) RUN python -m venv /opt/venv ENV PATH="/opt/venv/bin:$PATH" RUN pip install --no-cache-dir -r requirements.txt # 第二阶段:运行阶段(使用最小化镜像) FROM python:3.9-slim # 设置容器元数据 LABEL maintainer="[email protected]" LABEL version="1.0" # 创建非root用户(安全最佳实践) RUN useradd -m appuser && chown -R appuser /app USER appuser WORKDIR /app # 从构建阶段复制已安装的依赖 COPY --from=builder --chown=appuser /opt/venv /opt/venv # 设置环境变量 ENV PATH="/opt/venv/bin:$PATH" \ PYTHONUNBUFFERED=1 \ PORT=8000 # 复制应用代码(放在依赖安装后,便于代码修改时利用缓存) COPY --chown=appuser . . # 暴露端口 EXPOSE $PORT # 健康检查 HEALTHCHECK --interval=30s --timeout=3s \ CMD curl --fail http://localhost:$PORT/health || exit 1 # 容器启动命令 CMD ["gunicorn", "--bind", "0.0.0.0:$PORT", "app:app"]
关键指令详解
多阶段构建 (Multi-stage Build)
FROM ... as builder:
第一阶段安装构建依赖,生成虚拟环境
COPY --from=builder:
第二阶段仅复制编译结果,最终镜像不包含构建工具
优点:减少镜像大小(示例中从 ~300MB 缩减到 ~120MB)
依赖管理优化
先单独复制 requirements.txt
:利用 Docker 层缓存,当依赖未变化时跳过安装过程
使用 --no-cache-dir
:避免缓存文件增加镜像体积
虚拟环境:隔离系统 Python 环境,便于依赖管理
安全增强
创建非 root 用户 (appuser):避免容器以 root 权限运行
--chown=appuser
:确保文件权限正确
定期更新基础镜像:python:3.9-slim
会自动获取安全更新
环境配置
PYTHONUNBUFFERED=1
:确保 Python
输出实时显示
使用环境变量 $PORT
:提高配置灵活性
健康检查
定期检测应用健康状态
搭配编排工具(如 Kubernetes)可实现自动故障转移
配套文件建议
.dockerignore
.git __pycache__ *.pyc .env Dockerfile
避免将无关文件复制到镜像中
构建与运行命令
# 构建镜像 docker build -t myapp:v1 . # 运行容器 docker run -d -p 8000:8000 --name myapp myapp:v1 # 查看日志 docker logs -f myapp
最佳实践总结
镜像最小化:移除构建工具、清理缓存
利用层缓存:变动频率低的层放在前面
安全优先:非 root 用户、定期更新基础镜像
明确声明:通过 LABEL 记录元数据
可配置性:使用环境变量传递参数
健康监测:保证容器可观测性
根据具体需求可调整:
开发环境:可能需要挂载代码卷 (-v $(pwd):/app)
生产环境:增加CPU/内存限制 (–cpus, –memory)
复杂应用:添加ENTRYPOINT 脚本处理初始化操作