概述
Docker 利用容器(Container)來運行應(yīng)用。容器是從鏡像創(chuàng)建的運行實例盛龄。它可以被啟動饰迹、開始、停止余舶、刪除啊鸭。每個容器都是相互隔離的、保證安全的平臺欧芽。
可以把容器看做是一個簡易版的 Linux 環(huán)境(包括root用戶權(quán)限莉掂、進(jìn)程空間葛圃、用戶空間和網(wǎng)絡(luò)空間等)和運行在其中的應(yīng)用程序千扔。通過鏡像運行得到容器后,會在鏡像上添加一層讀寫層库正,所有對于容器的修改都保存在這一層曲楚,所以容器的運行不會修改鏡像,同時保證可以利用同一個鏡像運行多個容器不會相互干擾褥符。
原理
Docker是如何做到把應(yīng)用所有的依賴項全部打包龙誊,將應(yīng)用運行在一個隔離的環(huán)境里面?先來看看一個應(yīng)用運行的整個生命周期的依賴是什么:
- 文件系統(tǒng)(進(jìn)程的代碼文件喷楣,配置文件趟大,運行中讀寫文件等信息)
- 權(quán)限(主要由用戶控制進(jìn)程的訪問權(quán)限)
- 進(jìn)程間通信(進(jìn)程之間的相互數(shù)據(jù)交互,常用信號量铣焊,消息隊列逊朽,共享內(nèi)存等)
- 網(wǎng)絡(luò)(進(jìn)程通過網(wǎng)絡(luò)進(jìn)行通信)
- 進(jìn)程樹(進(jìn)程啟動后,會形成進(jìn)程樹)
- 主機名和域名(進(jìn)程所在機器的主機名)
Linux如何做到以上的所有的資源的隔離曲伊?主要是利用Linux namespaces實現(xiàn)程序的隔離叽讳,包括
- mount namespace, 實現(xiàn)文件系統(tǒng)隔離
- user namespace 實現(xiàn)用戶隔離
- network namespace 實現(xiàn)隔離網(wǎng)絡(luò)設(shè)備坟募、網(wǎng)絡(luò)協(xié)議棧
- IPC namespace 實現(xiàn)進(jìn)程間交互的隔離
- pid namespace 實現(xiàn)進(jìn)程樹的隔離
- uts namespace 實現(xiàn)主機名和域名的隔離