Docker部署Python專案
阿新 • • 發佈:2020-06-25
#### 簡介
> 軟體開發最大的麻煩事之一就是環境配置,作業系統設定,各種庫和元件的安裝。只有它們都正確,軟體才能執行。如果從一種作業系統裡面執行另一種作業系統,通常我們採取的策略就是引入虛擬機器,比如在 Windows 系統裡面執行 Linux 系統。這種方式有個很大的缺點就是資源佔用多、冗餘步驟多、啟動慢。目前最流行的 Linux 容器解決方案之一就是Docker,它最大優點就是輕量、資源佔用少、啟動快。本文從什麼是Docker?Docker解決什麼問題?有哪些好處?如何去部署實現去全面介紹。
##### docker部署專案優勢
> 設想這樣一個真實案例,假如我們要部署一個Python應用程式,要做哪些工作?首先需要python執行環境,比如部署的是python3,而機器上是python2。先裝個python3,還要裝各種依賴包,機器一些可能的衝突。裝完python之後,發現還要裝mysql或者redis。繼續下載安裝配置。啥?伺服器不用了,需要換一臺伺服器?那重新來一遍吧。啥?基礎應用做的太好要進行推廣,需要指導其他廠商部署?這怎麼辦?可以看出,在 Docker 之前軟體行業的運維存在著以下這些痛點:
```python
# 1. 軟體的釋出和部署低效又繁瑣,而且總是需要人工介入
# 2. 環境的一致性難移保證
# 3. 在不同環境之間遷移的成本較高
```
`在完成Docker部署安裝之前,我們還是先認識下Docker的優點:`
```python
# 1. 軟體構建容易,分發簡單
# 2. 應用得到隔離,依賴被解除
# 3. 可以完美地用於 CI/CD
# 4. 快速部署,測試完以後銷燬也方便
```
#### 方式一: 基於Python基礎映象
```python
# 準備資料目錄
mkdir myproject
cd myproject
docker run -di --name=myproject -p 8080:8080 -v /home/myproject:/home python:3.6
# 將你的專案上傳到伺服器掛載的儲存捲上
scp django.tar.gz 149.129.38.117:
cp /root/django.tar.gz /home/myproject/
tar xvf django.tar.gz
# 進入容器安裝相關依賴
pip install -r requirement.txt
apt-get update
apt-get install vi
# setting.py 改成下面
ALLOWED_HOSTS = ['*']
# 執行專案(wsgiref)
python manage.py runserver 0.0.0.0:8080
```
`uwsgi執行專案`
```python
pip3 install uwsgi
# 在專案根路徑下建立一個uwsgi.ini 檔案,寫入
[uwsgi]
#配置和nginx連線的socket連線
socket=0.0.0.0:8080
#也可以使用http
#http=0.0.0.0:8080
#配置專案路徑,專案的所在目錄
chdir=/home/django_test
#配置wsgi介面模組檔案路徑
wsgi-file=django_test/wsgi.py
#配置啟動的程序數
processes=4
#配置每個程序的執行緒數
threads=2
#配置啟動管理主程序
master=True
#配置存放主程序的程序號檔案
pidfile=uwsgi.pid
#配置dump日誌記錄
daemonize=uwsgi.log
#啟動,停止,重啟,檢視
uwsgi --ini uwsgi.ini #啟動
lsof -i :8001 #按照埠號查詢
ps aux | grep uwsgi #按照程式名查詢
kill -9 13844 #殺死程序
uwsgi --stop uwsgi.pid #通過uwsg停止uwsgi
uwsgi --reload uwsgi.pid #重啟
# nginx轉發
mkdir -p nginx/conf nginx/html nginx/logs
# 在conf目錄下新建nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
#uwsgi_pass 149.129.38.117:8080;
proxy_pass http://149.129.38.117:8080;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx
# 在 python的docker中用uwsgi跑起專案來即可
# 外部訪問:http://149.129.38.1