Docker部署Django(一)單容器部署Django + uwsgi

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樣式,我們需要手動處理
  1. 修改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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章