Docker 部署 Flask 應用實踐

  1. 打開docker
    在這裏插入圖片描述
  2. 在項目目錄下編寫 DockerFile 文件,以下是我項目中DockerFile文件,並對每一行進行解讀
FROM python:3.6  # 項目的基礎鏡像爲 python3.6
EXPOSE 8080  # docker的指定出口端口爲8080

RUN mkdir /project_name  # 創建項目的目錄
COPY . /project_name/   # 將項目代碼全部複製過去
RUN mkdir /log  # 創建項目的日誌文件夾
RUN mkdir /deployments   # 創建部署項目的腳本目錄
COPY run.sh /deployments   # 將部署腳本複製到項目部署目錄下

WORKDIR /project_name  # 指定項目目錄爲工作目錄
RUN pip3 install --upgrade pip  # 升級pip包
RUN pip3 install -r requirements.txt -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn  # 安裝項目python環境所需要的包,這裏指定了清華的鏡像源,安裝速度會快一些

ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["bash", "./run.sh"]  # 部署項目的命令
  1. 編寫部署腳本 run.sh , 舉例如下:
    我這裏將服務名和每個服務的啓動命令放到了列表中,去遍歷
#!/bin/bash
#refer:https://docs.docker.com/config/containers/multi-service_container/

export PYTHONPATH=/project_name

# 所有服務的名字
server_names=(
'server:start_app'
'celery'
)


# 啓動這些服務的bash命令,和server_names一一對應
start_commands=(
`nohup gunicorn 'server:start_app()' -c gunicorn.conf > /log/service.log 2>&1 &`
`nohup celery -A tasks.async_app worker --concurrency=3 -l INFO > /log/async_task.log 2>&1 &`
)

# 每個服務的日誌的路徑,和server_names一一對應
log_filenames=(
'/log/service.log'
'/log/async_task.log'
)

# 遍歷所有服務,逐個啓動
len=${#server_names[@]}
for ((i=0;i<$len;i++))
    do
        ${start_commands[$i]}
        PROCESS_STATUS=$?
        if [ $PROCESS_STATUS -ne 0 ]; then
            echo "Failed to start ${server_names[$i]}, please see error log"
             echo `cat ${log_filenames[$i]} | tail -n 150`
            exit PROCESS_STATUS
        fi
    done



# 每30s遍歷所有服務,檢測服務運行狀態
while sleep 30; do
    for ((i=0;i<$len;i++))
        do
            ps aux |grep ${server_names[$i]} |grep -q -v grep
            PROCESS_STATUS=$?
            if [ $PROCESS_STATUS -ne 0 ]; then
                echo "ops~~ : ${server_names[$i]} has already exited, please see error log"
                echo `cat ${log_filenames[$i]} | tail -n 150`
                exit 1
            fi
        done
done

  1. 編寫gunicorn.conf 文件,可以指定gunicorn啓動服務的配置,舉例
workers = 2
bind = "0.0.0.0:8080"
worker_class = "gevent"
timeout = 90
max_requests = 3000
threads = 8
  1. 本地測試
# 創建鏡像,進入本地項目目錄,指定Dockerfile所在路徑
docker build -t project_name ~/PycharmProjects/project_name  

# 啓動容器
docker run -it -p 8888:8080 project_name bash run.sh
  1. 若本地啓動一切正常,編寫.gitlab-ci.yml文件,推送到gitlib上,走CI/CD 流程,可以看到最新的pipeline已打包完成
    在這裏插入圖片描述
    在這裏插入圖片描述

  2. 將容器註冊到gitlib上,方便以後直接拉取
    在這裏插入圖片描述

  3. 一些常用的 docker 命令

查看docker信息: docker info

查看鏡像列表:docker images 

停用鏡像:docker stop ImageID

重啓鏡像: docker start imageID

重命名鏡像: docker tag imageID imageREPOSITORY:imageTAG

刪除鏡像:docker rmi imageID


查看容器:docker ps
	     docker ps -a 查看所有容器,包括啓動失敗的

重命名容器:dokcer rename 容器ID mytomcat7:jre7

停止容器:docker stop 容器Name

刪除所有未啓動容器:docker container prune

刪除容器: docker rm ID


從 Docker Hub 網站來搜索鏡像,Docker Hub 網址爲: https://hub.docker.com/
使用 docker search 命令來搜索鏡像。如搜索httpd的鏡像。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章