古詩詞大全網 - 藝術簽名 - 如何創建安全的Docker基礎映像

如何創建安全的Docker基礎映像

# #背景# #

我第壹次用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#