使用 Docker 構(gòu)建一個容器應(yīng)用(一)

Docker 是一個可以將應(yīng)用容器化的工具露氮,可以簡單的把容器理解為一個和羽毛一樣輕的虛擬機止后,和傳統(tǒng)的虛擬機不同,它并不會給系統(tǒng)帶來太大的負擔盐股,并且有更高的可移植性和擴展性。在容器中應(yīng)用將享有獨立的文件系統(tǒng)耻卡,容器內(nèi)的操作將不會影響到自身的主機系統(tǒng)疯汁,有點類似于三體中的小宇宙空間,在里面可以有高度的自由操作空間卵酪,并且已經(jīng)預(yù)設(shè)了你喜歡的裝修風(fēng)格(應(yīng)用運行所需的環(huán)境)幌蚊!

我們將使用 Docker 來搭建一個最簡單的 Node 容器化應(yīng)用,這個鏡像將會被我們打包溃卡,上傳到自己的 Docker 倉庫溢豆,并且可以開箱即用。想象這么一個場景瘸羡,你的開發(fā)機器將這個應(yīng)用進行容器化以后漩仙,在自己的服務(wù)器上將這個容器化的鏡像下載后,使用一個命令就可以使你的應(yīng)用在另一個完全不同的環(huán)境運行起來最铁,節(jié)約下來的這些時間可以讓我們做更多自己喜歡的事情讯赏,而不是鉆研一個我們可能搞不定的 “Linux 環(huán)境問題”!

第一步:下載并安裝 Docker

下載地址冷尉,希望這一步?jīng)]有難倒你漱挎。

第二步:編寫一個簡單的 Node 應(yīng)用

為了保持足夠簡單,我使用了 Express雀哨,它只有一個功能磕谅,在主頁輸出一個 Hello Docker私爷,如果你對此有疑惑,可以參考 源碼倉庫膊夹,也可以參考下面的代碼:

const express = require('express');

const app = express();

app.get("/", (req, res) => {
  res.end("Hello Docker!")
});

app.listen(8000, () => {
  console.log("server is starting in http://localhost:8000");
});

保險起見衬浑,我們最好使用 node app.js 測試一下這個應(yīng)用是健康的,啟動后瀏覽器打開 http://localhost:8000放刨,我們可以順利看到 Hello Docker! 被輸出在屏幕上工秩,看來一切在朝著我們期望的方向發(fā)展著。

第三步:將 Node 應(yīng)用裝箱打包成鏡像

這一步可能會接觸到你的知識盲區(qū)了进统,所以我們用一個比較簡單輕松的風(fēng)格來剖析每一步需要做的事情助币,將復(fù)雜的事情分解成多個簡單的步驟,這是我們解決復(fù)雜問題的一貫方式螟碎。

我們在應(yīng)用的同級目錄下新建一個 Dockerfile 文件眉菱,讓這個記錄員幫我們記錄我們接下來要做的事情。你的目錄應(yīng)該看起來跟我的基本一致:

目錄結(jié)構(gòu)

我們的應(yīng)用需要什么掉分?

我們第一個需要思考的問題是俭缓,我們的應(yīng)用需要什么,我們可能知道酥郭,它需要一臺計算機來運行华坦,這個倒是不用擔心,Docker 也需要計算機不从,它能有的我們都可以有季春。那我們的應(yīng)用還需要什么呢,眾所周知消返,Docker 是用 Go 語言實現(xiàn)的,那他會有 Node 的運行環(huán)境嗎耘拇?

不撵颊,它沒有,所以我們第一步是構(gòu)建一個支持 Node 應(yīng)用運行的環(huán)境惫叛,那我們就需要先在這個容器中放進去一個 Node倡勇,怎么放進去呢,一個簡單的命令就可以了嘉涌,在 Dockerfile 中新增一行:

# 這句命令的作用是讓我們的鏡像在 node:10.16-alpine 鏡像的基礎(chǔ)上開始
# alpine 的包會比較小一點妻熊,功能也會少一點,但是已經(jīng)可以滿足我們的需求了
# 站在巨人的肩膀上
FROM node:10.16-alpine

我們需要在容器里做什么仑最?

我們的記錄員 Dockerfile 已經(jīng)幫我們記錄了第一步要做的事情扔役,我們可以在第一步的基礎(chǔ)上思考第二步要做的事情了。

在前面我們提到過警医,在容器中有一個自己的小宇宙亿胸,這個小宇宙雖然我們不常來坯钦,但是我們也應(yīng)該希望它能夠和大宇宙一樣井井有條,所以呢侈玄,我們要在這個容器單獨的文件系統(tǒng)中指定一個工作目錄婉刀,以便我們將來能夠在容器中盡快找到我們的應(yīng)用,所以讓我們的記錄員加上一句:

# 這句命令的作用是指定應(yīng)用在容器中的工作目錄
# 為我們的應(yīng)用找到了一個干凈的房間序仙,它將在這里開始它的一生
WORKDIR /usr/src/app

指定了工作目錄之后突颊,我們希望把我們的應(yīng)用在里面運行,這一步我們需要把我們的核心 app.js 挪到我們在 docker 中的工作目錄中潘悼,一般來說我們會將整個應(yīng)用放進去律秃,所以我們需要加上一句命令:

COPY . .

這樣就可以了嗎?如果你熟悉 Node 項目的話挥等,你就會知道把所有文件都挪進去是不太明智的友绝,至少要把 node_modules 留下,我們不需要親自將這個“龐大笨重的機器”艱難的挪進去肝劲,我們只需要放進去“芯片(app.js)”和“使用說明(package.json)”就可以了迁客,然后讓我們的 docker 容器完成對依賴的安裝。

所以我們在當前目錄下新建一個 .dockerignore 文件辞槐,填入 node_modules掷漱,就像 .gitignore 那樣!

既然我們已經(jīng)把應(yīng)用放進了容器榄檬,那么我們只需要像運行一個普通 Node 項目那樣運行我們的項目就可以了卜范,回憶一下,我們怎么運行我們的 Node 項目呢鹿榜?第一步安裝依賴海雪,第二步 Run it!

那我們需要在 package.json 中的 script 選項中加入一行 "start": "node app.js",為我們的項目指定一個啟動入口舱殿。然后我們就可以讓記錄員記錄最后的兩句命令了:

# 安裝依賴
RUN npm install

# 定義應(yīng)用的啟動指令
CMD [ "npm", "start" ]

最終的完整版應(yīng)該是這樣的:

FROM node:10.16-alpine

WORKDIR /usr/src/app
COPY . .
RUN npm install

CMD [ "npm", "start" ]

怎么將我們的應(yīng)用打包成 Docker 鏡像奥裸?

進入你的項目目錄,運行一行命令

# 根據(jù) Dockerfile 配置文件信息將應(yīng)用打包成鏡像
# 執(zhí)行記錄員記錄的所有命令
docker image build -t myapp:1.0 .

在打包完成后沪袭,我們用 docker image ls 命令來看看這孩子長啥樣

myapp 鏡像文件

它只有 79.6M湾宙,相對于一個 VM 系統(tǒng)來說,它輕的像一根羽毛冈绊,而且還可以更邢丽!

運行你的 Docker 容器死宣!

實踐是檢驗真理的唯一標準伟恶,我們來測試一下我們的容器,它能跑嗎十电?

(如果你想要模擬在另一臺電腦上運行知押,此刻你可以重啟電腦了叹螟,重啟后你得到的將會是一臺全新的電腦!)

我們現(xiàn)在使用一行命令來運行我們的容器:

docker container run --publish 8888:8000 --detach --name app myapp:1.0

在打開瀏覽器之前台盯,我們先剖析一下上面的這行命令:

  • docker container run: 運行一個 docker 容器
  • --publish: 將主機上的 8888 端口所接收的網(wǎng)絡(luò)流量轉(zhuǎn)發(fā)到容器內(nèi)部的 8000 端口處理罢绽;(我們?nèi)萜鲀?nèi)的 8000 端口上運行著我們的應(yīng)用)
  • --detach: 在后臺運行這個容器;
  • --name: 為你的容器指定一個名稱静盅,以便你區(qū)分不同的容器良价;

解析完成后,我們此刻應(yīng)該信心百倍蒿叠,打開瀏覽器明垢,輸入 http://localhost:8888,我們成功了市咽!

它來了

原文地址痊银,歡迎收錄

源碼地址,歡迎收錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末施绎,一起剝皮案震驚了整個濱河市溯革,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谷醉,老刑警劉巖致稀,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異俱尼,居然都是意外死亡抖单,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門遇八,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矛绘,“玉大人,你說我怎么就攤上這事刃永∶锔瑁” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵揽碘,是天一觀的道長。 經(jīng)常有香客問我园匹,道長雳刺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任裸违,我火速辦了婚禮掖桦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘供汛。我一直安慰自己枪汪,他們只是感情好涌穆,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雀久,像睡著了一般宿稀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赖捌,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天祝沸,我揣著相機與錄音,去河邊找鬼越庇。 笑死罩锐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卤唉。 我是一名探鬼主播涩惑,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼桑驱!你這毒婦竟也來了竭恬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤碰纬,失蹤者是張志新(化名)和其女友劉穎萍聊,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦析,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡寿桨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了强戴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭螟。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骑歹,靈堂內(nèi)的尸體忽然破棺而出预烙,到底是詐尸還是另有隱情,我是刑警寧澤道媚,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布扁掸,位于F島的核電站,受9級特大地震影響最域,放射性物質(zhì)發(fā)生泄漏谴分。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一镀脂、第九天 我趴在偏房一處隱蔽的房頂上張望憔狞。 院中可真熱鬧攀例,春花似錦、人聲如沸甚疟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春舀奶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背训措。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工伪节, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绩鸣。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓怀大,卻偏偏與公主長得像,于是被迫代替她去往敵國和親呀闻。 傳聞我的和親對象是個殘疾皇子化借,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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