部署Python應用到Docker

序言:

需要運行的Python項目的結構:

只要直接運行run_app.py文件即可啓動應用;

web就是Python項目的web(整個源碼所在目錄)直接複製過來的,部署到docker裏面,在容器中啓動:

一個web文件夾:包含工程的代碼,和運行工程所需的環境列表requirements.txt

一個docker鏡像構建的Dockerfile

 

一、確保Docker應用的安裝

可以參考菜鳥教程

 

二、生成環境列表requirements.txt
cmd命令,進入 /web 目錄,也就是工程目錄,package的同級目錄,

執行命令:pip freeze > requirements.txt

就在該目錄下生成了一個requirements.txt文件,可能很大,因爲沒有配合virtualenv ,就把整個環境中的包都列出來,我們可以刪除我們此工程中,不需要的組件

 

三、編寫Dockerfile

Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。有了 Dockerfile,就可以創建我們所需要的鏡像,當啓動容器時候,執行run_app.py程序。

#基於的基礎鏡像
FROM openjdk:8-jre-slim
FROM python:3.7

MAINTAINER  Fisher "[email protected]"

ENV PARAMS=""
ENV TZ=PRC

#代碼添加到code_web_app文件夾
ADD /web /python_job_web/web

# add 自定義JDK8
ADD jdk-8u221-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_221
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

# 設置code文件夾是工作目錄
WORKDIR /python_job_web

RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 安裝支持
RUN pip install -r requirements.txt

CMD ["python", "/python_job_web/web/run_app.py"]

四、構建Docker鏡像

將Dockerfile 和 web 放在一個文件夾,使用下面命令生成鏡像,注意最後的符號  . ,表示相對路徑下作業

docker build -t web_python_demo_v0.0.1 .

web_python_demo_v0.0.1是生成的鏡像名稱,更多docker build命令可以查看菜鳥教程

 

五、運行鏡像


docker images

# 可以看到web_python_demo_v0.0.1的鏡像,已經存在了


docker run -it -p ${hostPort}:${containerPort} --name ${containerName} -v ${host_file_path}:${container_file_path}:rw  web_python_demo_v0.0.1 /bin/bash
# 運行鏡像,生成並啓動容器

六、退出容器

# 退出容器又不關閉容器

Ctrl + P + Q

# 會報錯KeyboardInterrupt,工程就也stop

Ctrl + C

#重新啓動容器
 
docker start ${container_name}

 

現在訪問系統,只要將IP替換成虛擬機的IP:

 

七、進入運行中的容器

# 重新進入容器
docker exec -it ${container_id} /bin/bash

# 手動啓動Python_web
python python_job_web/web/run_app.py

# 重新進入容器後,查看程序打印的日誌
docker attach  ${container_id}

# 返回一個Json文件,記錄Docker容器的配置和狀態信息
docker inspect ${container_id} | grep IPAddress

 

八、鏡像文件的導出與創建

# 將容器導出到容器的鏡像文件 
docker export ${container_id} > update.tar

# 用容器的鏡像文件創建一個新靜像
docker import - ${container_name} < update.tar 

# 鏡像保存爲鏡像文件
docker save -o update1.tar ${container_name}

# 從鏡像文件加載生成新鏡像
docker load < update1.tar

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章