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要完成的事项:
-
拉取具有python3.8版本的linux镜像
-
设置Python环境变量
-
运行命令,在容器内创建相关目录
-
设置容器内工作目录
-
安装python包管理工具
-
将宿主机的文件添加到容器的指定目录
-
运行命令安装依赖环境
-
将本地代码文件添加到容器中
容器构建
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;