天天看點

容器簡史

1979年 — UnixV7 Chroot

1979 AT&T的貝爾實驗室釋出了著名的Unix System Version7,為了解決不統一的ABI(應用二進制接口)軟體的相容問題,引入了chroot指令,他将Root目錄及其它子目錄變更至檔案系統内的新位置,且隻接受特定程序的通路,為每個程序提供一套隔離化磁盤空間。1982年 sun公司的創始人Bill Joy年将其添加至BSD,并在BSD中解決了chroot的安全漏洞,此後許多人基于chroot開發了基礎的隔離程式.

2000年 — FreeBSD Jails

FreeBSD Jails與Chroot的定位類似,不過其中包含有程序沙箱機制以對檔案系統、使用者及網絡等資源進行隔離。通過這種方式,它能夠為每個Jail、定制化軟體安裝包乃至配置方案等提供一個對應的IP位址。Jails技術為FreeBSD系統提供了一種簡單的安全隔離機制。它的不足在于這種簡單性的隔離也同時會影響Jails中應用通路系統資源的靈活性。

2004年 — Solaris Zones

Solaris Zone技術為應用程式建立了虛拟的一層,讓應用在隔離的Zone中運作,并實作有效的資源管理。每一個Zone 擁有自己的檔案系統,程序空間,防火牆,網絡配置等等。Solaris Zone技術真正的引入了容器資源管理的概念。在應用部署的時候為Zone配置一定的資源,在運作中可以根據Zone的負載動态修改這個資源限制并且是實時生效的,在其他Zone不需要資源的時候,資源會自動切換給需要的資源的Zone,這種切換是即時的不需要人工幹預的,最大化資源的使用率,在必要的情況下,也可以為單個Zone隔離一定的資源。

2001-2007年 — LXC

2001年,通過 Jacques Gélinas 的 VServer 項目,隔離環境的實施進入了 Linux 領域.Google Paul Menage基于之前的容器基礎,開發出cgroup技術,并于2007合入linux 2.6.24核心,進而衍生出LXC-Linux Containers,其功能通過Cgroups以及Linux Namespaces實作。也是第一套完整的Linux容器管理實作方案。在LXC出現之前, Linux上已經有了類似 Linux-Vserver、OpenVZ 和 FreeVPS。雖然這些技術都已經成熟,但是這些解決方案還沒有将它們的容器支援內建到主流 Linux 核心。相較于其它容器技術,LXC能夠在無需任何額外更新檔的前提下運作在原版Linux核心之上。目前LXC項目由Canonical有限公司負責贊助及托管。LXC采用以下核心功能子產品:

Kernel namespaces (ipc, uts, mount, pid, network and user)

Apparmor and SELinux profiles

Seccomp policies

Chroots (using pivot_root)

Kernel capabilities

CGroups (control groups)

2013年 — Docker

Docker項目最初是由一家名為DotCloud的平台即服務廠商所打造,其後該公司更名為Docker。Docker 在1.8以前直接使用Linux Containers (LXC),而後自己抽象出Libcontainer層,支援多種容器技術,預設采用LXC實作。與其它容器平台不同,Docker引入了一整套與容器管理相關的生态系統。其中包括一套高效的分層式容器鏡像模型、一套全局及本地容器系統資料庫、一個精簡化REST API以及一套指令行界面等等。

擴充閱讀:靜态的檔案叫image,docker run跑起來了叫容器1. docker常用指令

a. 準備Dockerfile [Docker之Dockerfile文法詳解]

b. 建構鏡像: docker build -t 鏡像名稱:版本 Dockerfile目錄 如:

#Dockerfile在目前目錄,是以最後用點号表示Dockerfile路徑docker build -t base-jdk:8 .

c. 拉取鏡像: docker pull 鏡像名:版本

#不加版本後預設為latestdocker pull nginx

d. 運作鏡像: docker run 鏡像名:版本

#不加版本後預設為latestdocker run nginx#帶自動重新開機 映射外網 端口 挂載主機目錄的指令docker run --restart=always --privileged -p 9095:500/udp -v /etc/nginx/:/etc/nginx/conf -d nginx

e. 檢視本機所有的所有容器: docker ps 傳回的第一列為容器IDf. 檢視容器日志: docker logs -f 容器ID(通過docker ps檢視)g. 連接配接到容器執行指令: docker exec -ti 容器ID /bin/bash (如果是alpine,則為:/bin/sh)h. 檢視容器的完整資訊: docker inspect 容器IDi. 其他不常用指令: docker system prune(清空未使用的鏡像、建構過程中産生的中間鏡像層、已運作完的容器資訊

j. 完整的docker run參數

-a: 指定标準輸入輸出内容類型,可選 STDIN/STDOUT/STDERR 三項;

-d: 背景運作容器,并傳回容器ID;

-i: 以互動模式運作容器,通常與 -t 同時使用;

-p: 端口映射,格式為:主機(宿主)端口:容器端口

-t: 為容器重新配置設定一個僞輸入終端,通常與 -i 同時使用;

--name="nginx-lb": 為容器指定一個名稱;

--dns 8.8.8.8: 指定容器使用的DNS伺服器,預設和宿主一緻;

--dns-search Example Domain: 指定容器DNS搜尋域名,預設和宿主一緻;

-h "mars": 指定容器的hostname;

-e username="ritchie": 設定環境變量;

--env-file=[]: 從指定檔案讀入環境變量;

--cpuset="0-2" or --cpuset="0,1,2": 綁定容器到指定CPU運作;

-m :設定容器使用記憶體最大值;

--net="bridge": 指定容器網絡連接配接類型,支援 bridge/host/none/container: 四種類型;

--link=[]: 添加連結到另一個容器;

--expose=[]: 開放一個端口或一組端口;

繼續閱讀