docker部署django網站
docker部署django網站
以下均在centos7下進行。
1. 安裝docker
相關指令
- 啟動docker服務 systemctl start docker
在安裝前,需要確認是否已經安裝docker,直接執行docker
指令。如果已經安裝,則直接跳到下一步。
-
沒有安裝
-
已經安裝
安裝並啟動docker
-
安裝方法,執行下列語句(
curl -sSL https://get.daocloud.io/docker | sh
-
安裝後,啟動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映象,然後再上面安裝需要的軟體。
-
註冊dockerhub賬號
dockerhub類似於github,是docker的遠端倉庫,在https://hub.docker.com/註冊一個賬號,並記住賬戶名,之後會使用到。這裡我的賬戶名是
xdcat
,之後也會被多次用到。 -
下載centos映象,這裡的centos是一個官方映象的名稱。
docker pull centos
-
檢視是否下載完成
-
-
建立並啟動容器
- --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
-
進入容器,這裡直接使用剛剛建立的別名進入。
docker exec -it sample_django_project /bin/bash
在進入容器後,我們可以發現前面的識別符號不一樣了。
3. 在容器中準備網站環境
容器就相當於一個linux系統,直接在容器中安裝對應的軟體並執行網站。這裡我們以PON-Sol2的網站為例,使用uwsgi部署網站。
-
進入家目錄
cd
-
下載程式碼
程式碼我放在的github上,預設是沒有git的,所以需要先安裝git後,再下載程式碼。
-
安裝 git
yum install -y git
-
clone 程式碼
git clone https://github.com/XDcat/PonSol2_Web
-
-
安裝python
專案中對於python版本和各個軟體版本有明確要求,這裡使用miniconda(簡化版的anacodna),使用conda管理不同版本的python。這裡並不一定要要conda,直接安裝python然後安裝對應包就可以,看個人習慣。
-
安裝wget,用於下載其他內容
yum -y install wget
-
從官網下載miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
-
安裝miniconda
bash Miniconda3-latest-Linux-x86_64.sh
安裝流程:
-
回車:開始安裝
-
按住空格:跳過條款
-
yes:接受條款
-
回車:預設安裝路徑
-
yes:是否初始化conda
-
-
安裝miniconda後,需要重新進入系統這樣才能啟動conda環境
-
ctrl + D 退出系統
-
進入容器
docker exec -it sample_django_project /bin/bash
此時命令列最前面將會出現
base
字樣,表示初始化了conda -
進入家目錄
cd
-
修改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
-
-
-
建立網站執行環境
-
建立python環境
注意:這裡的python版本是根據網站來的。
- ponsol 環境名稱,再之後會多次使用到
- python=3.7.7 指定python版本
conda create -n ponsol python=3.7.7
-
啟用ponsol環境
conda activate ponsol
-
安裝指定包
根據專案安裝相應包,本網站所有需要的軟體包都放在了
PonSol2_Web/environment.yml
中。pip install -r /root/PonSol2_Web/environment.yml
-
-
測試網站是否能夠正常執行
python /root/PonSol2_Web/manage.py runserver 0.0.0.0:80
如果沒有報錯的話,一般就是正常運行了。在我們啟動容器的時候,已經將容器的埠對映到了外部的8090埠,所以可以在訪問系統的8090埠,就可以看到網站。
注意:如果不能訪問,請檢查ip是否為裝有docker的linux的ip,是否開啟防火牆。
4. 安裝uwsgi
django可以直接使用runserver啟動網站,但是這適合在測試時使用,實際部署需要使用uwsgi進行部署。
-
進入專案的python環境,如果已經進入,跳過這一步
conda activate ponsol
-
安裝 gcc
uwsgi的安裝,需要使用gcc及進行編譯,所以先安裝gcc。
yum -y install gcc gcc-c++ kernel-devel
-
安裝 uwsgi
pip 安裝會報錯,所以這裡請使用 conda 安裝。
conda install uwsgi
5. 使用uwgsi執行網站
-
將專案設定為非debug環境
-
修改專案setting檔案中DEBUG為True
vi /root/PonSol2_Web/PonSol2_Web/settings.py
-
設定靜態檔案路徑
這裡的STATIC_ROOT,如果沒有話,自己新增一個就可以了。因為在正式的部署環境中,靜態檔案是單獨管理的,之後也需要交給uwsgi單獨管理。
- STATIC_ROOT = '/srv/django/ponsol2/static' 靜態檔案儲存在哪個路徑
- STATIC_URL = '/PON-Sol2/static/' 網站靜態檔案的url字首
vi /root/PonSol2_Web/PonSol2_Web/settings.py
-
遷移靜態檔案
靜態檔案將會遷移到上述STATIC_ROOT路徑中去。
python /root/PonSol2_Web/manage.py collectstatic
-
-
編寫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 # 執行緒數
-
使用uwgsi啟動網站
uwsgi --ini /root/PonSol2_Web/uwsgi.ini
6. 設定網站開機自動啟動
在docker的容器中,使用系統服務,設定網站開機自動啟動,並且方便在後臺執行與管理。在之後分享給其他人後,別人只需要建立容器,便可以直接使用網站,而不需要進入容器中啟動,這樣對於其他人就很方便了。
-
編寫系統服務配置檔案
需要編寫配置檔案來註冊系統服務,系統服務配置檔案在
/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
-
啟動服務
在常見好配置檔案後,需要刷新系統服務,讓系統識別到我們新增的服務。同時,還需要設定服務為開機啟動,並啟動服務。啟動服務後,網站就部署完成了,會一直在後臺執行。
systemctl daemon-reload # 刷新系統服務 systemctl enable ponsol.service # 開機啟動 systemctl start ponsol # 啟動網站服務 systemctl status ponsol # 檢視網站狀態
-
管理網站(以下操作不是必須)
網站設定為系統服務後,網站將執行在後臺且容易管理,如啟動、重啟、停止和檢視狀態。
systemctl start ponsol # 啟動 systemctl status ponsol # 檢視狀態 systemctl stop ponsol # 停止 systemctl restart ponsol # 重啟
7. 儲存容器為映象並上傳
在完成部署後,就可以將容器儲存為映象,儲存網站的初始狀態,並可以分享給其他人。
-
儲存為映象
儲存映象的操作,與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 # 檢視所有映象
-
註冊dockerhub賬戶
dockerhub將類似於github一樣,可以將自己的映象分享到dockerhub上,並可以分享給其他人。在使用dockerhub前,必須要註冊一個賬戶:https://hub.docker.com/
-
登陸dockerhub賬戶
docker login
-
push映象
使用push將映象推送至dockerhub遠端倉庫。
- xdcat/sanmpe_django_project 其中 xdcat 表示使用者名稱,sanmpe_django_project是映象名稱,將映象推送到登陸的賬戶的倉庫中
docker push xdcat/sample_django_project
8. 將網站分享給其他人
dockerhub的使用者名稱是唯一的,只需要通用使用者名稱/映象名
,其他人就可以使用映象。下面的例子,我已經換了另一臺電腦用於展示。
-
使用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
-
建立並啟動容器
在啟動容器後,就可以直接在8090埠訪問網站。
docker run -tid -p8090:8000 --name sample_django_project --privileged=true xdcat/sanmpe_django_project /usr/sbin/init # 建立並啟動容器
部署後管理
-
儲存專案
在我們設定開機啟動前,我們不妨儲存一下容器的狀態,將容器儲存為一個映象。使用
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已經很小了。 -
刪除並重新執行容器
在之前我們啟動的容器的方式,無法使用
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 # 進入容器