Docker 工作原理及容器化簡易指南

Docker 非常棒喉悴! 它使軟件開發(fā)者無需擔心配置和依賴性拧烦,在任何地方打包冻河,發(fā)送和運行他們的應用程序。而在與 Kubernetes 相結(jié)合后棒动,它使應用集群部署和管理變得更方便糙申。這使得 Docker 深受軟件開發(fā)者的喜愛,越來越多的開發(fā)者開始使用 Docker船惨。

那么 Docker 到底是什么柜裸?

它是構(gòu)建、測試粱锐、部署和發(fā)布容器化應用的平臺疙挺。稱其為平臺是因為 Docker 其實是一套用于管理與容器相關的所有事物的工具。作為 Docker 的核心怜浅,接下來我們將深入探討容器衔统。

什么是容器?

容器提供了在計算機上的隔離環(huán)境中安裝和運行應用程序的方法海雪。在容器內(nèi)運行的應用程序僅可使用于為該容器分配的資源,例如:CPU舱殿,內(nèi)存奥裸,磁盤,進程空間沪袭,用戶湾宙,網(wǎng)絡樟氢,卷等。在使用有限的容器資源的同時侠鳄,并不與其他容器沖突埠啃。您可以將容器視為簡易計算機上運行應用程序的隔離沙箱。

這個概念聽起來很熟悉伟恶,有些類似于虛擬機碴开。但它們有一個關鍵的區(qū)別:容器使用的一種非常不同的,輕量的技術來實現(xiàn)資源隔離博秫。容器利用了底層 Linux 內(nèi)核的功能潦牛,而不是虛擬機采用的 hypervisor 的方法。換句話說挡育,容器調(diào)用 Linux 命令來分配和隔離出一組資源巴碗,然后在此空間中運行您的應用程序。我們快速來看下兩個這樣的功能:

Namespaces

簡單的講就是即寒,Linux namespace 允許用戶在獨立進程之間隔離 CPU 等資源橡淆。進程的訪問權(quán)限及可見性僅限于其所在的 Namespaces 。因此母赵,用戶無需擔心在一個 Namespace 內(nèi)運行的進程與在另一個 Namespace 內(nèi)運行的進程沖突逸爵。甚至可以同一臺機器上的不同容器中運行具有相同 PID 的進程。同樣的市咽,兩個不同容器中的應用程序可以使用相同的端口痊银。

Cgroups

Cgroups 允許對可用資源設置限制和約束。例如施绎,您可以在一臺擁有 16 G 內(nèi)存的計算機上創(chuàng)建一個 Namespace 溯革,限制其內(nèi)部進程可用內(nèi)存為 1 GB。

到這谷醉,您可能已經(jīng)猜到 Docker 的工作原理了致稀。當您請求 Docker 運行容器時,Docker 會在您的計算機上設置一個資源隔離的環(huán)境俱尼。然后 Docker 會將打包的應用程序和關聯(lián)的文件復制到 Namespace 內(nèi)的文件系統(tǒng)中抖单,此時環(huán)境的配置就完成了。之后 Docker 會執(zhí)行您指定的命令運行應用程序遇八。

簡而言之矛绘,Docker 通過使用 Linux namespace 和 cgroup(以及其他一些命令)來協(xié)調(diào)配置容器,將應用程序文件復制到為容器分配的磁盤刃永,然后運行啟動命令货矮。Docker 還附帶了許多其他用于管理容器的工具,例如:列出正在運行的容器斯够,停止容器囚玫,發(fā)布容器鏡像等許多其他工具喧锦。

與虛擬機相比,容器更輕量且速度更快抓督,因為它利用了 Linux 底層操作系統(tǒng)在隔離的環(huán)境中運行燃少。虛擬機的 hypervisor 創(chuàng)建了一個非常牢固的邊界,以防止應用程序突破它铃在,而容器的邊界不那么強大阵具。另一個區(qū)別是,由于 Namespace 和 Cgroups 功能僅在 Linux 上可用涌穆,因此容器無法在其他操作系統(tǒng)上運行怔昨。此時您可能想知道 Docker 如何在 macOS 或 Windows 上運行? Docker 實際上使用了一個技巧宿稀,并在非 Linux 操作系統(tǒng)上安裝 Linux 虛擬機趁舀,然后在虛擬機內(nèi)運行容器。

讓我們利用目前為止學到的所有內(nèi)容祝沸,從頭開始創(chuàng)建和運行 Docker 容器矮烹。如果你還沒有將 Docker 安裝在你的機器上,可以參考這里[1]安裝 Docker罩锐。在這個示例中奉狈,我們將創(chuàng)建一個 Docker 容器,下載一個用 C語言寫的 Web 服務涩惑,編譯并運行它仁期,然后使用瀏覽器訪問這個 Web 服務。

我們將從所有 Docker 項目開始的地方從創(chuàng)建一個 Dockerfile 開始竭恬。此文件描述了如何創(chuàng)建用于運行容器的 Docker 鏡像跛蛋。既然我們還沒有聊到鏡像,那么讓我們看一下鏡像的官方定義[2]:

鏡像是一個可執(zhí)行包痊硕,其包含運行應用程序所需的代碼赊级、運行時、庫岔绸、環(huán)境變量和配置文件理逊,容器是鏡像的運行時實例。

簡單的講盒揉,當你要求 Docker 運行一個容器時晋被,你必須給它一個包含如下內(nèi)容的鏡像:

  • 包含應用程序及其所有依賴的文件系統(tǒng)快照。
  • 容器啟動時的運行命令刚盈。

在 Docker 的世界墨微,使用別人的鏡像作為基礎鏡像來創(chuàng)建自己的鏡像是十分普遍的。例如扁掸,官方 reds Docker 鏡像就是基于 Debian 文件系統(tǒng)快照(rootfs tarball)翘县,并安裝在其上配置 Redis。

在我們的示例中谴分,我們選擇 Alpine Linux 為基礎鏡像锈麸。當您在 Docker 中看到 “alpine” 時,它通常意味著一個精簡的基本鏡像牺蹄。 Alpine Linux 鏡像大小只有約為5 MB忘伞!

在您的計算機創(chuàng)建一個新目錄(例如 dockerprj),然后新建一個 Dockerfile 文件沙兰。

umermansoor:dockerprj$ touch Dockerfile

將如下內(nèi)容粘貼到 Dockerfile:

# Use Alpine Linux rootfs tarball to base our image on
FROM alpine:3.9 

# Set the working directory to be '/home'
WORKDIR '/home'

# Setup our application on container's file system
RUN wget http://www.cs.cmu.edu/afs/cs/academic/class/15213-00/www/class28/tiny.c \
&& apk add build-base \
&& gcc tiny.c -o tiny \
&& echo 'Hello World' >> index.html

# Start the web server. This is container's entry point
CMD ["./tiny", "8082"]

# Expose port 8082
EXPOSE 8082

這個Dockerfile 包含創(chuàng)建鏡像的內(nèi)容說明氓奈。我們創(chuàng)建鏡像基于 Alpine Linux(rootfs tarball),并將工作目錄設置為 /home 鼎天。接下來下載舀奶,編譯并創(chuàng)建了一個用 C 編寫的簡單 Web 服務器的可執(zhí)行文件,然后指定在運行容器時要執(zhí)行的命令斋射,并將容器端口 8082 暴露給主機育勺。

現(xiàn)在,我們就可以構(gòu)建鏡像了罗岖。在 Dockerfile 的同級目錄運行 docker build 命令:

umermansoor:dockerprj$ docker build -t codeahoydocker .

如果這個命令成功了涧至,您將看到:

Successfully tagged codeahoydocker:latest

此時我們的鏡像就創(chuàng)建成功了,該鏡像主要包括:

  • 文件系統(tǒng)快照(Alpine Linux 和 我們安裝的 Web 服務)
  • 啟動命令(./tiny 8092)

既然成功構(gòu)建了鏡像桑包,那么我們可以使用如下命令運行容器南蓬。

umermansoor:dockerprj$ docker run -p 8082:8082 codeahoydocker:latest

讓我們了解下這里發(fā)生了什么。

通過 docker run 命令哑了,我們請求 Docker 基于 codeahoydocker:latest 鏡像創(chuàng)建和啟動一個容器赘方。-p 8082:8082 將本地的 8082 端口映射到容器的 8082 端口(容器內(nèi)的 Web 服務器正在監(jiān)聽 8082 端口上的連接)。打開你的瀏覽器并訪問 localhost:8082/index.html 垒手。你將可以看到 Hello World 信息蒜焊。

最后我想補充一點,雖然 Docker 非常棒科贬,而且對于大多數(shù)項目來說它是一個不錯的選擇泳梆,但我們并非處處都要使用它。在我的工作中榜掌,Docker 與 Kubernetes 結(jié)合使用优妙,可以非常輕松地部署和管理后端微服務,我們不必為每個服務配置新的運行環(huán)境憎账。另一方面套硼,對于性能密集型應用程序,Docker 可能不是最佳選擇胞皱。我經(jīng)手的其中一個項目必須處理來自移動游戲客戶端的 TCP 長連接(每臺機器1000個)邪意,這時 Docker 網(wǎng)絡出現(xiàn)了很多問題九妈,導致無法將它用于該項目。

寫在最后

點關注雾鬼,不迷路萌朱;Java蘇先生每天更新Java相關技術及資訊文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市策菜,隨后出現(xiàn)的幾起案子晶疼,更是在濱河造成了極大的恐慌,老刑警劉巖又憨,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠霍,死亡現(xiàn)場離奇詭異,居然都是意外死亡蠢莺,警方通過查閱死者的電腦和手機寒匙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪秘,“玉大人蒋情,你說我怎么就攤上這事∷市” “怎么了棵癣?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夺衍。 經(jīng)常有香客問我狈谊,道長,這世上最難降的妖魔是什么沟沙? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任河劝,我火速辦了婚禮,結(jié)果婚禮上矛紫,老公的妹妹穿的比我還像新娘赎瞎。我一直安慰自己,他們只是感情好颊咬,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布务甥。 她就那樣靜靜地躺著,像睡著了一般喳篇。 火紅的嫁衣襯著肌膚如雪敞临。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天麸澜,我揣著相機與錄音挺尿,去河邊找鬼。 笑死,一個胖子當著我的面吹牛编矾,可吹牛的內(nèi)容都是我干的熟史。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窄俏,長吁一口氣:“原來是場噩夢啊……” “哼以故!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起裆操,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炉媒,沒想到半個月后踪区,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吊骤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年缎岗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片白粉。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡传泊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸭巴,到底是詐尸還是另有隱情眷细,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布鹃祖,位于F島的核電站溪椎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏恬口。R本人自食惡果不足惜校读,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祖能。 院中可真熱鬧歉秫,春花似錦、人聲如沸养铸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揭厚。三九已至却特,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筛圆,已是汗流浹背裂明。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闽晦。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓扳碍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仙蛉。 傳聞我的和親對象是個殘疾皇子笋敞,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一、Docker 簡介 Docker 兩個主要部件:Docker: 開源的容器虛擬化平臺Docker Hub: 用...
    R_X閱讀 4,386評論 0 27
  • Docker容器技術已經(jīng)發(fā)展了好些年荠瘪,在很多項目都有應用夯巷,線上運行也很穩(wěn)定。整理了部分Docker的學習筆記以及新...
    __七把刀__閱讀 11,450評論 0 58
  • 前言 在JAVA RESTful WebService實戰(zhàn)筆記(三)中已經(jīng)完成了對JAX-RS2定義的4中過濾器的...
    菜鳥_一枚閱讀 1,559評論 0 0
  • 2017/11/07 3峰隊 總共11人哀墓,已交 10人趁餐;未交0人;圍觀1人 007-1228|康遼遼 文章:一只有...
    etme閱讀 99評論 0 0
  • 很多男人不敢和女人聊天篮绰,怕沒話說女人覺得自己無聊后雷,又怕說錯話留下了不好的印象,其實哪里有那么難吠各,你們只是在聊天英妓,又...
    QuantumCC閱讀 638評論 0 6