容器簡史

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=[]: 開放一個端口或一組端口;


















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章