使用docker-compose,在3分钟内部署Django

我已经为已创建的项目创建了适用的docker-compose形式,因此将规范整理成一篇文章。

我在GitHub上写了一个”HowtoUse”,请随便看。

如果您更改了默认的sqlite数据库,我想您可能需要进行其他设置… 对不起。

部署环境将采用Django + Nginx + Gunicorn。

总结

请参阅上文所提供的GitHub README链接以获取用法说明。

为了实现简单的部署,我创建了一个适用于Django部署的docker-compose,它以以下目录结构运行。

django-nginx-gunicorn-docker/
      ├ nginx/
      │ └ project.conf
      ├ django/
      │  ├ Dockerfile
      │  ├ requirements.txt
      │  └ [DJANGOPROJECT]
      │     ├ manage.py
      │     ├ …
      │     └ [PROJECTNAME]
      └ docker-compose.yml

我们将整个项目挂载到容器中并运行。
现在我们来看配置文件。

docker-compose
容器编排

使用的容器包括用于Django应用的(Gunicorn也在其中运行)和用于充当反向代理角色的Nginx容器。

version: '3'
services:
    django:
        build: ./django
        expose:
            - "8000"
        networks:
            - nginx_network
        volumes:
            - ./django:/code
        hostname: django-server
        restart: always
    nginx:
        image: nginx
        ports:
            - "80:80"
        networks:
            - nginx_network
        depends_on:
            - django
        volumes:
            - ./nginx/project.conf:/etc/nginx/conf.d/default.conf
        restart: always
networks:
    nginx_network:
        driver: bridge

在Django的卷部分,我正在挂载项目环境。如果在容器启动后进行编辑,只需重新启动容器即可使更改生效。

此外,由于在nginx容器中使用了80:80端口转发,当访问本地主机的80端口时,将被转发到nginx容器。

我没有做什么特别棘手的事情,所以关于compose的解释到此为止。

Dockerfile:

这是关于位于Django目录中的Dockerfile的说明。

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
WORKDIR /code/MYPROJECT
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "MYPROJECT.wsgi:application"]

使用Python3的映像。在第6行的RUN命令中下载了Django和Gunicorn。(还顺便下载了用于Postgres的库,但没有使用。抱歉)

Django==2.2.7
gunicorn==19.9.0
psycopg2

顺便提一下,关于Django的版本,起初我在Github上指定了2.0版本,结果被狠狠地批评了。(收到了很多安全警告。还收到来自GitHub机器人愤怒的拉取请求。)

项目配置文件

这是一个nginx的配置文件。

upstream django {
  server django:8000;
}

server {
    listen  80;
    server_name :localhost;

    location / {
        proxy_pass http://django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

在上游,您可以指定请求的目标地址。目标地址是容器的localhost。同样,您还可以在代理路径设置中使用在这里命名的内容。

服务器正在进行端口监听和代理设置。

最后

我在端口设置中遇到了困难…
大家也要小心哦;;