1. 创建django项目
django-admin startproject docker_django
# 生成数据库迁移文件
python3 manage.py makemigrations
# 执行数据库映射
python3 manage.py migrate
# 创建管理员账户
python3 manage.py createsuperuser
# 修改配置文件settings.py
ALLOWED_HOSTS = ['*']
# 如果在服务器上启动的项目,需要开放防火墙8000端口,此处为了演示方便,直接关闭防火墙
systemctl stop firewalld
# 启动项目
python3 manage.py runserver 0:8000
# 在浏览器中访问后台管理界面
http://10.10.102.237:8000/admin/login/?next=/admin/
- 此时我们应该可以登录Django自带的后台
2.使用uwsgi启动Django
1.安装uwsgi,此处使用豆瓣源加速
pip3 install uwsgi -i https://pypi.douban.com/simple
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
2.在项目根目录下(即与manage.py同级别目录)创建uwsgi.ini文件
vi /xxx/xxx/docker_django/uwsgi.ini
[uwsgi]
; 使用nginx连接时使用
; socket = 0.0.0.0:10000
; 直接做web服务器使用,指定要监听的ip和端口号,即我们运行项目时的ip和端口
http = 0.0.0.0:8000
; 项目目录
chdir = /var/www/html/docker_django
; 项目中的wsgi.py文件的目录
module = docker_django.wsgi:application
; 静态文件映射,测试uwsgi配置时为了能够访问到静态资源,所以加上这个配置。在使用nginx时,需要注销掉这个配置,改用nginx来代理静态资源访>问
; 可使用 python manage.py collectstatic
static-map=/static=/var/www/html/docker_django/static
; 指定启动的工作进程数
processes = 4
; 指定每个进程中的线程数
threads = 2
; 指定在工作进程中存在一个主进程
master = True
; 服务停止时自动移除unix Socket和pid文件
vacuum = True
; 保存启动之后主进程的进程号
pidfile = uwsgi.pid
; 设置uwsgi后台运行,运行信息保存在uwsgi.log
; daemonize = uwsgi.log
; 单个日志的大小
buffer-size=32768
; 设置每个工作进程处理请求的上限,达到上限时,将回收(重启)该进程。可以预防内存泄漏
max-requests=5000
3. 使用uwsgi代理启动django
- 在uwsgi所在目录执行下面命令启动
uwsgi uwsgi.ini
- 此时应该可以看到如下结果
- 当我们再次访问Django后台时,此时界面没有css样式,我们需要手动处理
- 修改settings.py文件,在文件最后增加以下内容,指定静态文件目录
`STATIC_ROOT = os.path.join(BASE_DIR, ‘static’)
MEDIA_ROOT = os.path.join(BASE_DIR, ‘media’)
MEDIA_URL = ‘/media/’`
2.执行静态文件收集命令
python3 manage.py collectstatic
- 此时,再次访问后台,又回到了熟悉的界面
3.使用docker部署
1. 部署前准备工作
- 关于docker的介绍以及命令此处不提,网上很多,也为了部署思路更加清晰
- 项目上线部署最重要的就是关闭debug调试模式,不能把报错信息展示给用户,避免被攻击
# 在settings.py中关闭DEBUG模式
DEBUG = False
- 部署时需要修改允许访问的地址ALLOWED_HOSTS,设置为服务器真实IP地址和本地回环地址127.0.0.1,如果有域名且做了域名映射的话,再将域名也加进去
# 在settings.py中修改ALLOWED_HOSTS
ALLOWED_HOSTS = ['10.10.102.237', '127.0.0.1']
- 在项目目录下执行下面命令,导出项目依赖包到项目目录(即manage.py同级目录)下的requirements.txt文件中,会自动创建该文件
pip3 freeze > requirements.txt
2. 编写Dockerfile,内容如下:
- 在当前项目目录下(即manage.py同级目录)创建Dockerfile
FROM centos:centos7
MAINTAINER Fat Puffer <dcpuffer@outlook.com>
# 更换yum源
RUN set -ex \
&& mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup \
&& curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo \
&& yum clean all \
&& yum makecache && yum update -y
# 安装python3.7.2
RUN set -ex \
&& yum -y install zlib-devel bzip2-devel libffi-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make wget \
&& yum clean all \
&& mkdir /usr/local/python3
COPY Python-3.7.2.tar.xz /usr/local/python3/
RUN set -ex \
&& cd /usr/local/python3 \
&& tar -xvJf Python-3.7.2.tar.xz \
&& cd Python-3.7.2 \
&& ./configure prefix=/usr/local/python3 \
&& make && make install \
&& ln -s /usr/local/python3/bin/python3.7 /usr/local/bin/python3 \
&& ln -s /usr/local/python3/bin/pip3 /usr/local/bin/pip3
RUN set -ex \
&& cd /usr/local/python3 \
&& python3 -V
# 在容器内/var/www/html/下创建docker_django文件夹
RUN mkdir -p /var/www/html/docker_django
# 设置容器内工作目录
WORKDIR /var/www/html/docker_django
# 将当前目录文件加入到容器工作目录中(. 表示当前宿主机目录)
ADD . /var/www/html/docker_django
# 利用 pip3 安装依赖
RUN set -ex \
pip3 install -r requirements.txt -i https://pypi.douban.com/simple \
pip3 install uwsgi -i https://pypi.douban.com/simple \
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
# Windows环境下编写的start.sh每行命令结尾有多余的\r字符,需移除。
RUN sed -i 's/\r//' ./start.sh
# 设置start.sh文件可执行权限
RUN chmod +x ./start.sh
- start.sh脚本文件内容如下所示。最重要的是最后一句,使用uwsgi.ini配置文件启动Django服务
#!/bin/bash
# 从第一行到最后一行分别表示:
# 1. 生成数据库迁移文件
# 2. 根据数据库迁移文件来修改数据库
# 3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver
python3 manage.py makemigrations &&
python3 manage.py migrate &&
python3 manage.py collectstatic
# python manage.py runserver 0.0.0.0:8000
uwsgi --ini /var/www/html/docker_django/uwsgi.ini
3.使用当前目录的 Dockerfile 创建镜像
# 根据Dockerfile创建名为django_uwsgi_img的镜像,版本v1,.代表当前目录
sudo docker build -t django_uwsgi_img:v1 .
4.启动并运行容器
# 根据镜像生成名称为django_docker的容器,并且启动将宿主机80端口映射到docker容器的8000端口
sudo docker run -it -d --name django_docker -p 80:8000 django_uwsgi_img:v1
5.进入django_docker的容器内部,并运行脚本命令start.sh
sudo docker exec -it django_docker /bin/bash start.sh
6.页面访问
http://10.10.102.237/admin