序言:
需要運行的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