1. 程式人生 > >操作系統-容器-Docker:如何將應用打包成為 Docker 鏡像?

操作系統-容器-Docker:如何將應用打包成為 Docker 鏡像?

固定 錯誤 結合 聲明 復雜 試圖 技能 裏的 升級版

ylbtech-操作系統-容器-Docker:如何將應用打包成為 Docker 鏡像?

1.返回頂部
1、

雖然 DockerHub 提供了大量的鏡像,但是由於企業環境的多樣性,並不是每個應用都能在 DockerHub 找到對應的鏡像來使用。那就要求企業的運維人員掌握制作 Docker 鏡像的技能。在開始打包應用前,你首先要明白這兩件事: 第一件事是選擇適合你的方式來生成鏡像: 1. 通過 Dockerfile 來自動編譯生成鏡像,實現構建鏡像的需求。 2.通過容器內操作,並進行 Commit 來實現打包生成鏡像。第一種思路多用於用戶交互較少的時刻,比如軟件部署時無需輸入任何命令的應用。第二種思路用於用戶交互較多、安裝過程中配置較多的應用。 第二件事是你需要註意,如何拆分現有的應用,來實現打包。Docker 容器化的應用應當是功能最小化的應用。

這裏的拆分並不是指將每個軟件拆分成為一個容器,而是強調實現功能最小化。拿最常見的 LAMP 架構來討論。最小化的結構應當是 Apache 和 PHP 在一個容器內, MySQL 在一個容器內。而不是將 Apache 、 PHP 、 MySQL 各自拆分一個容器。 Apache 和 PHP 的有機結合使結構內的應用完整的實現了 PHP 解析和 Web 頁面的功能,而 MySQL 獨自承擔了數據存儲的功能。而各自拆分一個容器會導致架構極為復雜,在進行容器擴容時也容易受到影響。一般來說,你可以將應用拆分成為 2-3 個容器, 2 個容器的情況下,是數據存儲和應用程序各自一個容器。對於部分應用,可能還有緩存系統,同樣也要單獨放置在一個容器內。這樣的結構下,在你需要擴容時,就比較容易,根據你的需要,可以隨時擴容緩存系統或應用程序。

明了了上面的兩件事,接下來進入應用打包的環節。

Dockerfile 打包

首先,我們先看下 Docker 官方打包的 Tomcat 鏡像的 Dockerfile.

技術分享圖片

我們可以看到,裏面大量執行了 Linux 命令,來安裝,部署軟件,並且對於需要確認的命令都加入-f 來強制執行。確保沒有交互,因為在編譯鏡像的過程中,無法進行交互操作,如果碰到交互操作,卡住就會導致鏡像編譯的失敗,故而 DockerFile 不支持需要輸入命令的安裝腳本等

技術分享圖片

當然,對於 Dockerfile,我們同樣也有一些最佳實踐:

  • 通過 Dockerfile 構建的鏡像應當盡可能精簡。
  • 盡量不安裝非必要的軟件包。
  • 一個容器只運行一個單獨的實例,將具有耦合度的應用分別安裝到不同的容器裏面。
  • 慎重引入新的數據層
  • 將準備安裝的軟件包按安裝的字母順序排列,這樣可以避免重復安裝軟件包的情況,同時也有助於進行軟件更新。通過添加 “\” 分割命令,增加代碼的可讀性
  • 盡量選擇官方提供的鏡像版本來作為基礎鏡像,減小鏡像的體積。
  • 將多條 RUN 命令使用"/"連接起來,這樣更易於理解,可以方便維護。
  • 為鏡像定義一個比較通用的端口,比如提供 HTTP Web 服務的鏡像,最好是暴露 80 端口。
  • Dockerfile 的開頭幾行的指令應當固定下來,不要每次都隨意更改,這樣可以利用緩存
  • 通過 – t 標記來構建鏡像,有助於用戶管理每個創建的鏡像。
  • 不要在 Dockerfile 中映射公有端口。
  • 使用 CMD 和 ENTRYPOINT 時,一定要用數組語法,而且 CMD 和 ENTRYPOINT 結合使用更好
  • 不要開機初始化
  • 在 Push 之前,現在本地構建運行一下,確保本地構建的鏡像可以在任何地方正常運行。
  • 不要在構建中升級版本,如果更新時試圖修改 Init 或改變容器的內容,更新可能會失敗,還可能產生不一致的鏡像。
  • FROM 命令應該包含基礎鏡像的完整倉庫名和標簽
  • 使用指令組合,比如 apt-get update 應該和 apt-get install 結合。

基礎鏡像 Commit 生成鏡像

除了通過 Dockerfile 來打包生成鏡像外,也可以通過 Docker Commit 來生成鏡像。通過 Commit 打包的鏡像多是由於應用本身在部署時有大量的交互內容,無法通過命令來指定。 在通過 Commit 打包鏡像時,我們需要如下操作: 1.啟動一個基礎鏡像容器,並進入 console docker run -i – t centos:6.7 上面的命令創建了一個基於 CentOS 6.7 的容器,並進入到容器內

技術分享圖片

2.執行配置環境的命令 登陸容器後,可以執行各種 Linux 下的命令。

技術分享圖片

等配置完環境後,打開一個新的控制臺 執行命令docker ps,可以看到正在運行的容器

技術分享圖片

比如我的容器的 ID 就是 35f1c2ae1f7e 3.將容器打包成鏡像 執行命令 docker commit 35f1c2ae1f7e mynewimage 就將容器35f1c2ae1f7e打包為新的鏡像mynewimage

技術分享圖片

可以執行docker images查看鏡像

技術分享圖片

另外,蜂巢的保存為鏡像的功能,就是基於此功能制作的,通過雲端容器 Console 的操作,並打包成為鏡像,大大降低了上雲的難度。無需在本地部署 Docker 環境,即可實現應用的容器化;同時雲端打包鏡像比本地打包速度也要更快些,大大提升了上雲的速度。 技術分享圖片


PS.其實官方推薦:單個鏡像單個進程。這樣的情況下,有利有弊利在於,單進程容器更加適合縱向擴展和復用。但是,在較大的產品框架下,可能容器之間的關聯會非常復雜。創建一個應用可能會需要創建非常多的容器。所以,在我看來如何劃分,還是應該看使用場景和技術路線,量身定制。

2、
2.返回頂部
3.返回頂部
4.返回頂部
5.返回頂部
1、 https://www.v2ex.com/t/292035 2、
6.返回頂部
技術分享圖片 作者:ylbtech
出處:http://ylbtech.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

操作系統-容器-Docker:如何將應用打包成為 Docker 鏡像?