python項目以docker形式打包部署詳細(xì)流程
一、前言
在很久很久以前,我已經(jīng)聽過Docker的大名,當(dāng)時服務(wù)著急上線雖然考慮過用Docker來部署我的服務(wù),但是因為趕期的原因放棄了。
這兩天因為華為云服務(wù)器到期,而且阿里云服務(wù)器優(yōu)惠力度特別大的原因,我要把華為云服務(wù)器里的工程遷移到阿里云。
遷移的過程中,大量的時間精力浪費在了重裝python,加載依賴,遷移項目,配置端口等環(huán)境配置的工作上。
我在想,如果當(dāng)時用了Docker部署,我至于受這氣?
于是,一不做二不休,就花了點時間把部署以docker的形式部署了。
在部署前,我以為是一件多么苦難的事,結(jié)果,操作后才發(fā)現(xiàn),原來最難的一步是跨出第一步。
二、docker安裝
還好,在之前我半途而廢的過程中,我把經(jīng)驗已經(jīng)積累下來了。
需要注意的是Docker桌面目前僅支持以下幾個操作系統(tǒng)
我的服務(wù)器是CentOS,所以這個桌面應(yīng)該是用不了了,但是影響應(yīng)該不大。因為Docker引擎目前支持絕大多數(shù)操作系統(tǒng)。
1. CentOS安裝Docker的先決條件
1.1 確認(rèn)自己的系統(tǒng)版本
如果需要安裝Docker引擎,需要的系統(tǒng)版本必須是7、8、9的版本。并且官方建議Linux內(nèi)核為3.10及以上。
lsb_release -a
版本為7.9,符合條件。
uname -r
內(nèi)核為3.10。符合條件。
1.2 啟用centos-extras存儲庫
官方說明,該存儲庫默認(rèn)情況下處于啟用狀態(tài),但是如果你之前禁用過它,則需要重新啟用它。
yum repolist enabled
可以看到,extras存儲庫已啟用
如果你之前不巧,使用過以下命令或者其他命令禁用過extras存儲庫:
sudo vi /etc/yum.repos.d/CentOS-Base.repo
enabled為1 表示正在啟用,為0表示已被禁用。
在進(jìn)行更改后,建議清除YUM緩存,以確保使用最新的倉庫配置。
sudo yum clean all
溫馨提示,不要隨便禁用庫。
2. 卸載舊版本(如果之前安裝過的話)
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
因為,我沒安裝過舊版Docker,所以這里顯示沒有刪除任何東西。
3. 選擇安裝方式
- 官方推薦通過設(shè)置Docke存儲庫的方式安裝,便于安裝和升級。
- 也可以在官方下載 RPM 包,手動安裝,然后管理純靠手動升級。適合安裝在無法訪問外網(wǎng)的內(nèi)網(wǎng)系統(tǒng)上。
- 在測試和開發(fā)環(huán)境中,您可以使用自動化的便捷腳本來安裝 Docker。
這邊使用官方推薦的存儲庫安裝。
4. 安裝流程
4.1 設(shè)置倉庫
首先需要安裝一個工具包yum-util,它提供了yum-config-manager功能:
sudo yum install -y yum-utils
這個是官網(wǎng)的中央倉庫,國內(nèi)速度會有一些慢。
sudo yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
國內(nèi)的朋友推薦再加一個阿里云的鏡像倉庫,體驗會好很多。
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.2 選擇版本安裝
官網(wǎng)給出了直接安裝最新版本和安裝指定版本的指令。
- 直接安裝最新版本
需要一起安裝 Docker Engine、containerd 和 Docker Compose
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 選擇指定版本安裝
首先列出所有版本
yum list docker-ce --showduplicates | sort -r
框住的就是版本號,選擇指定版本,然后使用下面的命令進(jìn)行安裝。
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
<VERSION_STRING>部分換為指定版本號即可。
5. 啟動運行docker
1. 啟動 Docker。
sudo systemctl start docker
2. 通過運行映像來驗證 Docker 引擎安裝是否成功。hello-world
sudo docker run hello-world
6. 卸載 Docker 引擎
1. 卸載 Docker Engine、CLI、containerd 和 Docker Compose 包:
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
2. 主機(jī)上的image、containerd或自定義配置文件不會自動刪除,需要手動執(zhí)行。
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
三、python項目Dockerfile編寫。
提前聲明,Dockerfile雖然看起來有點復(fù)雜,但是其實還是挺容易理清的??梢韵葏⒖枷挛疫@個工程的Dockerfile,其實并不復(fù)雜。
FROM python:3.6 # 設(shè)置工作目錄 WORKDIR /app # 復(fù)制項目文件到容器中 COPY . /app # 如果你的鏡像中沒有 tzdata,則需要安裝它 # 注意:python:3.6 官方鏡像可能已包含 tzdata # RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/* # 設(shè)置時區(qū)為東八區(qū)(中國標(biāo)準(zhǔn)時間) RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone # 安裝依賴 RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt # 暴露端口 EXPOSE 7010 # 設(shè)置容器啟動時運行的命令 CMD ["python3", "api.py"]
1. 選擇基礎(chǔ)鏡像
FROM python:3.6
- 作用:指定基礎(chǔ)鏡像為 python:3.6。
- 注意事項:我這里是python項目,選擇的是python的鏡像,如果是nginx或者java項目,需要設(shè)置對應(yīng)的景象。
2. 設(shè)置工作目錄
WORKDIR /app
- 作用:設(shè)置工作目錄為 /app。
- 注意事項:這個目錄的設(shè)置就見仁見智,有的喜歡用project,有的喜歡什么都不設(shè),看公司規(guī)范和個人習(xí)慣。我們只需要確保后續(xù)的文件操作都是基于這個工作目錄的。
3. 復(fù)制項目文件到容器中
COPY . /app
- 作用:將當(dāng)前上下文中的所有文件和目錄復(fù)制到鏡像的 /app 目錄下。這里直接用當(dāng)前目錄就行。
- 注意事項:可以使用 .dockerignore 文件排除不需要的文件和目錄,以減少鏡像大小。規(guī)則和gitignore一個路數(shù)。需要確保的是敏感文件(如密鑰、密碼等)不會被復(fù)制到鏡像中。
4. 安裝 tzdata(可選)
# RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/*
- 作用:安裝 tzdata 以確保時區(qū)設(shè)置能夠正確工作。(可選)
- 注意事項:如果基礎(chǔ)鏡像已經(jīng)包含 tzdata,則可以省略此步驟。
5. 設(shè)置容器時區(qū)
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
- 作用:設(shè)置容器的時區(qū)為東八區(qū)(中國標(biāo)準(zhǔn)時間)。這個是docker老生常談的問題,他的時區(qū)需要自己更正。
- 注意事項:確保應(yīng)用或服務(wù)需要這個特定的時區(qū)設(shè)置。國內(nèi)的一般應(yīng)該都需要,不然打個日志都不確定是啥時候的了。
6. 安裝 Python 依賴
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
- 作用:下載需要的第三方庫。
- 注意事項:這個requirements.txt,直接用pipreqs生成就行。需要注意的是要掛個國內(nèi)的 PyPI 鏡像來安裝 Python 依賴,不然依賴下載太慢了。我這里是使用清華大學(xué)的鏡像。
7. 暴露端口
EXPOSE 7010
- 作用:聲明容器在運行時應(yīng)該監(jiān)聽 7010 端口。
- 注意事項:沒啥需要注意的,自己設(shè)置需要的端口就行。
8. 設(shè)置容器啟動時運行的命令
CMD ["python3", "api.py"]
- 作用:設(shè)置容器啟動時默認(rèn)執(zhí)行的命令。
- 注意事項:根據(jù)個人需要設(shè)置就行。如果你的應(yīng)用需要特定的環(huán)境變量或配置,可以在 CMD 之前使用 ENV 指令來設(shè)置它們。
四、docker鏡像打包
編寫完dockerfile,我們一般喜歡放在需要打包的地方的根路徑,然后直接運行
docker build -t opendrop .
- pythondemo改成自己想要的鏡像的名字。
運行之后,docker會自動完成dockerfile里面的每一個步驟。打包完成后,我們就可以看到images。
大家直接docker images 即可看到。
如果要重新打包,需要先刪除原來的鏡像,執(zhí)行以下命令即可。
docker rmi a9765c2d0703(鏡像id)
操作如下:
五、根據(jù)鏡像啟動容器
根據(jù)鏡像創(chuàng)建容器執(zhí)行以下命令
`docker run -d -p 要映射的本機(jī)端口:docker中項目運行的端口 鏡像名稱`
我這里端口都是7010,你們根據(jù)需要自行配置。
docker run -d -p 7010:7010 opendrop
然后用docker ps就能看到執(zhí)行的容器了。
如果想看項目日志,可以執(zhí)行以下命令進(jìn)入docker查看。
docker exec -it 3843cbd6fb40(容器id) /bin/bash
- 退出時使用 ctrl + D 退出
docker 容器相關(guān)常用命令
1. 停止容器
docker stop 【容器id】
- 停止一個或多個正在運行的容器。
2. 重啟容器
docker restart 【容器id】
- 重啟一個或多個容器。
3. 刪除容器
docker rm 【容器id】
- 刪除一個或多個容器。參數(shù)-f:強(qiáng)制刪除容器,即使容器正在運行。
4. 導(dǎo)出/導(dǎo)入容器
docker export 【容器id】 > file.tar docker import file.tar 【鏡像名字】
- 將容器導(dǎo)出為tar文件;從tar文件導(dǎo)入容器為鏡像
總結(jié)
到此這篇關(guān)于python項目以docker形式打包部署的文章就介紹到這了,更多相關(guān)python以docker打包部署內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python flashtext文本搜索和替換操作庫功能使用探索
本文將深入介紹Python flashtext庫,包括其基本用法、功能特性、示例代碼以及實際應(yīng)用場景,以幫助大家更好地利用這個有用的工具2024-01-01Python實現(xiàn)程序判斷季節(jié)的代碼示例
今天小編就為大家分享一篇關(guān)于Python實現(xiàn)程序判斷季節(jié)的代碼示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01PyQt5實現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn)
PyQt5是強(qiáng)大的GUI工具之一,通過其可以實現(xiàn)優(yōu)秀的桌面應(yīng)用程序。本文主要介紹了PyQt5實現(xiàn)用戶登錄GUI界面及登錄后跳轉(zhuǎn),具有一定的參考價值,感興趣的可以了解一下2021-11-11Python中所有子圖標(biāo)簽Legend顯示問題記錄
在Python中,利用matplotlib創(chuàng)建的子圖可以很容易地添加圖例,無論是為每個子圖單獨添加,還是統(tǒng)一在一起,本文詳細(xì)介紹了如何在多個子圖中顯示圖例,包括全局圖例的顯示、圖例樣式的調(diào)整和圖例位置的調(diào)整等,需要的朋友可以參考下2024-12-12python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)
這篇文章主要介紹了python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié),本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03在Django中動態(tài)地過濾查詢集的實現(xiàn)
本文主要介紹了Django中動態(tài)地過濾查詢集的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03