0%

django开发之在docker中部署项目

今天整理了一下如何在docker中部署django项目。

项目环境

1
python3.6 django2.0.5 nginx mysql5.7 gunicorn

项目文件

项目主目录为 blog 目录,需要编写的文件包括(省去了其他django文件)

1
blog/Dockerfile, blog/gunicorn.conf, blog/start.sh, nginx/Doickerfile, nginx/nginx.conf, docker-conpose.yml

项目配置

Docker配置

blog/Dockerfile 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM python:3.6    # 选择基础镜像,这里的基础镜像也可以选择ubuntu,centos等,但是下面的配置就会发生变化

# 创建工作目录
RUN mkdir /blog

#设置工作目录
WORKDIR /blog

#将当前目录加入到工作目录中
ADD . /blog
RUN pip3 install -r requirements.txt
#对外暴露端口
EXPOSE 80 8080 8000 5000
#设置环境变量
ENV SPIDER=/blog

上面基础镜像使用的是python:3.6,而不是ubuntu、centos。如果是ubuntu、cenos,Dockerfile文件中需要配置python环境

nginx/Doickerfile 内容如下:

1
2
3
4
5
6
7
8
9
FROM nginx    # nginx镜像,最好是先拉取到本地


# 对外暴露端口
EXPOSE 80 8000

RUN rm /etc/nginx/conf.d/default.conf # 删除原有配置文件
ADD nginx.conf /etc/nginx/conf.d/ # 添加配置文件
RUN mkdir -p /usr/share/nginx/html/static # 创建静态资源文件夹

docker-compose.yml 内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: "3"

services:


db:
image: mysql:5.7 # mysql镜像,最好先拉取到本地
environment:
- MYSQL_HOST=localhost
- MYSQL_DATABASE=docker
- MYSQL_USER=root
- MYSQL_PASSWORD=wyzane
- MYSQL_ROOT_PASSWORD=wyzane
volumes:
- /home/wyzane/pyprojects/db:/var/lib/mysql # 将宿主机与容器中的文件映射
restart: always # 若容器运行出现问题,会自动重启容器

web:
build: ./blog
ports:
- "8000:8000"
volumes:
- ./blog:/blog
- /tmp/logs:/tmp
command: bash start.sh # 执行命令,有多种格式
links:
- db
depends_on:
- db
restart: always

nginx:
build: ./nginx
ports:
- "80:80"
volumes:
- ./blog/static:/usr/share/nginx/html/static:ro
links:
- web
depends_on:
- web
restart: always

gunicorn配置

blog/gunicorn.conf 的配置内容如下:

1
2
3
workers=2
bind='0.0.0.0:8000'
proc_name='blog'

start文件配置

blog/start.sh 文件内容如下,用于启动项目:

1
2
3
4
5
#!/bin/bash
python manage.py collectstatic --noinput&&
python manage.py makemigrations&&
python manage.py migrate &&
gunicornblog.wsgi:application -c gunicorn.conf

nginx配置

nginx/nginx.conf 文件配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80;
server_name localhost;

location /static {
alias /usr/share/nginx/html/static;
}

location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

}

项目启动

配置完成后,依次执行以下命令:

1
2
docker-compose build
docker-compose up -d

执行完成后,通过 docker images 命令可以查看新增了2个镜像,docker ps 命令可以查看启动了3个容器。

多执行几次docker ps,当容器的STATUS是以Restarting开头时,表示这个容器运行时发生了错误。执行docker logs CONTAINERID可以查看容器出错的具体原因。

若上述容器都成功运行,则在浏览器中输入http://127.0.0.1:80/api/v1/articles/info/时(这是django中的一个视图,在这里没有写出来,不同的小伙伴可以替换成不同的接口),视图会返回相应的结果。
以交互方式进入容器:

1
docker exec -it CONTAINERID /bin/bash

后,进入mysql数据库,会看到在数据库中生成了相应的表。

遇到问题

在运行3个容器后,web容器一直报错,通过 docker logs CONTAINERID查看主要错误信息如下:

1
django.db.utils.OperationalError: (2003, 'Can\'t connect to MySQL server on \'mariadb55\' (111 "Connection refused")')

解决方案在这里:

1
https://stackoverflow.com/questions/47979270/django-cannot-connect-mysql-in-docker-compose

主要是在settings.py中,将database配置中的HOST值改成db,而不是127.0.0.1,指向docker-compose.yml中的db服务。