【開源容器】Docker-slim介紹
如果擔心Docker鏡像的大小,docker-slim將會解決您的擔憂。該工具使用靜態和動態分析將大鏡像轉變為縮略的鏡像。
1.功能介紹
靜態分析:主要是獲取鏡像歷史信息,追蹤到生成鏡像的dockerfile文件,以及設置的port、cmd、enterpoint等數據。
動態分析:主要是通過內核工具ptrace(跟蹤系統調用)、pevent(跟蹤文件或目錄的變化)、fanotify(跟蹤進程)解析出鏡像中必要的文件和文件依賴,將對應文件組織成新鏡像。
2.環境安裝
要使用docker-slim,您必須從Github下載其二進位文件。二進位文件可用於Linux和Mac。下載二進位文件後,將其添加到環境變數PATH中。
[root@tfg-104 bin]# ll /usr/bin/docker-slim*
-rwxrw-rw- 1 root root 9397945 Oct 9 2016 /usr/bin/docker-slim
-rwxrw-rw- 1 root root 4258571 Oct 9 2016 /usr/bin/docker-slim-sensor
[root@tfg-104 bin]#
3.使用說明
Docker-slim主要提供的功能就是製作瘦身鏡像
[root@tfg-104 bin]# docker-slim --help
COMMANDS:
info, i Collects fat image information and reverse engineers its Dockerfile
build, b Collects fat image information and builds a slim image from it
profile, p Collects fat image information and generates a fat container report
info 收集原鏡像信息,並組織其dockerfile生成文件;
build 收集原鏡像信息,生成slim鏡像,一般以鏡像名.slim命令;
Profile 收集原鏡像信息,並生成對原鏡像的分析報告,包含syscall控制和process控制。
4.使用舉例
使用在DockerHub中的ubuntu鏡像,下面所看到的鏡像的大小是130MB。
[root@tfg-104 bin]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 0ef2e08ed3fa 4 months ago 130 MB
讓我們用docker-slim來看看它可以去除多少多餘的東西。
[root@tfg-104 bin]# docker-slim build --http-probe ubuntu
docker-slim實用程序將執行一系列步驟 -檢查、分析較大的鏡像,最終創建一個縮略版本的鏡像。
[root@tfg-104 bin]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu.slim latest db837f1d9f13 23 hours ago 3.48 MB
ubuntu latest 0ef2e08ed3fa 4 months ago 130 MB
5.syscall與process控制
5.1、docker&seccomp
我們需要對容器當中能夠運行的具體負載進行控制。這時就需要依靠seccomp了。所謂seccomp,其實就是安全計算模式的縮寫。它允許對系統調用進行篩選,這樣我們就能夠為應用程序定義其需要的系統調用,並拒絕其它一切不必要的調用行為。
seccomp profile包含3個部分
1)默認操作(default Action)
2)系統調用所支持的Linux架構(architectures)
3)系統調用具體規則(syscalls)
在seccomp profile規則中,可定義以下5種行為對進程的系統調用行為做出響應
1) SCMP_ACT_KILL. 當進程調用某系統調用,內核會發出SIGSYS信息終止該進程,該進程不會接收到這個信號
2) SCMP_ACT_TRAP. 當進程調用某系統調用,該進程會接收到SIGSYS信號,並根據該信號改變自身的行為
3) SCMP_ACT_ERRNO. 當進程調用某系統調用,系統調用失敗,進程會接收到返回值,該返回值與Linux內核的errno對應
4) SCMP_ACT_TRACE. 當進程調用某系統調用,進程會被追蹤
5) SCMP_ACT_ALLOW. 進程系統調用會被允許
使用seccomp profile
默認情況下,Docker運行容器時會使用默認的seccomp profile,可將unconfined傳入docker run的security-opt seccomp選項,禁用默認的seccomp profile
# docker run --rm -it --security-opt seccomp:unconfined busybox
如果使用特定的seccomp profile,執行以下命令
# docker run --rm -it --security-opt seccomp:/path/to/seccomp/profile.json busybox
實例使用
下面例舉一個簡短的socket.json實 例:
{
"defaultAction": "SCMP_ACT_ALLOW",
"syscalls": [
{
"name": "socket",
"action": "SCMP_ACT_ERRNO"
}]
}
其運行結果將如下所示:
# docker run -ti --rm --security-opt seccomp:tcpsocket.json Ubuntu bash
容器內運行nc -l 555,結果為nc: Operation not permitted,表明socket訪問失敗。
5.2、docker&AppArmor
通過使用AppArmor實現強制性的訪問控制(MAC)一套有限的系統資源的限制進程,如果先前已經安裝和配置過SELinux,那麼它可以使用setenforce 1在容器中被激活。Docker程序的SELinux支持是默認無效的,並且需要使用—selinux功能來被激活。通過使用新增的—security- opt來載入SELinux或者AppArmor的策略對容器的標籤限制進行配置。該配置文件可以被用於運行Docker容器,且採用與之前相同的語法:
#docker run -d --security-opt=」apparmor:name_of_profile」 -p 80:80 ngnix
作者簡介
馮聖琴,中興通訊軟體開發工程師,對openstack開源項目、虛擬化和容器技術等感興趣。
中興通訊
雲開源
為您打開雲開源世界的大門!
TAG:雲開源 |