我第壹次用Docker的時候,大家都在說它有多好用,它的內部機制有多好,它為我們節省了多少時間。但是我壹用就發現幾乎所有的圖片都臃腫不安全(不使用包簽名,就盲目相信上遊的圖片庫是
| sh & lt/code & gt;而且,沒有壹個鏡像能夠實現Docker的初衷:隔離、單壹進程、易分發、簡單。
Docker image最初並不是為了取代復雜的虛擬機而設計的,它擁有完整的日誌、監控、報警和資源管理模塊。另壹方面,Docker傾向於利用內核的
在物理機器環境中,壹旦內核被初始化,
這就是為什麽當妳在Dockerfile
現在請檢查您的流程列表並使用
如何開始?
現在的應用大多是大型復雜系統,通常需要很多依賴庫,比如調度、編譯等很多相關的工具應用。它們的架構通常封裝得很好,底層細節隱藏在抽象層和接口中。某種程度上,這也是壹個容器,但從系統架構的角度,我們需要壹個比之前的虛擬環境更簡單的解決方案。
以Java為例。
從頭開始,想想妳要構建壹個最通用的基本容器,想想妳的應用程序本身,它需要運行什麽?
有很多種可能。如果妳想運行壹個Java應用程序,它需要壹個Java運行時。如果妳運行壹個Rails應用程序,它需要壹個Ruby解釋器,Python應用程序也是如此。Go和其他壹些編譯語言有點不同,下面我會提到。
在Java示例中,下壹步是考慮:JRE需要運行哪些依賴項?因為它是讓應用程序運行的最重要的組件,自然下壹步就是弄清楚JRE依賴於什麽。
其實JRE並沒有太大的依賴性。它原本是操作系統的壹個抽象層,使得代碼獨立於主機系統運行,所以安裝JRE的時候就基本準備好了。
(其實操作系統的獨立性並不是理所當然的。有許多特定於系統的API和專有系統擴展,但是為了舉例,我們將把重點放在簡單的情況上。)
在Linux上,JVM主要調用系統的C語言庫,Oracle的官方JRE使用的是libc,也就是說如果要運行任何Java程序,都需要先安裝glibc。另外,妳可能需要某種shell來管理環境,有壹個接口來和外界交流,比如網絡和資源的接口。
讓我們總結壹下Java應用程序示例所需的最低配置:
在示例中,我們使用Oracle JRE。
Glibc,JRE依賴
基本環境(包括網絡、內存、文件系統和其他資源管理工具)
#走進阿爾卑斯Linux ##
Alpine Linux最近受到了很多關註,主要是因為它封裝了壹系列已經驗證的可信依賴項,並且依然保持了2MB的體積!在本文發布時,其他鏡像發行版如下:
Ubuntu:最新:66MB(瘦了不少,之前的壹些版本超過了600MB)
Debian:最新:55MB(同上,壹開始是200多MB)
arch:最新:145MB
Busybox:最新:676KB(對!KB,我以後再討論)
Alpine:最新:2MB (2MB,帶包管理工具的Linux系統)
** Busybox是最小的競爭對手?**
從上面的對比可以看出,唯壹能在大小上打敗Alpine Linux的是Busybox,所以現在幾乎所有的嵌入式系統都在用它,它被應用到路由器,交換機,ATM,或者妳的烤面包機。作為最基本的環境,它提供了壹個易於維護的shell接口。
網上有很多文章解釋了為什麽人們選擇Alpine Linux而不是Busybox。我在這裏總結壹下:
開放而活躍的軟件包倉庫:Alpine
Linux使用apk包管理工具,集成在Docker鏡像中,而Busybox需要安裝另壹個包管理器,比如opkg。更重要的是,妳需要找到穩定的包倉貨源(這種貨源幾乎沒有)。Alpine的包倉庫提供了大量常用的依賴包。比如,如果還需要在容器中編譯nodejs或者ruby之類的代碼,可以直接運行apk添加NodeJS和Ruby。
體積確實很重要,但是當妳在功能性、靈活性、易用性和1.5MB之間衡量的時候,體積就沒那麽重要了。Alpine上增加的包大大增強了這些方面。
廣泛支持:Docker已經聘請了Alpine Linux的作者進行維護,未來所有官方鏡像都將基於Alpine Linux構建。沒有更有說服力的理由讓妳在自己的容器中使用它。
雲曦cSphere很早就意識到鏡像日益嚴重的問題,所以在去年推出了微鏡像,這也是為了指導大家如何更好地構建和理解鏡像。鏡像只是壹種軟件包格式。
* *構建基於Java環境映像* *
正如我剛才解釋的,在構建自己的映像時,Alpine Linux是壹個不錯的選擇,因此我們將在這裏使用它來構建壹個簡單高效的Docker映像。我們開始吧!
組合:阿爾卑斯+bash
每個Dockerfile的第壹條指令是指定它的父容器,在我們的例子中,它通常用於繼承
噓
來自阿爾卑斯山:最新
維護者docker@csphere.cn
我們還聲明誰對該圖像負責,並且該信息對於上傳到Docker Hub的圖像是必要的。
這樣,妳接下來的操作就有了基礎。接下來,安裝我們選擇的shell並添加以下命令:
噓
運行apk add-no-cache-update-cache bash
CMD ["/bin/bash"]
最終的docker文件如下所示:
``噓
來自阿爾卑斯山:最新
維護者cSphere & ltdocker@csphere.cn & gt;
運行apk add-no-cache-update-cache bash
CMD ["/bin/bash"]
```
好了,現在讓我們來構建容器:
噓
$ docker build-t my-Java-base-image。
將構建上下文發送到Docker守護程序2.048 kB
步驟1:來自阿爾卑斯山:最新
-& gt;2314ad3eeb90
第二步:維護者CSP here docker@csphere.cn
-& gt;在63433312d77e中運行
-& gt;bfe94713797a
拆卸中間容器63433312d77e
...省略幾行
第四步:CMD /bin/bash
-& gt;在d2291684b797中運行
-& gt;ecc443d68f27
拆卸中間容器d2291684b797
成功構建ecc443d68f27
並運行它:
噓
$ docker run-RM-ti my-Java-base-image
bash-4.3#