Django项目容器化部署基本方法

Django项目容器化(编写Dockerfile)

FROM python:3.8

ENV PYTHONUNBUFFERED 1

RUN mkdir -p /root/code/search_association
WORKDIR /root/code/search_association

RUN pip install pip -U

ADD requirements.txt /root/code/

RUN pip install -r ../requirements.txt

ADD ./search_association /root/code

以上Dockerfile内容声明了Docker要完成的事项:

  1. 拉取具有python3.8版本的linux镜像

  2. 设置Python环境变量

  3. 运行命令,在容器内创建相关目录

  4. 设置容器内工作目录

  5. 安装python包管理工具

  6. 将宿主机的文件添加到容器的指定目录

  7. 运行命令安装依赖环境

  8. 将本地代码文件添加到容器中

容器构建

docker build -t NAME:TAG .

可以使用docker ps -a查看已有容器

容器编排

举个例子,我要将一个后端项目通过容器的形式部署,其中可能涉及到django、mysql、nginx等多个服务,这些服务可能都需要容器化,那么如何统一管理一个应用的多个容器呢?这就是容器编排需要解决的问题。

docker-compose用于定义和运行具有多个Docker容器的应用程序工具,通过yaml文件配置应用的服务。详见官网Docker Compose overview | Docker Docs

docker-compose配置

比如我需要将django容器编排到应用中,就可以新建docker-compose.yml,配置容器相关信息,如容器应用名app对应配置:

  • network_mode

    指定的容器中的网络模式,可以是bridge(桥接模式,将局域网内的ip分配给容器)、host(主机模式,消除容器与主机的网络隔离,容器与宿主机共享网络、共用端口)

    在使用桥接模式时,如果需要使桥接网络上的容器与外界通信或可访问,需要配置端口映射,如下面例子将容器的8000端口映射到主机的22999端口,使外部流量可以经主机的22999端口访问容器内的服务。

    可以使用以下命令列举可用网络

    docker network ls
    

  • restart

    容器重启策略,always表示容器在停止或崩溃后自动重启。

  • build

    指定需要构建的docker容器的Dockerfile所在目录。也可以不指定该参数,提前构建好容器

  • command

    指定启动容器后需要执行的命令,如下面的例子指定容器启动后在工作目录中运行以noreload模式启动django服务,服务端口为8000(容器内端口)

  • volumes

    数据挂载,宿主机的当前目录与容器内/root/code目录建立映射。如果希望多个项目部署时共用宿主机的开发环境或者数据,可以选择使用该配置挂载某些目录,无需将数据或环境复制到容器内

  • ports

    端口映射,宿主机的22999映射到容器的8000,通过docker ps命令可以查看容器与宿主机的端口映射情况

version: "3"
services:
  app:
    network_mode: "bridge"
    restart: always
    build: .
    command: "python3 manage.py runserver 0.0.0.0:8000 --noreload"
    # volumes:
    #  - .:/root/code
    ports:
      - "127.0.0.1:22999:8000"
      - "192.168.1.2:22999:8000"

所以,按照上面的配置,运行docker-compose up -d命令后,即可启动容器,如果容器内项目正常启动,就可以通过宿主机使用127.0.0.1:22999地址访问到容器内的django服务。

如果需要更新项目代码重新部署,只需要更新代码后重启docker容器即可。(docker restart)

注意事项

如果希望容器内启动的Django项目访问宿主机的数据库(如MySQL),需要确保连接用户具有远程连接权限,如MySQL8.0+使用下面命令授予用户DEV远程连接数据库的权限。

GRANT ALL PRIVILEGES ON *.* TO 'DEV'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

参考文档

CoolCats
CoolCats
理学学士

我的研究兴趣是时空数据分析、知识图谱、自然语言处理与服务端开发