編寫完項目代碼后,為了穩定的運行,需要將其部署至服務器。這里我選擇了Docker去部署Django后端代碼。
首先來看看Runoob對Docker的介紹:
Docker 是一個開源的應用容器引擎,基於Go語言並遵從 Apache2.0 協議開源。
Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
我自己的理解,Docker能夠大大降低開發人員移植環境時的復雜度,易於自動化部署,也易於不同環境之間相互隔離。
安裝Docker
Docker必須部署在 Linux 內核的系統上,如果其他系統想部署 Docker 就必須安裝一個虛擬 Linux 環境。所以Windows或者Mac用戶的官方安裝方式是安裝Docker Desktop客戶端,實質上還是在虛擬機中安裝Docker。
制作Docker鏡像
有以下兩種方式制作鏡像:
1.從已經創建的容器中更新鏡像,並且提交這個鏡像。下次想要復用時,則是從鏡像倉庫拉取該鏡像。
2.使用 Dockerfile 文件來創建一個新的鏡像,下次想要復用時,只需要使用docker build指令再次調用Dockerfile創建鏡像即可。
這里推薦第2種方式來制作鏡像,因為Dockerfile文件能夠清晰地記錄制作鏡像的具體步驟,方便作者去回顧以及保持鏡像簡潔。
以下是我制作鏡像時的Dockerfile文件:
FROM ubuntu:16.04 ENV LANG C.UTF-8 ENV TZ=Asia/Shanghai RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && \ apt-get clean && \ ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && \ apt-get update && \ apt-get upgrade -y && \ apt-get install -y \ software-properties-common &&\ add-apt-repository ppa:deadsnakes/ppa &&\ apt-get update && \ apt-get install -y \ python3.7 && \ update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 && \ apt-get install -y \ libpython3.7-dev \ python3-setuptools \ python3-pip \ git \ tzdata && \ dpkg-reconfigure --frontend noninteractive tzdata WORKDIR /opt/workspace/TestPlatformBackend/ COPY . . RUN pip3 install -r ./requirements.txt -i \ https://pypi.tuna.tsinghua.edu.cn/simple \ --default-timeout=100 EXPOSE 5000 CMD bash ./start.sh
該Dockerfile基於ubuntu16.04系統,先安裝了python基礎環境,指定工作空間及拷貝項目代碼,然后安裝項目所需的python庫,最后運行指定的shell腳本。
shell腳本也較為簡單,用uWSGI啟動了Django項目,如果有不懂uWSGI的朋友,可以參看這篇文章《如何用uWSGI托管Django》進行了解。
#!/usr/bin/env bash uwsgi --ini ./uwsgi.ini
值得一提的是,網上教程一般會采用uWSGI+Nginx去部署Django項目,而我這里只采用了uWSGI,原因是該測試平台是給內部人員使用且並發量不大,所以沒有用到Nginx,等需要時再加上。
使用Docker鏡像
在完成Dockerfile后,使用docker build指令創建Docker鏡像,例子中創建了名為testplatformbackend的鏡像。
docker build -t testplatformbackend .
創建完成后,使用該鏡像生成並運行容器,例子中運行了名為testplatformbackend的鏡像,並將容器的5000端口映射到了宿主機的9999端口上供訪問。
docker run -d -p 9999:5000 testplatformbackend
上述步驟,便實現了通過Docker來部署Django項目。
文章的最后聊個題外話,如果我們的項目代碼是在Windows系統上完成編寫,需要部署到Linux系統上時,請注意兩個系統對於文件路徑的兼容性問題。Windows系統是可以用符號'\'和'/'來表示路徑的,而Linux系統只能用后者來表示路徑。所以我們在寫路徑時,盡量用符號'/'。而拼接路徑時則盡量用os.path.join()函數去實現,因為它生成的路徑能兼容不同系統。如果遇到不得不轉換的路徑,則可以在使用路徑時采用str.replace('\\', '/')完成轉換。
參考資料
- https://www.docker.com/
- https://www.runoob.com/docker/docker-tutorial.html