django使用笔记6--docker部署

django使用笔记--docker部署

由于服务器中python版本和依赖与本地开发环境不同,且centOS7中python及依赖安装更新较为麻烦,所以采用docker容器部署

多环境配置

多环境配置类似Spring中的多环境配置。线上版本因为和数据库都是容器部署,所以放在一个自定义网络下,通过容器名称访问。

开发版本则是直接通过IP地址访问。即:

python 复制代码
# 定义共享配置文件 settings_base.py
# 定义本地配置文件 settings_dev.py
# 定义线上配置文件 settings_prod.py
# dev和prod中引入base
from .settings_base import *
# 注意settings配置和manage.py配置文件所在目录层级不同,根目录的获取方法不同

创建环境变量配置文件

  1. 抽取敏感配置数据,在项目根目录下创建.env.dev和.env.prod,分别存放本地和线上的配置数据。
  2. 通过dotenv模块读取配置文件,并生成环境变量。
python 复制代码
from pathlib import Path
from dotenv import load_dotenv

BASE_DIR = Path(__file__).resolve().parent
# print(BASE_DIR)
# print(os.path.join(BASE_DIR, '.env'))
# 加载.env文件
result = load_dotenv(os.path.join(BASE_DIR, '.env'))
  1. 不同层级目录下,确保能正确读取到配置文件
python 复制代码
# 这里没注意 BASE_DIR 区别,直接复制导致配置一直读取不到
BASE_DIR = Path(__file__).resolve().parent
BASE_DIR = Path(__file__).resolve().parent.parent

静态资源配置

python 复制代码
# 静态资源的请求路径
STATIC_URL = '/static/'
# 开发过程中,额外的静态文件存放目录
# STATICFILES_DIRS = [
#     os.path.join(BASE_DIR, 'static'),
# ]

# 静态资源的根目录
# 执行 python manage.py collectstatic时,
# 将静态文件收集到 staticfiles 目录下,包括STATICFILES_DIRS 定义的目录
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

例如:django后台管理接口,

  1. 访问 localhost:8000/admin/
  2. 静态资源请求路径:localhost:8000/static/admin/css/base.css,
  3. 对应的静态文件在项目根目录下的 staticfiles/admin/css/base.css

这里配置nignx的时候费了点时间,接口通了,但静态资源请求全部404。

  1. 将所有/python的请求转发到本地8000端口,该端口映射对应的django项目容器端口8000
  2. xxx.com/python/admin/ 可以方法,但静态资源请求404,具体请求为 xxx.com/static/...
  3. 先在容器宿主机上确保可以访问静态文件,我的localhost和127.0.0.1都无法访问,但通过服务器IP可以访问,
    即:191.127.32.21:8000/static/admin/css/base.css
  4. 确定容器外部可以访问静态文件后,再配置nginx,将请求转发到django容器。
conf 复制代码
server {
   listen       443 ssl http2;
   # 接口配置
   location /python/{
        proxy_pass http://localhost:8000/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
   }
   # 静态文件配置
   location /static/ {
        proxy_pass 191.127.32.21:8000/static/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

dockerfile配置

这里打包镜像后,可进入容器内部查看目录结构,

如果配置未加载,可查看.env是否存在,打印BASE_DIR当前路径是否正确

dockerfile 复制代码
# 使用官方 Python 镜像
FROM python:3.10-slim

# 设置环境变量,
ENV DJANGO_SETTINGS_MODULE=python_web.settings_prod

# 复制项目文件到工作目录
COPY . /python_web_root/
# 设置工作目录,即 进入工作目录下执行后续命令
WORKDIR /python_web_root
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 收集静态文件
RUN python manage.py collectstatic --noinput
# 暴露应用端口
EXPOSE 8000

# 启动 Django 应用
CMD ["gunicorn", "python_web.wsgi:application", "--bind", "0.0.0.0:8000"]
相关推荐
小夏卷编程2 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
wefly20172 小时前
开发者效率神器!jsontop.cn一站式工具集,覆盖开发全流程高频需求
前端·后端·python·django·flask·前端开发工具·后端开发工具
JEECG低代码平台2 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
日更嵌入式的打工仔3 小时前
个人笔记3
笔记
生活爱好者!3 小时前
NAS帮我找回童年的快乐!部署 小游戏
运维·服务器·docker·容器·娱乐
自在极意功。4 小时前
nginx和docker面试题
运维·nginx·docker
天外来鹿4 小时前
Map/Set/WeakMap/WeakSet学习笔记
前端·javascript·笔记·学习
菩提小狗4 小时前
第23天:安全开发-PHP应用&后台模块&Session&Cookie&Toke_笔记|小迪安全2023-2024|web安全|渗透测试|
笔记·安全·php
HuDie3405 小时前
黑马多模态AIGC课程笔记
笔记·aigc
leixj0255 小时前
SVN学习笔记
笔记·学习·svn