docker簡介
Docker 是使用 Google 推出的 Go語言 進行開發(fā)的,基于 Linux 內核的 cgroup辅鲸、namespace和 AUFS類的 Union FS 等技術匙瘪,對進程進行了封裝隔離乌庶,屬于操作系統(tǒng)層面的虛擬化技術
- AUFS(chroot) – 用來建立不同的操作系統(tǒng)和隔離運行時的硬盤空間
- Namespace – 用一系列namespace來隔離Container的執(zhí)行空間
- pid namespace: 用于進程的隔離(PID: Process ID)
- net namespace: 用于管理網絡接口x(NET: Networking)
- ipc namespace: 用于管理進程間通訊(IPC: Inter Process Communication)
- mnt namespace: 用于管理Mount點(MNT: Mount)
- uts namespace: 用于隔離內核和版本信息(UTS: Unix Timesharing System)
- Cgroup – 分配不同的硬件資源
- SELinux – 用來保護linux的網絡安全
- Netlink – 用來讓不同的Container之間的進程保持通信
- Netfilter – 建立Container為基礎的網絡防火墻過濾
- Linux Bridge – 讓不同Container或不同主機上的Container能通
傳統(tǒng)虛擬化技術
我們在創(chuàng)建的虛擬機的時候怔毛,會先選擇一個系統(tǒng)源和一套虛擬的硬件果元,然后這些軟件就會自助地幫我們創(chuàng)建該系統(tǒng)促王。傳統(tǒng)虛擬化技術是先虛擬出了一套硬件系統(tǒng),然后在此硬件系統(tǒng)上而晒,運行了一個完整的操作系統(tǒng)蝇狼,然后就可以使用各類軟件、進程了倡怎。其實和我們的真實的電腦上操作的流程是差不多的
docker
Docker 則不需要虛擬這樣一套硬件系統(tǒng)迅耘,也不需要一個完整的操作系統(tǒng)。它將容器中的應用程序直接運行與宿主機的內核监署,容器沒有自己的內核
docker的組成
鏡像
我們都知道颤专,操作系統(tǒng)分為 內核和用戶空間,在 Linux 中焦匈,內核在啟動后血公,會通過 Root 文件系統(tǒng) 給操作系統(tǒng)提供了用戶空間的支持。而在 Docker 中缓熟,它的內核直接借助了宿主機的內核,為了讓其內核和用戶空間相互通訊作用摔笤,就必須要一個 Root 文件系統(tǒng) 來完成這個功能够滑,而鏡像就是相當于這個 Root 文件系統(tǒng)
鏡像組成
鏡像是一個特殊的文件系統(tǒng)。除了提供容器運行時所需的程序吕世、庫彰触、資料和配置等文件外,還包括了一些為運行時準備的一些配置參數(shù)(如匿名卷命辖、環(huán)境變量况毅、用戶等)分蓖。
值得注意的是:鏡像不包含任何動態(tài)數(shù)據,鏡像里的內容在構建之后也不會改變尔许∶春祝可以把鏡像和面向對象編程中的類的概念進行類比,類一旦定義寫好之后味廊,在使用期間其內容不會發(fā)生變化蒸甜,鏡像也是。
分層存儲
鏡像是一個虛擬的概念余佛,是由一組文件系統(tǒng)組成的(也可以說是由多層文件系統(tǒng)組成)柠新。因為鏡像包含操作系統(tǒng)的完整的 Root 文件系統(tǒng),所以Dcoker 在設計鏡像的時候辉巡,為了減小其體積恨憎,充分利用了 Union FS 技術,將其設計為分層存儲的架構郊楣。
鏡像在構建時框咙,會一層一層地構建,后一層是在前一層的基礎上構建而成的痢甘。每一層在構建完后就不會再發(fā)生改變喇嘱,任何一層都只能在自己這一層上發(fā)生改變,也就說后一層對前一層的操作不會使前一層真的發(fā)生變化塞栅。
舉個例子:后一層進行了刪除前一層的文件的操作者铜,但是事實上,前一層的文件并沒有被真的刪除了放椰,該文件只是在后一層上被標記為已刪除作烟。在容器運行的時候,雖然不會看到這個文件砾医,但是事實上該文件會一直跟隨鏡像拿撩。
因此,在構建鏡像的時候如蚜,我們要非常小心压恒,每一層盡可能的只包含該層所需的東西(資源和操作等),任何額外的東西都要在該層構建結束之前清理掉错邦。
分層存儲的優(yōu)勢
雖然鏡像的分層存儲架構看起來很麻煩探赫,但是事實上分層存儲架構的好處是非常巨大的,它不僅減小了鏡像的體積撬呢,還使得鏡像的復用伦吠、定制變得更為容易。
我們可以使用之前構建好的鏡像作為基礎層,然后添加一個新層毛仪,以定制自所需的內容搁嗓,構建出新的鏡像
容器
上面我們在容器技術那里說到 應用程序/進程就是貨物(散件),容器就是集裝箱箱靴。事實上腺逛,當我們運行容器的時候,我們運行的是容器里的進程刨晴。
需要注意的是:容器進程與直接在宿主執(zhí)行的進程不同屉来,容器運行于屬于自己的獨立的命名空間,所以容器可以擁有自己的 Root 文件系統(tǒng)狈癞、網絡配置茄靠、進程空間和用戶ID空間。
容器內的進程運行于一個隔離的環(huán)境里蝶桶,使用起來就像是在一個獨立于宿主的操作系統(tǒng)一樣
容器存儲
容器和鏡像一樣都是使用分層存儲的慨绳,但是又稍有不同,在容器運行時真竖,它是以鏡像為基礎層脐雪,然后在此基礎上在創(chuàng)建一個屬于該容器的存儲層。
我們一般稱 這個為容器運行時讀寫而準備的存儲層為容器存儲層恢共。
容器存儲層的生命周期和容器一樣战秋,它隨著容器的創(chuàng)建而創(chuàng)建,隨著容器的消亡而消亡讨韭。任何保存在容器存儲層的信息都會容器的消亡而丟失脂信。所以我們不應該把數(shù)據寫入容器存儲層,所有的文件寫入操作透硝,都應該使用 數(shù)據卷(Volume)或者綁定宿主目錄狰闪。
數(shù)據卷與容器存儲層不同,它的生命周期獨立于容器
Docker Registry 與 倉庫
公開Registry
Docker Registry 公開服務是開放給用戶使用濒生、允許用戶管理鏡像的 Registry 服務埋泵。一般這類公開服務允許用戶免費上傳、下載公開的鏡像罪治,并可能提供收費服務 供用戶管理私有鏡像
私有Registry
除了使用公開服務外丽声,用戶還可以在本地搭建私有 Docker Registry。Docker 官方 提供了 Docker Registry 鏡像规阀,可以直接使用做為私有 Registry 服務恒序。
除了官方的 Docker Registry 外,還有第三方軟件實現(xiàn)了 Docker Registry API谁撼,甚 至提供了用戶界面以及一些高級功能。比如,VMWare Harbor 和 Sonatype Nexus厉碟。
docker基礎操作
- 獲取鏡像
docker pull <倉庫名>:<標簽>
2.列出鏡像
docker images
3.運行鏡像
docker run [options] repository:tag
- -d:后臺運行容器并返回容器id
- -i:以交互模式運行
- -t:為容器分配一個偽終端
- --name:為容器指定一個名字
- -e:設置環(huán)境變量
- --env-file:從指定文件讀取環(huán)境變量
- --net:指定容器網絡連接類型( bridge/host/none/container)
- -p:端口映射(主機:容器)
- 進入容器
docker exec [options] <container> <cmd>
- -it 以終端交互方式進入容器
- -d 后臺運行命令喊巍,立即返回執(zhí)行結果
- 停止/啟動容器
docker stop
docker start
6.查看容器
docker ps
7.導入和導出
docker export <containerId> > path/name.tar 將容器導出成一個tar( 是一個容器的快照)
docker import <path/url> name 將一個容器快照在倒回為鏡像
8.刪除鏡像
docker rmi
9.刪除容器
docker rm