構建你的第一個Java鏡像的5個小竅門

wtyo7694 8年前發布 | 16K 次閱讀 Java Docker 操作系統

【編者的話】Arun Gupta是 《Docker for Java Developers》 一書的作者,本文介紹了構建Java鏡像的五個小竅門,從而以超越基本概念和框架的方式開啟Docker容器之旅。

如果你是一個熱切期待在你的組織內部遷移到容器技術的企業級軟件開發人員,那么你會有更多的興趣來學習Docker背后的基礎概念以及圍繞Docker的常用的編排框架。在本文中,我將就這些基本概念進行擴展并提供一些簡單而使用的小竅門來構建你的第一個使用Java編程語言的Docker鏡像。

選擇一個小的基礎JDK鏡像

Docker鏡像是通過從Dockerfile讀取指令來構建的,在這里你可以發現構建你的第一個鏡像的基礎指令。

在應用程序中一個常見的包含了JDK的基礎鏡像是默認的openjdk:latest鏡像,這是基于Debian操作系統構建的。該鏡像的大小是640.9MB,可以通過運行鏡像看到JDK版本:

docker run -it openjdk java -version

如果你想使用Oracle JDK,那么 正常理由 Docker Hub上是沒有可用的官方Docker鏡像的,所以,你需要下載 Oracle JDK 并打包到鏡像里。在 https://github.com/arun-gupta/ ... e-jdk 上有一個可用的簡單的展示如何打包Oracle JDK的Dockerfile,以這種方式構建的鏡像是536.3MB。

Alpine Linux 是基于 musl libcBusyBox 構建的精簡的Linux發行版,Docker Hub上有基于Alpine的OpenJDK鏡像,可以以openjdk:alpine下載,這個鏡像的大小是144.9MB,這是不到默認的openjdk:latest鏡像大小的25%。

為什么說更小的鏡像體積很重要呢?這與磁盤空間沒有關系,而是一旦容器在不同的宿主機上啟動并且鏡像需要通過網絡下載,那么鏡像大小就變得至關重要了。一個更大的鏡像也就意味著需要更高的延遲來啟動鏡像。

同樣的,openjdk:8-jre是309MB,而openjdk:8-jre-alpine是107.8MB。

這里我還想提供一些建議。確保選擇JDK或者JRE哪一個是合適的基礎鏡像,這會讓你的鏡像變小。為了進一步減少體積,你也許可以考慮使用基于Alpine的鏡像而不是默認的基于Debian的鏡像。如果你想要一個商業版本支持的JDK,那么你也許需要構建你自己的鏡像。下面會討論該鏡像需要的底層操作系統。

選擇最佳的底層操作系統

通常是從一個底層的操作系統來開始構建一個Docker鏡像的,也就是Dockerfile的FROM指令提及的。在某些情況下,你也許會從一個已有的基礎鏡像開始,這時你已經選擇了底層操作系統鏡像。但是如果你需要選擇一個底層操作系統鏡像,那么常用的鏡像和對應的大小如下所示:

  • Ubuntu:127.2MB
  • CentOS:196.8MB
  • Debian:123MB
  • Alpine:4.803MB
  • BusyBox:1.093MB

仔細選擇你的底層操作系統,因為它將添加到您的鏡像里,確保將操作系統更新到發行包的最新版本,同樣也包括依賴項。

在某些情況下,您可能需要選擇一個商業支持的操作系統。比如Red Hat Enterprise Linux或者Windows Server 2016。這些通常是由供應商提供的。

清理構建上下文

Docker CLI是由給定一個目錄或者URL作為構建上下文的,在鏡像構建之前會將該上下文發送到Docker Daemon。建議在一個新的目錄里創建Dockerfile,然后在該目錄里只添加鏡像包含的文件。這為docker build命令提供了一個更加清潔的上下文并且允許更快地構建鏡像。否則,掃描帶有多個文件的目錄將不必要地減慢構建速度。

如果無法創建一個新目錄或者執行命令的目錄里存在著其他文件,那么可以考慮.dockerignore文件,該文件的語法類似于.gitignore文件,允許您從構建中排除一些文件和目錄。舉例來說,如果Dockerfile放在了Maven工程的根目錄里,那么該文件是需要的。然后這個文件可以用來從target目錄里指定生成的特定組件。

創建你自己的鏡像

你經常需要創建一個鏡像,在這里基礎鏡像會啟動一個組件然后你的鏡像將對其作配置。舉例來說,jboss/wildfly基礎鏡像將會啟動WildFly應用服務器,然后你的鏡像會在其中創建一些JDBC資源。另外一個例子就是couchbase鏡像啟動了Couchbase服務器,在這種情況下,數據庫需要對于內存配額、管理憑證和其它選項進行手動配置。一個新的提供了預配置的Couchbase服務器的Docker鏡像是非常實用的,這個已經在couchbase/server:sandbox鏡像里實現了,該鏡像使用了couchbase作為基礎鏡像,它使用了Couchbase Restful API來配置數據庫,正如在Dockerfile中說明的。

調試鏡像文件系統陳列

你可能還需要查看容器內的文件系統是如何陳列的,這將主要用于調試目的。

如果容器正在運行,那么你可以使用如下命令來attach到鏡像文件系統:

docker exec -it {cid} bash

如果容器沒有運行,那么可以使用下面的命令:

docker run -it <image> bash

在這兩種情況下,將會使用鏡像的文件系統來打開一個Bash Shell,如果需要的話,這會允許你深入容器/鏡像文件系統并進行必要的更新。

你是否已經準備好容器化你的第一個Java應用了呢?我的新書 《Docker for Java Developer》 ,解釋了如何使用Docker打包、部署和擴展應用,此外,Github上的Docker for Java Developers教程提供了一個自學及動手實驗來構建你的第一個Java應用程序。

原文鏈接: 5 simple tips for building your first Docker image with Java (翻譯:胡震)

 

來自:http://dockone.io/article/2039

 

 本文由用戶 wtyo7694 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!