ky818smKy818sm  2025-03-08 20:12 旷野小站 隐藏边栏 |   抢沙发  0 
文章评分 0 次,平均分 0.0

实例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 脚本处理初始化操作

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

声明:如果本站发布的内容侵犯到您的权益,请通过邮件【[email protected]】联系本站,我们将及时删除!

发表评论

表情 格式 链接 私密 签到