python記錄docker(python記錄名單學生參加演出請設計一段程序)

本文目錄一覽:

Python Flask項目在Gitlab CI中自動打包Docker鏡像

第一步,在Gitlab中新建一個項目

第二步,克隆支本地

第三步,本地調通Python Flask項目

用VSCode打開該項目,先用flask在app.py下寫了一個hello world:

然後在index.html中寫下hello world,放在templates目錄下:

安裝flask依賴

用以下命令進行本地運行

打開瀏覽器進入localhost:5000即可看到Hello World

本地調試成功

第四步,本地調通Docker打包與容器運行

於是嘗試利用docker打包成鏡像,由於該項目依賴flask庫,所以在根目錄添加了requirements.txt文件,裡面標明了依賴庫以及相應的版本

然後編寫好了Dockerfile

運行命令開始打包:

打包成功,運行容器:

在瀏覽器瀏覽localhost沒有響應

查看日誌發現沒有報錯

再嘗試用瀏覽器打開127.0.0.1,也不行

網上搜索發現python flask在伺服器不能直接運行,需要藉助gunicorn

於是編寫了配置文件gunicorn.conf.py:

同時修改了Dockerfile:

以及修改了依賴包requirements.txt:

再打包鏡像、運行容器,發現可以正常運作了:

第五步,Gitlab CI設置腳本自動打包Docker鏡像

由於自建Docker鏡像倉庫和賬號是隱私信息,因此使用Gitlab CI變數代替,再在項目CI/CD設置內賦值

怎樣在Python中操作Docker容器

Docker容器運行後,如何進入容器進行操作呢看起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22埠映射到本機的一個埠即可。當我啟動了五個容器後,每個容器默認是沒有配置SSH Server的,安裝配置SSHD,映射容器SSH埠,實在是麻煩。 我發現很多Docker鏡像都是沒有安裝SSHD服務的,難道有其他方法進入Docker容器看 有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。 使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。 nsenter 可以訪問另一個進程的名字空間。 為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。 PID=$(docker inspect –format 逗{{ .State.Pid }}地 container) //將container換成你的容器id 通過這個 PID,就可以連接到這個容器: $ nsenter –target $PID –mount –uts –ipc –net –pid 更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。

如何用python監控docker

platform模塊在標準庫中,它有很多運行我們獲得眾多系統信息的函數。讓我們運行Python解釋器來探索它們中的一些函數,那就從platform.uname()函數開始吧!

如何開發一個基於 Docker 的 Python 應用

python是一款應用非常廣泛的腳本程序語言,谷歌公司的網頁就是用python編寫。python在生物信息、統計、網頁製作、計算等多個領域都體現出了強大的功能。python和其他腳本語言如java、R、Perl 一樣,都可以直接在命令行里運行腳本程序。工具/原料

python;CMD命令行;windows操作系統

方法/步驟

1、首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由於3.0版本以上不向下兼容,體驗較差。

2、打開文本編輯器,推薦editplus,notepad等,將文件保存成 .py格式,editplus和notepad支持識別python語法。

腳本第一行一定要寫上 #!usr/bin/python

表示該腳本文件是可執行python腳本

如果python目錄不在usr/bin目錄下,則替換成當前python執行程序的目錄。

3、編寫完腳本之後注意調試、可以直接用editplus調試。調試方法可自行百度。腳本寫完之後,打開CMD命令行,前提是python 已經被加入到環境變數中,如果沒有加入到環境變數,請百度

4、在CMD命令行中,輸入 「python」 + 「空格」,即 」python 「;將已經寫好的腳本文件拖拽到當前游標位置,然後敲回車運行即可。

超值一篇分享,Docker:從入門到實戰過程全記錄

作者 | 天元浪子

來源 | CSDN博客

想要真正理解Docker,就不得不從虛擬化技術的發展歷程說起。普遍認為虛擬化技術經歷了物理機時代、虛擬機時代,目前已經進入到了容器化時代。可以說,Docker是虛擬化技術不斷發展的必然結果。

那麼,什麼是容器呢?容器和虛擬機有什麼不同?Docker和容器又是什麼關係呢?搞明白這幾個問題,Docker的概念就清晰了。

1.1 虛擬機和容器

藉助於VMWare等軟體,可以在一台計算機上創建多個虛擬機,每個虛擬機都擁有獨立的操作系統,可以各自獨立的運行程序。這種分身術雖然隔離度高(操作系統級),使用方便(類似物理機),但佔用存儲資源多(GB級)、啟動速度慢(分鐘級)的缺點也是顯而易見的。

相較於虛擬機,容器(Container)是一種輕量型的虛擬化技術,它虛擬的是最簡運行環境(類似於沙盒)而非操作系統,啟動速度快(秒級)、佔用存儲資源少(KB級或MB級),容器間隔離度為進程級。在一台計算機上可以運行上千個容器,這是容器技術對虛擬機的碾壓式優勢。

1.2 容器、鏡像和Docker

Docker是一個開源的應用容器引擎,可以創建容器以及基於容器運行的程序。Docker可以讓開發者打包他們的應用和依賴包到一個輕量級、可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。

聽起來很簡單,但是在Docker和容器之間,還隱藏著一個鏡像的概念,令初學者頗感困惑。本質上,Docker鏡像是一個特殊的文件系統,它提供容器運行時所需的程序、庫、資源、配置等文件。Docker鏡像類似於一個py文件,它需要Docker的運行時(類似於Python解釋器)運行。鏡像被運行時,即創建了一個鏡像的實例,一個實例就是一個容器。

1.3 Docker 和 k8s

作為容器引擎,Docker為容器化的應用程序提供了開放的標準,使得開發者可以用管理應用程序的方式來管理基礎架構,實現快速交付、測試和部署代碼。隨著容器的大量使用,又產生了如何協調、調度和管理容器的問題,Docker的容器編排應運而生。

k8s是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理,是一個開源的,用於管理雲平台中多個主機上的容器化的應用,k8s的目標是讓部署容器化的應用簡單並且高效,k8s提供了應用部署、規劃、更新、維護的一種機制。

Docker和k8sr都是以containerd(容器化標準)作為運行時,因此使用Docker創建的鏡像完全可以在k8s中無障礙的使用。

2.1 在ubuntu中安裝

在linux系統中安裝Docker非常簡單,官方為我們提供了一鍵安裝腳本。這個方法也適用於Debian或CentOS等發行版。

安裝過程如果出現超時,不要灰心,多試幾次,總會成功的。安裝完成後,Docker只能被root用戶使用,可以使用下面的命令取消許可權限制:

然後,重啟docker服務:

最後,關閉當前的命令行,重新打開新的命令行就可以了。

順便提一下,如果在CentOS下安裝,可能會出現一堆類似於下面的錯誤:

這是由於docker和Podman衝突造成的,需要先卸載Podman:

2.2 在Win10中安裝

Docker的運行,依賴linux的環境,官方提供了Docker Desktop for Windows,但是它需要安裝Hyper-V,Hyper-V是微軟開發的虛擬機,類似於 VMWare 或 VirtualBox,僅適用於 Windows 10。這個虛擬機一旦啟用,QEMU、VirtualBox 或 VMWare Workstation 15 及以下版本將無法使用!如果你必須在電腦上使用其他虛擬機(例如開發 Android 應用必須使用的模擬器),請不要使用 Hyper-V!

我的電腦是win10家庭版,不能直接安裝hyper-v,需要將下面的命令保存到cmd文件中:

然後在cmd文件上點擊右鍵,選擇使用管理員運行。執行完畢後會重啟,在重啟的過程中進行安裝。

2.3 Hello world

docker服務啟動的情況下,運行下面的命令:

此命令的含義是:

第一次運行時,因為本地沒有ubuntu:20.04鏡像,docker會自動從鏡像伺服器下載。下載過程可能需要多試幾次,只要成功一次,以後執行就不再需要下載了。

docker官方還提供了一個hello-world鏡像,可以直接運行:

此命令省略了鏡像版本和運行參數,docker使用latest作為版本,即最新版本。

從hello world的例子中,也可以體驗到,docker實例的運行是非常快的。

docker官方的鏡像庫比較慢,在進行鏡像操作之前,需要將鏡像源設置為國內的站點。

新建文件/etc/docker/daemon.json,輸入如下內容:

然後重啟docker的服務:

3.1 列出本地所有鏡像

執行命令 docker images 可以查看

當前我本地只有剛才安裝的兩個鏡像。

3.2 從鏡像庫中查找鏡像

執行命令 docker search 鏡像名稱可以從docker鏡像庫中查找鏡像。

最好選擇官方(OFFICIAL)的鏡像,這樣的鏡像最穩定一些。

3.3 下載新的鏡像

執行命令docker pull 鏡像名稱:版本號即可下載新的鏡像。

鏡像下載後,就可以使用鏡像來創建容器了。

4.1 啟動容器

執行命令docker run即可啟動容器,也就是創建某個鏡像的實例。docker run命令非常複雜,可以先執行一個docker run –help來查看幫助:

比如我們要執行python的shell,需要添加-it參數,即:docker run -it python:3.8

4.2 將宿主機的文件掛載到容器

docker容器與宿主機是隔離的,要想讓容器內的程序能訪問宿主機上的文件,需要通過-v參數將宿主機的文件掛載到容器中。

比如我們在宿主機上有一個hello.py,可以列印hello,想要在python容器中執行,就需要進行掛載。-v後還需要接兩個參數,分別是宿主機的目錄和容器內的目錄,兩者使用:分隔,路徑必須都是絕對路徑。

我的hello.py保存在主目錄的/docker_test目錄中,將這個目錄掛載到容器的/docker_test目錄,然後在容器內執行python /docker_test/hello.py:

4.3 容器的埠映射

我們修改一下hello.py,創建一個socket服務端,並監聽5000埠,當有客戶端連接時,列印客戶端的地址,先客戶端發送hello,然後關閉連接:

在容器內執行:

接下來,嘗試用telnet命令連接,結果卻是失敗的。原因是,127.0.0.1是宿主機的ip地址,5000是容器的埠,這與我們的習慣稍微有些不同。事實上,docker的容器是非常輕量的,它並沒有自己的網路,要想訪問容器的埠,需要進行埠映射,將容器的某埠映射到宿主機的埠,客戶端連接時,只要與宿主機的埠進行連接就可以了。

需要注意的是,上面的代碼創建的伺服器,無論如何也不可能被客戶端連接,因為代碼中綁定了127.0.0.1的ip,在容器中運行時,需要綁定所有ip,即0.0.0.0。

然後,再使用-p參數,-p還需要三個參數,即宿主機的ip地址、宿主機的埠、容器的埠,三者之間使用:分隔。一般的,可以將宿主機的ip地址省略,只寫宿主機的埠:容器的埠即可。

這樣,就將容器的5000埠映射到了宿主機的5001埠,使用:

即可與容器中的伺服器進行連接。

4.4 容器管理

上面的服務運行之後,可以使用docker ps命令,查看運行中的容器:

顯示的內容有下面幾列:

要想結束容器,可以使用docker kill 容器ID命令。

一般而言,當我們的程序開發完成後,會連同程序文件與運行環境一起製作成一個新的鏡像。

要製作鏡像,需要編寫Dockerfile。DockeFile由多個命令組成,常用的命令有:

注意,Docker鏡像中有一個層的概念,每執行一個RUN命令,就會創建一個層,層過多會導致鏡像文件體積增大。盡量在RUN命令中使用連接多條shell命令,減少RUN命令的個數,可以有效減小鏡像文件的體積。

5.1 自製顯示文本文件內容鏡像

編寫cat.py,接收一個文件名,由python讀取文件並顯示文件的內容:

這個例子比較簡單,縮寫Dockerfile如下:

這個Dockerfile的含義是:

需要說明的是,ENTRYPOINT有兩種寫法:

這裡採用第二種寫法,是因為我們要在外部給容器傳遞參數。執行命令編譯Docker鏡像:

這個命令中,-t的含義是目標,即生成的鏡像名為hello,版本號為1.0,別忘了最後那個.,這叫到上下文路徑,是指 docker 在構建鏡像,有時候想要使用到本機的文件(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。

這樣,我們的第一個鏡像就製作完成了,使用下面的命令執行它:

即可看到~/docker_test/cat/files/test.txt的內容。

5.2 自製web伺服器鏡像

我們使用tornado開發一個網站,而python的官方鏡像是沒有tornado庫的,這就需要在製作鏡像時進行安裝。

測試的ws.py如下:

編寫Dockerfile文件如下:

在此我們驗證一下CMD與ENTRYPOINT的區別。在Dockerfile所在有目錄下執行如下命令:

執行完成後,再使用docker images使用就可以看到生成的鏡像了,然後使用下面的命令運行:

在瀏覽器中輸入宿主機的ip和8000埠,就可以看到頁面了。

在這個例子中,我使用的運行命令是CMD,如果在docker run中指定的其他的命令,此命令就不會被執行,如:

此時,容器中被執行的是python命令,而不是我們的服務。在更多情況下,我們希望在docker run命令中為我們的服務傳參,而不是覆蓋執行命令,那麼,我們應該使用ENTRYPOINT而不是CMD:

上面這種寫法,是不支持傳遞參數的,ENTRYPOINT和CMD還支持另一種寫法:

使用這種寫法,docker run命令中的參數才可以傳遞給hello.py:

這個命令中,–port=9000被作為參數傳遞到hello.py中,因此容器內的埠就成了9000。

在生產環境中運行時,不會使用-it選項,而是使用-d選項,讓容器在後台運行:

這種方式下,即使當前的控制台被關閉,該容器也不會停止。

5.3 自製apscheduler服務鏡像

接下來,製作一個使用apscheduler編寫的服務鏡像,代碼如下:

Dockerfile也是信手拈來:

生成鏡像:

應該可以運行了,文件複製需要兩個目錄,在運行時,可以使用兩次-v來掛載不同的目錄:

前面用到的官方python鏡像大小足足882MB,在這個基礎上,再安裝用到的第三方庫,添加項目需要的圖片等資源,大小很容易就超過1個G,這麼大的鏡像,網路傳給客戶非常的不方便,因此,減小鏡像的體積是非常必要的工作。

docker hub上有個一python:3.8-alpine鏡像,大小只有44.5MB。之所以小,是因為alpine是一個採用了busybox架構的操作系統,一般用於嵌入式應用。我嘗試使用這個鏡像,發現安裝一般的庫還好,但如果想安裝numpy等就會困難重重,甚至網上都找不到解決方案。

還是很回到基本的路線上來,主流的操作系統鏡像,ubuntu的大小為72.9MB,centos的大小為209MB——這也算是我更喜歡使用ubuntu的一個重要原因吧!使用ubuntu作為基礎鏡像,安裝python後的大小為139MB,再安裝pip後的大小一下子上升到了407MB,要是再安裝點其他東西,很容易就趕上或超過python官方鏡像的大小了。

看來,尋常路線是很難壓縮鏡像文件體積了。幸好,還有一條曲線救國的路可走,這就是多階段構建法。

多階段構建的思想其實很簡單,先構建一個大而全的鏡像,然後只把鏡像中有用的部分拿出來,放在一個新的鏡像里。在我們的場景下,pip只在構建鏡像的過程中需要,而對運行我們的程序卻一點用處也沒有。我們只需要安裝pip,再用pip安裝第三方庫,然後將第三方庫從這個鏡像中複製到一個只有python,沒有pip的鏡像中,這樣,pip佔用的268MB空間就可以被節省出來了。

1、在ubuntu鏡像的基礎上安裝python:

然後運行:

這樣,就生成了python:3.8-ubuntu鏡像。

2、在python:3.8-ubuntu的基礎上安裝pip:

然後運行:

這樣,就生成了python:3.8-ubuntu-pip鏡像。

3、多階段構建目標鏡像:

這個dockerfile需要解釋一下了,因為它有兩個FROM命令。

第一個是以python:3.8-ubuntu-pip鏡像為基礎,安裝numpy,當然,在實際應用中,把所有用到的第三方庫出寫在這裡。

第二個FROM是以FROM python:3.8-ubuntu鏡像為基礎,將第三方庫統統複製過來,COPY命令後的–from=0的意思是從第0階段進行複製。實際應用中再從上下文中複製程序代碼,添加需要的ENTRYPOINT等。

最後,再運行:

這然,用於我們項目的鏡像就做好了。比使用官方python鏡像構建的版本,小了大約750MB。

到此,我們的鏡像已經製作好了,可是,鏡像文件在哪,如何在生產環境下運行呢?

剛才使用docker images命令時,已經看到了生成的鏡像:

我們可以使用docker save命令將鏡像保存到指定的文件中,保存的文件是一個.tar格式的壓縮文件:

將hello.tar複製到生產環境的機器上,然後執行導入命令:

就可以使用了。

原創文章,作者:A5M3Y,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/129585.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
A5M3Y的頭像A5M3Y
上一篇 2024-10-03 23:26
下一篇 2024-10-03 23:26

相關推薦

  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Python一元二次方程求解程序

    本文將詳細闡述Python一元二次方程求解程序的相關知識,為讀者提供全面的程序設計思路和操作方法。 一、方程求解 首先,我們需要了解一元二次方程的求解方法。一元二次方程可以寫作: …

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨著深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟體開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • 微信小程序和Python數據交互完整指南

    本篇文章將從多個方面介紹如何在微信小程序中實現與Python的數據交互。通過本文的學習,您將掌握如何將微信小程序與後台Python代碼結合起來,實現更豐富的功能。 一、概述 微信小…

    編程 2025-04-29

發表回復

登錄後才能評論