当前位置: 首页 > news >正文

Docker DockerFile和Django最佳实践

Dockerfile 常见编写方法

  1. 基础镜像选择:选择一个合适的基础镜像作为起点。
  2. 工作目录设置:使用 WORKDIR 指令设置工作目录。
  3. 依赖安装:使用 RUN 指令安装必要的依赖。
  4. 文件复制:使用 COPYADD 指令将本地文件复制到镜像中。
  5. 环境变量设置:使用 ENV 指令设置环境变量。
  6. 暴露端口:使用 EXPOSE 指令声明容器运行时需要监听的端口。
  7. 启动命令:使用 CMDENTRYPOINT 指令指定容器启动时要运行的命令。

常用指令

  1. FROM

    • 用途:指定基础镜像。
    • 示例:FROM python:3.9-slim
  2. WORKDIR

    • 用途:设置工作目录。
    • 示例:WORKDIR /app
  3. RUN

    • 用途:执行命令并创建新的镜像层。
    • 示例:RUN pip install -r requirements.txt
  4. COPY

    • 用途:将文件或目录从主机复制到镜像中的指定位置。
    • 示例:COPY . /app
  5. ADD

    • 用途:类似于 COPY,但支持自动解压压缩文件。
    • 示例:ADD myapp.tar.gz /app
  6. ENV

    • 用途:设置环境变量。
    • 示例:ENV MY_ENV_VAR=my_value
  7. EXPOSE

    • 用途:声明容器运行时需要监听的端口。
    • 示例:EXPOSE 8000
  8. CMD

    • 用途:指定容器启动时要运行的默认命令。
    • 示例:CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
  9. ENTRYPOINT

    • 用途:指定容器启动时要运行的命令,通常与 CMD 结合使用。
    • 示例:ENTRYPOINT ["uwsgi", "--ini", "uwsgi.ini"]
  10. VOLUME

    • 用途:创建挂载点,用于数据持久化。
    • 示例:VOLUME /data

Django + uWSGI 的最佳实践

假设你的项目结构如下:

my-django-app/
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
├── uwsgi.ini
└── src/
    └── manage.py
    └── my_django_app/
        └── settings.py
        └── wsgi.py

Dockerfile 文件

# 使用官方Python基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

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

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

# 复制项目代码
COPY . .

# 安装uWSGI
RUN pip install uwsgi

# 创建日志目录
RUN mkdir -p /var/log/uwsgi

# 设置环境变量
ENV DJANGO_SETTINGS_MODULE=my_django_app.settings

# 暴露端口
EXPOSE 8000

# 默认命令
CMD ["uwsgi", "--ini", "uwsgi.ini"]

requirements.txt 文件

确保你的 requirements.txt 文件包含所有必要的依赖项,例如:

Django==3.2.12
uwsgi==2.0.20
mysqlclient==2.0.3
redis==3.5.3

uwsgi.ini 文件

以下是一个简单的 uWSGI 配置文件示例:

[uwsgi]
module = my_django_app.wsgi:application
master = true
processes = 4
socket = :8000
chmod-socket = 660
vacuum = true
die-on-term = true
logto = /var/log/uwsgi/uwsgi.log

docker-compose.yml 文件

为了方便管理和部署,可以使用 docker-compose.yml 文件来定义服务:

version: '3.8'

services:
  db:
    image: mysql:5.7
    container_name: django_db
    environment:
      MYSQL_ROOT_PASSWORD: example_root_password
      MYSQL_DATABASE: django_db
      MYSQL_USER: django_user
      MYSQL_PASSWORD: example_django_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - django-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  redis:
    image: redis:alpine
    container_name: django_redis
    networks:
      - django-net
    restart: unless-stopped

  web:
    build: .
    container_name: django_web
    ports:
      - "8000:8000"
    environment:
      DJANGO_DB_HOST: db
      DJANGO_DB_NAME: django_db
      DJANGO_DB_USER: django_user
      DJANGO_DB_PASSWORD: example_django_password
      REDIS_HOST: redis
    depends_on:
      - db
      - redis
    networks:
      - django-net
    restart: unless-stopped

networks:
  django-net:
    driver: bridge

volumes:
  db_data:

具体部署命令

  1. 构建和启动服务

    docker-compose up -d
    
  2. 查看服务状态

    docker-compose ps
    
  3. 停止服务

    docker-compose down
    
  4. 重启服务

    docker-compose restart <service_name>
    

    例如,重启 web 服务:

    docker-compose restart web
    
  5. 重新构建并启动服务(如果修改了 docker-compose.ymlDockerfile):

    docker-compose up -d --build
    

相关文章:

  • 0321美团实习面试——技能大致内容
  • JVM的一些知识
  • 如何在项目中有效管理设计模式的复杂性
  • 达梦数据库主备切换技术解析与实践指南
  • 《数字图像处理》第三章3.3直方图处理学习笔记
  • Java面试第十一山!《SpringCloud框架》
  • ArcGIS10. 8简介与安装,附下载地址
  • nginx 日志切割
  • Docker进阶篇1:什么是Docker数据卷?为什么需要Docker数据卷?Docker数据卷3种类型介绍
  • 5、MySQL为什么使用 B+树 来作索引【高频】
  • 【机器学习chp14 — 2】生成式模型—变分自编码器VAE(超详细分析,易于理解,推导严谨,一文就够了)
  • 从零开始实现 C++ TinyWebServer 缓冲区 Buffer类详解
  • 【万字总结】前端全方位性能优化指南(一)——Brotli压缩、CDN智能分发、资源合并
  • 界面控件DevExpress WinForms v25.1预览 - 提升.NET开发效率
  • Spark 中agg的用法
  • 《Python深度学习》第四讲:计算机视觉中的深度学习
  • AI实干家:HK深度体验-【第3篇-香港、新加坡、深圳、上海、首尔五座城市在金融数据维度的对比分析】
  • 【机器学习chp14 — 1】生成式模型概述和主要思想(超详细分析,易于理解,推导严谨,一文就够了)
  • ArkTS 基础语法介绍
  • Oracle Exadata KVM 虚拟化
  • 新希望去年归母净利润4.74亿同比增逾九成,营收降27%
  • 调查丨当节气出现“时差”,陕西的果农们经历着什么?
  • 贵州赤水被指“整改复耕”存形式主义,当地部署耕地流出整改“回头看”
  • 外交部回应美财长涉中国发展经济模式言论:损害各国人民共同利益的是美方
  • 国家发改委:更大力度、更实举措促进民营经济高质量发展
  • 展讯:漫游者秦龙和巫鸿的三本书