天天看點

docker叢集部署:第2部分:容器

docker叢集部署:第2部分:容器

介紹

現在是開始建構Docker應用程式。我們将從這個應用程式的層次結構的底部開始,這個應用程式是一個容器。在這個層次上面是一個服務,它定義了容器在生産中的行為方式,将在第3部分中進行讨論。最後,在頂層是堆棧,定義了所有服務的互動,将在第5部分進行讨論。

docker開發環境

在過去,如果你要開始編寫一個Python應用程式,你的第一步就是在你的伺服器上安裝一個Python運作庫。但是,這會造成你的伺服器上的環境必須如此,以使你的應用程式能夠按預期運作。

使用Docker,docker具有可移植性,你可以将一個可移植的Python運作時作為一個鏡像來擷取,無需安裝。然後,将基礎Python鏡像與應用程式代碼一起包括在内,包括應用程式所依賴項。

這些可移植的鏡像是由一個叫做Dockerfile的東西來定義的。

用Dockerfile定義一個容器

Dockerfile将定義你的容器内的環境中發生了什麼。這個環境與系統的其他部分是隔離的,是以你必須将端口映射到外部世界,并具體說明你想“拷入”哪些檔案那個環境。這樣做後,你定義的Dockerfile在生成鏡像後,就具有了移植性。

Dockerfile

建立一個名為Dockerfile的檔案,将以下内容複制并粘貼到該檔案中并儲存。

說明:你在代理伺服器後面嗎?

代理伺服器啟動并運作後,可以阻止與您的網絡應用程式的連接配接。如果您位于代理伺服器的後面,請使用ENV指令為你的代理伺服器指定主機和端口,将以下行添加到Dockerfile中:

注意:在使用pip之前添加這些行,以便安裝成功。

這個Dockerfile引用了一些我們還沒有建立的檔案,分别是app.py和requirements.txt。接下來建立這些。

應用程式本身

建立另外兩個檔案:requirements.txt和app.py,并将它們放在與Dockerfile同一級目錄下。當上面的Dockerfile被内置到鏡像中時,由于Dockerfile的ADD指令,app.py和requirements.txt将會出現,并且app.py的輸出将可以通過HTTP通路,這要歸功于EXPOSE指令。

現在我們看到pip install -r requirements.txt安裝了Python的Flask和Redis庫,應用程式列印環境變量NAME以及調用socket.gethostname()的輸出。最後,由于Redis沒有運作(因為我們隻安裝了Python庫,而不是Redis本身),是以我們在這裡嘗試使用它将會失敗并産生錯誤資訊。

注意:在容器中通路主機的名稱将檢索容器ID,這與正在運作的可執行檔案的程序ID類似。

建構應用程式

我們準備建構應用程式。確定你仍然在你的新目錄的頂層。ls應該顯示:

現在運作build指令。這會建立一個Docker鏡像,我們将使用-t标記,是以它有一個名字。

運作應用程式

運作應用程式,使用-p(小寫)将您的機器的端口4000映射到容器的已釋出端口80:

<code>#docker run -p 4000:80 friendlyhello</code>

你應該看到一條消息,Python在http://0.0.0.0:80上提供你的應用程式。但是,這個消息來自容器内部,它不知道你将該容器的端口80映射到4000,本地可以使用URL為http:// localhost:4000來通路。

注意:如果您在Windows 7上使用Docker Toolbox,請使用Docker Machine IP而不是本地主機。

您也可以在shell中使用curl指令來檢視相同的内容。

這個4000:80的端口重映射是為了示範Dockerfile中的EXPOSE與使用docker run -p釋出的内容之間的差別。在後面的步驟中,我們将主機上的端口80映射到容器中的端口80,并使用http:// localhost。

現在讓我們以分離模式在背景運作應用程式:

分享鏡像

為了示範我們剛剛建立的鏡像可移植性,我們上傳我們建構的鏡像,并在其他地方運作它。畢竟,當你想将容器部署到生産環境中時,你需要學習如何使用系統資料庫(registry)。

一個系統資料庫是一個存儲庫的集合,一個存儲庫是一個鏡像集合,這有點像GitHub存儲庫,除了代碼已經建立。系統資料庫上的帳戶可以建立許多存儲庫。 Docker CLI預設使用Docker的公共系統資料庫。

注意:我們将在這裡使用Docker的公共系統資料庫,因為它是免費的,并且是預配置的,但是有許多公共選項可供選擇,甚至可以使用Docker Trusted Registry設定您自己的私有系統資料庫。

使用Docker ID登入

如果您沒有Docker帳戶,請在cloud.docker.com注冊一個。記下你的使用者名。

标記鏡像

将本地鏡像與系統資料庫中的存儲庫相關聯的符号是username/repository:tag。該标簽是可選的,但推薦使用,因為這是注冊管理機構為Docker鏡像提供版本的機制。給存儲庫并标記上下文的有意義的名字,比如get-started:part2。這會将圖像放入啟動存儲庫,并将其标記為part2。

釋出鏡像

一旦完成,這個上傳的結果是公開的。如果你登入到Docker Hub,你将會看到那個新的鏡像和它的pull指令。

從遠端存儲庫中提取并運作鏡像

從現在開始,你可以使用docker run并使用此指令在任何機器上運作

無論Docker運作在哪裡,它都會将您的鏡像,Python以及所有依賴項從requirements.txt中提取出來,并運作您的代碼。它們一起旅行在一個整潔的小包裡,主機不需要安裝任何東西,除了Docker。

     本文轉自品鑒初心51CTO部落格,原文連結:http://blog.51cto.com/wutengfei/2063990,如需轉載請自行聯系原作者