上一篇简单介绍了在Linux主机上部署django应用的方式,本文将部署方式改造成容器,与主机部署的主要区别是无需以systemd托管服务,仍然用到了gunicorn,nginx。
接下来以我实际环境的配置文件为例,介绍一下容器中部署django应用
一、使用 python-3.12.5-alpine基础镜像,
FROM python:3.12.5-alpine
ENV LANG=C.UTF-8
# 端口
EXPOSE 8000
# 更改镜像源,以加速安装,修改时区参数,安装nginx
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
    apk --no-cache add tzdata && \
    apk upgrade musl openssl && \
    apk add nginx && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&   \
    echo ""Asia/Shanghai"" > /etc/timezone
# 如果用到了Pillow还需要这些库
RUN apk add zlib-dev jpeg-dev openjpeg-dev tiff-dev freetype-dev
# 添加本地的nginx配置文件,用于优化参数,配置server等
ADD docker/nginx.conf /etc/nginx/nginx.conf
ADD docker/gunicorn.conf /etc/nginx/conf.d/gunicorn.conf
# 工作目录
WORKDIR /myproject
# 项目目录, 以处以非打包方式运行,若程序进行了打包,则添加相应的文件
ADD . /myproject
RUN pip install -r requirements.txt
RUN python manage.py collectstatic
# 程序入口
CMD ["sh", "./start.sh"]
关于docker/nginx.conf, docker/gunicorn.conf也可以更优雅的使用RUN cmd的方式创建。
# nginx.conf 中添加了gzip相关参数和设置了body size
....
    client_max_body_size 20M;
    gzip  on;
    gzip_min_length  2000;
    gzip_comp_level 8;
    gzip_types text/plain text/css application/javascript application/xml application/json;
    gzip_vary on;
....
# gunicorn.conf
server {
    listen       80;
    server_name  localhost;
    location / {
        root /code;
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
入口方法执行了 start.sh,如下:
nginx gunicorn -c /code/gunicorn.conf.py myproject.wsgi
这里用到了gunicorn.conf.py配置文件,其中主要修改了 daemon = ‘false’,使gunicorn在终端中前置运行。
bind = "127.0.0.1:8000" # workers是工作线程数,一般设置成:服务器CPU个数 + 1 workers = 2 daemon = 'false' loglevel = 'info'
以上文件配置好以后,就可以使用docker 命令打包镜像
docker build -t myproject:v20250918 -f ./Dockerfile