參考:(47條消息) 一個Python項目(帶前端),部署到Docker的完整過程_學編程的司馬光的博客-CSDN博客_docker部署python項目
前提:
docker已經安裝好,docker的安裝,請見另一篇博客:
https://blog.csdn.net/u013282737/article/details/85246755
序言:介紹一下需要運行的Python項目的結構:
平時在PyCharm里面運行該工程,只要直接運行server.py文件即可
現在希望將該工程,部署到docker里面,使用容器啟動:
步驟如下:
1:創建一個上傳到Linux系統文件夾(文件名任意)
docker_EF_NFCS是要上傳到Linux系統,生成Docker鏡像的文件夾
docker_EF_NFCS文件夾下面有兩個東東,
一個Dockerfile文件(沒有后綴名)
Dockerfile 是一個文本文件,其內包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。有了 Dockerfile,就可以創建我們所需要的鏡像
Dockerfile文件內容如下:
#基於的基礎鏡像
FROM python:3.7
#代碼添加到code文件夾
ADD ./EF_NFCS /code
# 設置code文件夾是工作目錄
WORKDIR /code
# 安裝支持
RUN pip install -r requirements.txt
CMD ["python", "/code/package/server.py"]
--------------------------------------
最后一條命令,就是說,當啟動容器時候,執行server.py程序。
一個EF_NFCS(任意起的名字)文件夾:包含工程的代碼,和運行工程所需要的環境列表
所以,EF_NFCS文件夾,有兩個成員package和requirements.txt
package就是Python項目的package(整個源碼所在目錄)直接復制過來的
requirements.txt生成方法:
cmd命令,進入到【D:\python\EF_NFCS】目錄,也就是工程目錄,package的同級目錄,
執行命令:pip freeze > requirements.txt
就在該目錄下生成了一個requirements.txt文件:
如下圖,可能很大,因為沒有配合virtualenv ,就把整個環境中的包都列出來,
沒關系,我們可以刪除我們此工程中,不需要的組件
2:上傳到linux環境,生成鏡像
2.1:我們將docker_EF_NFCS文件夾,壓縮成zip包,上傳到Linux虛擬機系統中的某個路徑下面
2.2:解壓:
執行命令:unzip docker_EF_NFCS.zip
2.3:進入docker_EF_NFCS文件夾:
2.4:創建鏡像:
執行命令:docker build -t ef_nfcs_img .
ef_nfcs_img 為創建的鏡像名稱,. 表示當前目錄(docker_EF_NFCS)
查看鏡像是否創建成功:
執行命令:docker images
可以看到ef_nfcs_img的鏡像,已經存在了
3:運行鏡像,生成並啟動容器
執行命令:docker run -it -p 9060:9060 --name ef_nfcs ef_nfcs_img
-it:表示交互式終端的容器,非啟動后立刻結束的容器
-p 9060:9060:表示將docker的9060端口,映射到Linux虛擬機的9060端口
也就是說,訪問Linux虛擬機的9060端口,就是在訪問docker容器的9060端口
--name ef_nfcs:給容器取個名字,嫌麻煩可以省去
ef_nfcs_img:容器是用哪個鏡像啟動的(一個容器,必須依賴一個鏡像啟動)
和原來用PyCharm啟動的效果一致:
原來訪問系統:
現在訪問系統,只要將IP替換成虛擬機的IP:
這就OK啦
4:一些實用命令
退出容器又不關閉容器:Ctrl + P + Q
比如這種情況:
直接輸入exit 會退出且關閉容器,工程就stop了
或者Ctrl + C,會報錯KeyboardInterrupt,工程就也stop了
再訪問就訪問不了了:
此時,就需要使用命令:docker start 容器ID,去再啟動容器后,就可以繼續訪問工程了,
使用命令:
docker exec -it 容器ID /bin/bash
或者
docker attach 容器ID,重新進入容器后,可查看程序打印的日志
但是,如果使用Ctrl + P + Q退出容器,就不會中斷工程,等於退出容器后,還可訪問容器的工程,
再進入,也是使用命令:docker attach 容器ID
ctrl+d 退出容器且關閉, docker ps 查看無
ctrl+p+q 退出容器但不關閉
查看安裝的docker:yum list installed | grep docker
查看容器:docker ps -a
查看鏡像:docker images
刪除容器:docker rm 容器ID
刪除鏡像:docker rmi 鏡像ID/鏡像名
安裝rz上傳,sz下載的命令:yum -y install lrzsz
docker inspect 容器ID:返回一個Json文件記錄Docker容器的配置和狀態信息
將容器導出到容器的鏡像文件 : docker export 容器ID > update.tar
用容器的鏡像文件創建一個新靜像:docker import - 鏡像名 < update.tar
創建完成之后,生成並啟動鏡像的容器:docker run -it 鏡像名
不行就在后面加一個/bin/bash ,然后進入code的package目錄,手動啟動程序:python server.py
比如報錯:Error response from daemon: No command specified
鏡像保存為鏡像文件: docker save -o update1.tar update(update是一個已經存在的鏡像)
從鏡像文件加載生成新鏡像:docker load < update1.tar
有時候,從鏡像文件加載生成新鏡像,會報錯如下:
open /var/lib/docker/tmp/docker-import-559669842/bin/json: no such file or directory
從以命令可以解決:
cat jdkself.tar | docker import - jdkself
jdkself.tar為鏡像文件名稱,jdkself為鏡像名稱