1. 程式人生 > 其它 >docker部署django網站

docker部署django網站

目錄

docker部署django網站

以下均在centos7下進行。

1. 安裝docker

相關指令

  • 啟動docker服務 systemctl start docker

在安裝前,需要確認是否已經安裝docker,直接執行docker指令。如果已經安裝,則直接跳到下一步。

  • 沒有安裝

  • 已經安裝

安裝並啟動docker

  1. 安裝方法,執行下列語句(

    參考):

    curl -sSL https://get.daocloud.io/docker | sh
    
  2. 安裝後,啟動docker服務:

    systemctl start docker
    

2. 下載並啟動centos映象

相關指令

  • 下載映象 docker pull [iamge]
  • 啟動映象 docker run -di --name [container] [image]
  • 進入映象 docker exec -it [container] /bin/bash
  • 退出映象 ctrl + D

在部署網站時,使用的python等軟體的版本是不一樣的,這裡就直接使用純淨的centos映象,然後再上面安裝需要的軟體。

  1. 註冊dockerhub賬號

    dockerhub類似於github,是docker的遠端倉庫,在https://hub.docker.com/註冊一個賬號,並記住賬戶名,之後會使用到。這裡我的賬戶名是xdcat,之後也會被多次用到。

  2. 下載centos映象,這裡的centos是一個官方映象的名稱。

    docker pull centos
    
    • 檢視是否下載完成

  3. 建立並啟動容器

    • --name sample_django_project 容器的別名,方便之後使用
    • centos 來源的映象,就是之前下載的
    • -p 8090:80 將容器的80埠對映到電腦的8090埠
    docker run -tid --privileged=true --name sample_django_project -p 8090:80 centos /usr/sbin/init
    
  4. 進入容器,這裡直接使用剛剛建立的別名進入。

    docker exec -it sample_django_project /bin/bash
    

    在進入容器後,我們可以發現前面的識別符號不一樣了。

3. 在容器中準備網站環境

容器就相當於一個linux系統,直接在容器中安裝對應的軟體並執行網站。這裡我們以PON-Sol2的網站為例,使用uwsgi部署網站。

  1. 進入家目錄

    cd
    
  2. 下載程式碼

    程式碼我放在的github上,預設是沒有git的,所以需要先安裝git後,再下載程式碼。

    1. 安裝 git

      yum install -y git
      
    2. clone 程式碼

      git clone https://github.com/XDcat/PonSol2_Web
      
  3. 安裝python

    專案中對於python版本和各個軟體版本有明確要求,這裡使用miniconda(簡化版的anacodna),使用conda管理不同版本的python。這裡並不一定要要conda,直接安裝python然後安裝對應包就可以,看個人習慣。

    1. 安裝wget,用於下載其他內容

      yum -y install wget
      
    2. 官網下載miniconda

      wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
      
    3. 安裝miniconda

      bash Miniconda3-latest-Linux-x86_64.sh
      

      安裝流程:

      • 回車:開始安裝

      • 按住空格:跳過條款

      • yes:接受條款

      • 回車:預設安裝路徑

      • yes:是否初始化conda

    4. 安裝miniconda後,需要重新進入系統這樣才能啟動conda環境

      1. ctrl + D 退出系統

      2. 進入容器

        docker exec -it sample_django_project /bin/bash
        

        此時命令列最前面將會出現base字樣,表示初始化了conda

      3. 進入家目錄

        cd
        
      4. 修改conda配置檔案,新增映象源

        vi .condarc
        

        修改為下列內容

        ssl_verify: true
        show_channel_urls: true
        channels:
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/cloud/conda-forge/
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/free/
          - https://mirrors.sjtug.sjtu.edu.cn/anaconda/pkgs/main/
          - defaults
        channel_priority: flexible
        
  4. 建立網站執行環境

    1. 建立python環境

      注意:這裡的python版本是根據網站來的。

      • ponsol 環境名稱,再之後會多次使用到
      • python=3.7.7 指定python版本
      conda create -n ponsol python=3.7.7
      
    2. 啟用ponsol環境

      conda activate ponsol
      
    3. 安裝指定包

      根據專案安裝相應包,本網站所有需要的軟體包都放在了PonSol2_Web/environment.yml中。

      pip install -r /root/PonSol2_Web/environment.yml
      
  5. 測試網站是否能夠正常執行

    python /root/PonSol2_Web/manage.py runserver 0.0.0.0:80
    

    如果沒有報錯的話,一般就是正常運行了。在我們啟動容器的時候,已經將容器的埠對映到了外部的8090埠,所以可以在訪問系統的8090埠,就可以看到網站。

    注意:如果不能訪問,請檢查ip是否為裝有docker的linux的ip,是否開啟防火牆。

4. 安裝uwsgi

django可以直接使用runserver啟動網站,但是這適合在測試時使用,實際部署需要使用uwsgi進行部署。

  1. 進入專案的python環境,如果已經進入,跳過這一步

    conda activate ponsol
    
  2. 安裝 gcc

    uwsgi的安裝,需要使用gcc及進行編譯,所以先安裝gcc。

    yum -y install gcc gcc-c++ kernel-devel
    
  3. 安裝 uwsgi

    pip 安裝會報錯,所以這裡請使用 conda 安裝。

    conda install uwsgi
    

5. 使用uwgsi執行網站

  1. 將專案設定為非debug環境

    1. 修改專案setting檔案中DEBUG為True

      vi /root/PonSol2_Web/PonSol2_Web/settings.py
      
    2. 設定靜態檔案路徑

      這裡的STATIC_ROOT,如果沒有話,自己新增一個就可以了。因為在正式的部署環境中,靜態檔案是單獨管理的,之後也需要交給uwsgi單獨管理。

      • STATIC_ROOT = '/srv/django/ponsol2/static' 靜態檔案儲存在哪個路徑
      • STATIC_URL = '/PON-Sol2/static/' 網站靜態檔案的url字首
      vi /root/PonSol2_Web/PonSol2_Web/settings.py
      
    3. 遷移靜態檔案

      靜態檔案將會遷移到上述STATIC_ROOT路徑中去。

      python /root/PonSol2_Web/manage.py collectstatic
      
  2. 編寫uwgsi配置檔案

    為了方便執行網站,將uwsgi需要的引數全寫進配置檔案中,這個檔案我儲存在了/root/PonSol2_Web/uwsgi.ini,也就像專案根目錄下。

    vi /root/PonSol2_Web/uwsgi.ini
    

    內容如下:

    [uwsgi]
    http=:80
    chdir= /root/PonSol2_Web
    module=PonSol2_Web.wsgi
    static-map=/PON-Sol2/static=/srv/django/ponsol2/static
    vacuum=True
    master=True
    pidfile=/tmp/project-master.pid
    processes = 4
    threads = 20
    

    解釋:

    [uwsgi]
    # 網站啟動埠
    # 注意:埠與對映埠一致
    http=:80
    # 專案根路徑
    chdir= /root/PonSol2_Web 
    # 注意:這個是指專案根路徑下的PonSol2_Web目錄下的wsgi.py檔案
    # 也就是/root/PonSol2_Web/PonSol2_Web/wsgi.py
    module=PonSol2_Web.wsgi  
    # 這裡是指靜態檔案將會在網站的/PON-Sol2/static路徑
    # 靜態檔案所在的目錄為/srv/django/ponsol2/static,也就是在之前遷移的地方。
    # 注意:這裡是一個很關鍵的地方,靜態檔案是否能夠正常載入,就靠這裡了
    static-map=/PON-Sol2/static=/srv/django/ponsol2/static  
    # 以下內容預設就可
    vacuum=True
    master=True
    pidfile=/tmp/project-master.pid
    processes = 4  # 程序數
    threads = 20  # 執行緒數
    
  3. 使用uwgsi啟動網站

    uwsgi --ini /root/PonSol2_Web/uwsgi.ini
    

6. 設定網站開機自動啟動

在docker的容器中,使用系統服務,設定網站開機自動啟動,並且方便在後臺執行與管理。在之後分享給其他人後,別人只需要建立容器,便可以直接使用網站,而不需要進入容器中啟動,這樣對於其他人就很方便了。

  1. 編寫系統服務配置檔案

    需要編寫配置檔案來註冊系統服務,系統服務配置檔案在/usr/lib/systemd/system中,並根據網站的名稱建立service檔案。配置檔案中需要注意的只有ExecStart,將之修改為之前執行uwsgi的指令,但是這裡需要使用絕對路徑。具體如下所示:

    尋找uwgsi絕對路徑:

    conda activate ponsol  # 進入之前建立的python環境
    type uwsgi  # 使用type找到uwgsi的路徑,這裡為/root/miniconda3/envs/ponsol/bin/uwsgi
    # 測試啟動指令能夠正常執行,這個就是配置檔案的ExecStart
    /root/miniconda3/envs/ponsol/bin/uwsgi --ini /root/PonSol2_Web/uwsgi.ini 
    

    建立並編寫配置檔案:

    vi /usr/lib/systemd/system/ponsol.service
    

    檔案內容:

    [Unit]
    Description=ponsol2
    After=network.target
    
    [Service]
    TimeoutStartSec=30
    ExecStart=/root/miniconda3/envs/ponsol/bin/uwsgi --ini /root/PonSol2_Web/uwsgi.ini
    ExecStop=/bin/kill -9 $MAINPID
    
    [Install]
    WantedBy=multi-user.target
    
  2. 啟動服務

    在常見好配置檔案後,需要刷新系統服務,讓系統識別到我們新增的服務。同時,還需要設定服務為開機啟動,並啟動服務。啟動服務後,網站就部署完成了,會一直在後臺執行。

    systemctl daemon-reload  # 刷新系統服務
    systemctl enable ponsol.service  # 開機啟動
    systemctl start ponsol  # 啟動網站服務
    systemctl status ponsol  # 檢視網站狀態
    
  3. 管理網站(以下操作不是必須)

    網站設定為系統服務後,網站將執行在後臺且容易管理,如啟動、重啟、停止和檢視狀態。

    systemctl start ponsol  # 啟動
    systemctl status ponsol  # 檢視狀態
    systemctl stop ponsol  # 停止
    systemctl restart ponsol  # 重啟
    

7. 儲存容器為映象並上傳

在完成部署後,就可以將容器儲存為映象,儲存網站的初始狀態,並可以分享給其他人。

  1. 儲存為映象

    儲存映象的操作,與git的commit類似,將容器儲存當前狀態並建立映象。

    使用ctrl+D退出容器後,執行:

    • -m "init django project" 新增備註
    • -a "xdcat" 使用者名稱稱
    • ponsol2 容器的名稱
    • xdcat/sample_django_project建立映象的名稱,xdcat表示使用者名稱稱,sample_django_project表示具體映象名稱。注意:這裡的使用者名稱稱要與之前建立的使用者名稱稱一致
    docker commit -m "complete deploying website" -a "xdcat" sample_django_project xdcat/sample_django_project  # 建立映象。第一次需要等待比較長的時間。
    docker iamge ls  # 檢視所有映象
    
  2. 註冊dockerhub賬戶

    dockerhub將類似於github一樣,可以將自己的映象分享到dockerhub上,並可以分享給其他人。在使用dockerhub前,必須要註冊一個賬戶:https://hub.docker.com/

  3. 登陸dockerhub賬戶

    docker login
    
  4. push映象

    使用push將映象推送至dockerhub遠端倉庫。

    • xdcat/sanmpe_django_project 其中 xdcat 表示使用者名稱,sanmpe_django_project是映象名稱,將映象推送到登陸的賬戶的倉庫中
    docker push xdcat/sample_django_project
    

8. 將網站分享給其他人

dockerhub的使用者名稱是唯一的,只需要通用使用者名稱/映象名,其他人就可以使用映象。下面的例子,我已經換了另一臺電腦用於展示。

  1. 使用pull拉取映象

docker pull xdcat/sanmpe_django_project


![image-20210702192134136](https://xdcat-tuchuang.oss-cn-beijing.aliyuncs.com/imgimage-20210702192134136.png)

2. 檢視映象

```sh
docker image ls
  1. 建立並啟動容器

    在啟動容器後,就可以直接在8090埠訪問網站。

    docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 建立並啟動容器
    

部署後管理

  1. 儲存專案

    在我們設定開機啟動前,我們不妨儲存一下容器的狀態,將容器儲存為一個映象。使用Ctrl+D退出容器,再使用以下指令建立映象,這個指令很想git的commit。

    • -m "init django project" 新增備註
    • -a "xdcat" 使用者名稱稱,這裡的使用者是指docker網站上的使用者,可以去註冊一個
    • ponsol2 容器的名稱
    • xdcat/sanmpe_django_project 建立映象的名稱,xdcat表示使用者名稱稱,sanmpe_django_project表示具體映象名稱
    docker commit -m "init django project" -a "xdcat" sample_django_project xdcat/sanmpe_django_project
    

    在指令結束後,可以使用docker image ls檢視所有的映象。這裡第一個就是我們的映象,雖然有3G,但是相比於一個完整的centos已經很小了。

  2. 刪除並重新執行容器

    在之前我們啟動的容器的方式,無法使用systemctl管理系統服務的指令,需要重新啟動一下,我們需要刪除容器,並從我們自己的映象中重新啟動一下。

    docker stop sample_django_project  # 停止容器
    docker rm sample_django_project  # 刪除容器
    docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init  # 建立並啟動容器
    docker exec -it sample_django_project /bin/bash  # 進入容器
    

常用指令