原文轉載自「劉悅的技術博客」v3u.cn/a_id_165html
上一篇文章:Docker在手,天下我有,在Win10系統下利用Docker部署Gunicorn+Flask打造獨立鏡像,是在Win10簡單玩了一下Docker的鏡像打包,屬實玩票,娛樂屬性較高。要是想真刀真槍的在生產環境部署還得是Centos。linux
本次使用Nginx反向代理Flask服務,爲何要加一層Nginx呢?由於Nginx能夠直接處理靜態文件請求而不用通過應用服務器,避免佔用寶貴的運算資源,而且能夠緩存靜態資源,使訪問靜態資源的速度有效提升。同時它能夠吸取一些瞬時的高併發請求,讓Nginx先保持住鏈接(緩存http請求),而後後端慢慢消化掉這些併發。固然了,最重要的一點就是Nginx能夠提供負載均衡策略,這樣咱們的應用服務就能夠橫向擴展,分擔壓力了。nginx
大致架構以下:git
首先出場的是貴爲Docker三大核心之一的DockerHub(倉庫),咱們能夠將打包好的鏡像免費push到上面,就這樣就能夠隨時pull本身的鏡像,註冊地址:hub.docker.com/github
激活帳號之後,建立倉庫,這一步和github建立代碼倉庫差不太多。docker
填寫倉庫信息具體爲倉庫名稱、描述以及是否公開或者私有。shell
建立成功以後,它就會出如今鏡像列表中flask
此時咱們須要對本地的鏡像重命名,這裏重命名爲zcxey2911/myflask。由於要與dockerhub上的倉庫對應。若是名稱不對應是沒法將本地鏡像push到線上倉庫中。vim
docker tag myflask zcxey2911/myflask
複製代碼
以後在命令行輸入命令後端
docker login
複製代碼
用DockerHub的帳號和密碼登陸
登陸成功以後,用命令把本地鏡像push到hub中
docker push zcxey2911/myflask
複製代碼
注意這裏的鏡像名稱必須和hub中的倉庫名稱一致,不然將會拋出錯誤。
上傳成功後,就能夠在DockerHub中看到它了,此時就能隨意pull操做了
前置操做已經完畢,此時,登陸你的雲服務器,這裏以百度雲的Centos7.7爲例子,進入服務器後安裝Docker服務
#升級yum
sudo yum update
#卸載舊版本docker
sudo yum remove docker docker-common docker-selinux docker-engine
#安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#設置源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
#安裝docker
sudo yum install docker-ce
#啓動服務
sudo systemctl start docker
複製代碼
安裝完成後鍵入 docker -v
返回Docker版本號說明沒有問題。
拉取咱們以前打包而且上傳到hub的Flask鏡像
docker pull zcxey2911/myflask
複製代碼
下載成功後,會展現在鏡像庫裏
運行項目,這裏咱們能夠採用後臺守護進程的模式起服務
sudo docker run -d -p 5000:5000 --name testflask zcxey2911/myflask
複製代碼
使用docker ps命令能夠看到是否運行成功。
使用服務器的ip訪問一下Flask服務,這裏有個小坑,不管是騰訊雲、阿里雲仍是百度雲亦或是各類亂七八糟的雲,都須要在安全組策略中開放你須要訪問的端口,好比這裏我用的5000。
好了,如今咱們一樣利用Docker來安裝Nginx服務
docker pull nginx
複製代碼
隨後啓動Nginx測試一下
docker run -d -p 80:80 nginx
複製代碼
如今,咱們將運行Nginx容器裏的配置文件copy到宿主機裏面
前面是容器的路徑 後面是宿主機的路徑
docker cp 容器id:/etc/nginx/conf.d/default.conf /root/default.conf
複製代碼
容器id能夠經過docker ps命令查看
複製出來以後,輸入命令修改這個nginx配置
vim /root/default.conf
複製代碼
將Gunicorn配置加到裏面
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://你的服務器公網ip:5000; # 這裏是指向 gunicorn host 的服務地址
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
複製代碼
修改完配置文件以後,關掉運行的nginx服務容器,而且刪掉它
docker stop 容器id
docker rm $(docker ps -a -q)
複製代碼
隨後再次啓動Nginx容器,不過此次和上次不一樣之處就是須要用到 -v 進行掛載了,掛載簡單理解就是將宿主機的文件替換Docker容器內部的文件,達到修改的效果。
docker run --name mynginx -d -p 80:80 -v /root/default.conf:/etc/nginx/conf.d/default.conf nginx
複製代碼
這裏-v參數也遵循冒號左側爲宿主機右側爲容器的原則。
從新啓動成功後,訪問服務器ip
發現已經部署成功,整個流程輕鬆加愉快,比原始的命令行shell安裝不知快了多少倍,最後奉上Dockerhub地址:hub.docker.com/r/zcxey2911… 和 Flask工程地址:gitee.com/QiHanXiBei/…
原文轉載自「劉悅的技術博客」 v3u.cn/a_id_165