实例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="your.email@example.com"
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 脚本处理初始化操作
本文为原创文章,版权归旷野小站所有,欢迎分享本文,转载请保留出处!