| ylbtech-操作系統-容器-Docker:如何將應用打包成為 Docker 鏡像? |
| 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.返回頂部 |
| 3.返回頂部 |
| 4.返回頂部 |
| 5.返回頂部 |
| 6.返回頂部 |
| 作者:ylbtech 出處:http://ylbtech.cnblogs.com/ 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 |
