flask后台部署套路(一)


Docker 服務的安裝配置

若服務器中已經有 docker 容器了請忽略此處配置講解(通過簡單 docker 命令能否被識別),服務器中 docker 若不存再請看如下:

  • 我們決定采用 yum 安裝,先更新配置 yum 源頭(此處非必須,看情況!)

    一般研發在服務器中若安裝好了 docker,一般此步操作不需要執行。

    用 yum 安裝 docker 可以,或者 wget 安裝 docker 后再解壓也行

    下面操作主要是更新 yum 為了安裝新版的 docker,而不是很老舊版本的 docker,然后對 yum 庫的配置

    # yum 更新,過程中一切都是 [yes],這一步極其慢
    yum -y update
    
    # yum 安裝幾個必要的包,其中含有設 yum 庫的命令
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    # 設置阿里倉庫 yum
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
  • yum 安裝 docker-ce,因為老舊版本的才叫 docker 或 docker-engine

    # 查看有哪些 docker-ce
    yum list docker-ce --showduplicates | sort -r
    
    # 我選擇了 18 年末的一個版本的 docker 安裝
    yum install docker-ce-18.03.1.ce
    
    # 啟動 docker 服務
    systemctl start docker
    
    # 將其加入開機啟動
    systemctl enable docker
    
    # 想看 docker 服務是不是真起來了,通過 ps 命令,要是有列名即使沒有容器也不要緊,說明已經起來了
    docker ps
    
  • docker 拉取鏡像替換稱國內鏡像源,使下載鏡像速度提升

    # 添加鏡像源地址
    vi /etc/docker/daemon.json
    

    json 內容如下

    {
      "registry-mirrors" : [
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com"
      ],
      "insecure-registries" : [
        "registry.docker-cn.com",
        "docker.mirrors.ustc.edu.cn"
      ],
      "debug" : true,
      "experimental" : true
    }
    
  • 重啟 docker 服務

    # 進程
    systemctl daemon-reload
    
    # docker 服務重啟
    systemctl restart docker
    
  • docker弄好了之后需要拉取鏡像

docker pull python:alpine3.7

等到鏡像拉取完成之后可以使用docker images來查看

ps: 以下為實驗部分為了弄清原理,簡單的用了一個臨時的容器

docker run -it --rm python:alpine3.7 sh

使用了以上的命令之后,進入到了容器中。

先設置好PIP國內的鏡像源

mkdir $HOME/.pip/
# 利用tee命令把下面的配置寫入daemon.json
tee $HOME/.pip/pip.conf<<-'EOF'
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
EOF

然后是設置好alpine的源,這里的意思等同是在linux服務器里面,使用yum指令拉取東西的時候會很慢,所以會對yum的鏡像源做一個配置,同理也需要對alpine容器內的包管理器做一個鏡像源的設置,alpine容器內部的包管理器是使用的apk,以下對apk鏡像源設置做一個講解

注意 : 以下的指令都是作用在容器內的

  1. 查看容器內部本身的鏡像源
cat /etc/apk/repositories
  1. 設置阿里雲的鏡像源
echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories

3.同上文的設置yum的鏡像源一樣,改好配置之后需要重新啟動

apk update && apk upgrade
  1. 在容器內安裝pythonFlask的鏡像庫
python -m pip install -U flask

執行完之后這個時候可以來試一試使用flask run來執行一下,這個時候會報一個FLASK_APP未設置的錯,這個值是一個環境變量,需要我們提前設置好之后才能用flask run的指令來運行

以下是實驗部分
5. 在容器內創建一個test.py文件,並且寫入

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "hello world"

@app.route("/abc")
def abc():
    return "hello world"

if __name__ == "__main__":
    app.run()

創建完了之后如果我們直接使用python test.py就直接啟動了這個
6. Xshell另外開一個窗口,進入到這個實驗容器

docker ps
docker exec -it 容器id sh
  1. 用管道命令查詢
ps -ef | grep python

注意 因為你上文是采用python加執行文件的形式啟動的項目,所以這里就篩選python就可以了。
查詢完之后可以看到有一個進程以python的形式運行。
8. 使用curl指令來測試接口

curl: localhost:5000

可能curl工具沒有使用apk add curl命令來安裝。
8. 再說說如何用flask run的指令來運行

export FLASK_APP=/test.py

然后就可以直接運行了。
可以重復執行6-7步實驗

  • 以上部分就是實驗完了這個容器,這時候我們做一個鏡像,擁有這個容器內的全部功能,需要提前寫好配置文件,直接就能生成這個鏡像。
  1. ~目錄下生成一個名字為flask的空文件夾
  2. 寫一個pip的配置文件 pip.conf內容為
[global]
trusted-host=mirrors.aliyun.com
index-url=https://mirrors.aliyun.com/pypi/simple
  1. 創建一個Dockerfile文件,內容為
FROM python:alpine3.7
RUN echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \
echo http://mirrors.ustc.edu.cn/alpine/v3.7/community >> /etc/apk/repositories
RUN apk update && apk upgrade
RUN mkdir /app
RUN mkdir $HOME/.pip/
COPY ./pip.conf $HOME/.pip/
RUN pip install flask
EXPOSE 5000
CMD ["flask","run"]

簡單的介紹以下上文的作用
以python:alpine3.7為基礎,疊加下面的配置,2-3行,配置鏡像源,4行重啟加載鏡像源,5行在進行內部創建app文件夾,6行 在用戶目錄下創建一個.pip文件夾,7行copy 當前linux機器下的pip.conf文件到用戶目錄下的.pip文件夾里面去,8行在鏡像內部使用pip指令安裝flask,9行 暴露容器內部的5000端口方便后續的端口映射,10行 代表啟動這個容器之后,不加任何命令他會主動去運行flask run這條命令
4. 以上的配置文件寫好之后,運行以下指令開始構建鏡像。

docker build -t myflask:1.0 .

最后這個.代表他會去當前目錄下的Dockerfile去編譯
5. 到這一步就構建出來了一個和上文實驗部分功能一樣的鏡像了,唯一的差別在於,此時的鏡像中是沒有test.py的文件的,這是后生成容器的時候把linux宿主機上的文件映射過去。

  • 上文構建了一個基礎的鏡像,這個時候就需要做的是生成容器
  1. ~目錄下創建一個myapp的文件夾
  2. 進入到文件夾內部,創建一個test.py的文件,內容如下
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "hello world"

@app.route("/abc")
def abc():
    return "hello world"

if __name__ == "__main__":
    app.run()
  1. 開始運行,指令如下
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0

對這個指令做一個解釋,--nam myapp 這里是給容器取了這么一個名字, -d 容器在后台運行, -p 8080:5000 這里是端口映射,把linux機器上的8080端口映射到容器內的5000端口上,-v 路徑映射,把linux下的/root/myapp路徑,這個路徑就是創建test.py的路徑,映射到容器的/app下,-e FLASK_APP=/app/test.py,設置環境變量,最后是鏡像的名稱加tag
這里可以用docker logs myapp來查看日志
4. linux機器內部訪問,curl localhost:8080 發現訪問不了,是因為test.py沒有設置端口
5. 把原來的容器停止並且刪除

docker stop myapp && docker rm myapp
  1. 重新啟動
docker run --name myapp -d -p 8080:5000 -v /root/myapp:/app -e FLASK_APP=/app/test.py myflask:1.0 flask run -h 0.0.0.0

注意這里容器內部還是使用的flask run的方法來運行的,但是如果在啟動命令后加了flask run -h 0.0.0.0會替代上文的Dockerfile里面配置文件最后那句CMD ["flask","run"]
8. 這樣啟動之后直接就可以在linux宿主機內使用

curl localhost:8080

來進行訪問了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM