在容器中,使用gunicorn部署django应用

0
(0)

上一篇简单介绍了在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

这篇文章有用吗?

点击星号为它评分!

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注