軟件開發最大的麻煩事之一就是環境配置,操做系統設置,各類庫和組件的安裝。只有它們都正確,軟件才能運行。若是從一種操做系統裏面運行另外一種操做系統,一般咱們採起的策略就是引入虛擬機,好比在 Windows 系統裏面運行 Linux 系統。這種方式有個很大的缺點就是資源佔用多、冗餘步驟多、啓動慢。目前最流行的 Linux 容器解決方案之一就是Docker,它最大優勢就是輕量、資源佔用少、啓動快。本文從什麼是Docker?Docker解決什麼問題?有哪些好處?如何去部署實現去全面介紹。html
設想這樣一個真實案例,假如咱們要部署一個Python應用程序,要作哪些工做?首先須要python運行環境,好比部署的是python3,而機器上是python2。先裝個python3,還要裝各類依賴包,機器一些可能的衝突。裝完python以後,發現還要裝mysql或者redis。繼續下載安裝配置。啥?服務器不用了,須要換一臺服務器?那從新來一遍吧。啥?基礎應用作的太好要進行推廣,須要指導其餘廠商部署?這怎麼辦?能夠看出,在 Docker 以前軟件行業的運維存在着如下這些痛點:python
# 1. 軟件的發佈和部署低效又繁瑣,並且老是須要人工介入 # 2. 環境的一致性難移保證 # 3. 在不一樣環境之間遷移的成本較高
在完成Docker部署安裝以前,咱們仍是先認識下Docker的優勢:
mysql
# 1. 軟件構建容易,分發簡單 # 2. 應用獲得隔離,依賴被解除 # 3. 能夠完美地用於 CI/CD # 4. 快速部署,測試完之後銷燬也方便
# 準備數據目錄 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運行項目
nginx
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.117/