Docker1:部署Node應(yīng)用

什么事Docker

????docker是一個(gè)開(kāi)源的應(yīng)用容器引擎,可以為我們提供安全、可移植澎灸、可重復(fù)的自動(dòng)化部署的方式。docker采用虛擬化的技術(shù)來(lái)虛擬化出應(yīng)用程序的運(yùn)行環(huán)境蛔垢。此種方式具有以下優(yōu)勢(shì):

? ?????1击孩、 每個(gè)部署的應(yīng)用程序都是一個(gè)容器,彼此隔離鹏漆,互不影響巩梢;

? ?????2、 服務(wù)器只需要安裝docker即可運(yùn)行構(gòu)建好的應(yīng)用程序鏡像艺玲,不會(huì)涉及復(fù)雜的服務(wù)器環(huán)境配置括蝠,因?yàn)榕渲枚荚谔囟ǖ膽?yīng)用程序所在的鏡像中去配置即可;

? ????? 3饭聚、簡(jiǎn)化了自動(dòng)化部署和運(yùn)維的繁瑣流程忌警,只需將構(gòu)建好的鏡像load到服務(wù)器的docker中即可運(yùn)行我們的應(yīng)用程序;

? ????? 4秒梳、可以充分利用服務(wù)器的系統(tǒng)資源法绵,一臺(tái)服務(wù)器上可以同時(shí)運(yùn)行多個(gè)容器;

????docker采用的是c/s架構(gòu)酪碘,Client通過(guò)接口與Server進(jìn)程通信實(shí)現(xiàn)容器的構(gòu)建朋譬,運(yùn)行和發(fā)布。docker比較重要的三個(gè)核心概念如下:

? ??????鏡像(images):一個(gè)只讀的模板兴垦,可以理解為應(yīng)用程序的運(yùn)行環(huán)境徙赢,包含了程序運(yùn)行所依賴的環(huán)境和基本配置,鏡像可以按照層級(jí)(從基礎(chǔ)鏡像開(kāi)始)來(lái)構(gòu)建探越,每一層包含特定的環(huán)境狡赐。

? ??????倉(cāng)庫(kù)(repository):一個(gè)用于存放鏡像文件的倉(cāng)庫(kù),如果你對(duì)git的倉(cāng)庫(kù)熟悉钦幔,應(yīng)該很容易理解枕屉,對(duì),就是那個(gè)鲤氢。有私有倉(cāng)庫(kù)和公有倉(cāng)庫(kù)之分搀庶。

? ??????容器(container):一個(gè)運(yùn)行應(yīng)用程序的虛擬容器拐纱,在我們運(yùn)行鏡像時(shí)產(chǎn)生。容器包含自己的文件系統(tǒng)+隔離的進(jìn)程空間和包含其中的進(jìn)程哥倔。

實(shí)戰(zhàn)開(kāi)始

1、環(huán)境準(zhǔn)備

安裝docker揍庄,未安裝的同學(xué)咆蒿,請(qǐng)根據(jù)自己的開(kāi)發(fā)環(huán)境采用不同的安裝方式去安裝,具體操作參考教程蚂子,不做贅述沃测。

安裝成功后,可以通過(guò)docker -v查看版本號(hào)(盡量使用最新的穩(wěn)定版本)食茎。

2蒂破、項(xiàng)目準(zhǔn)備

在你的項(xiàng)目根目錄下,添加Dockerfile文件别渔,此文件用來(lái)配置我們自定義一個(gè)鏡像所需要指定的依賴項(xiàng)附迷、環(huán)境以及執(zhí)行的命令等。內(nèi)容格式如下:

# 指定我們的基礎(chǔ)鏡像是node哎媚,版本是v8.0.0

FROM node:8.0.0?

# 指定制作我們的鏡像的聯(lián)系人信息(鏡像創(chuàng)建者)

MAINTAINER EOI

# 將根目錄下的文件都copy到container(運(yùn)行此鏡像的容器)文件系統(tǒng)的app文件夾下

ADD . /app/?

#cd到app文件夾下

WORKDIR /app

# 安裝項(xiàng)目依賴包

RUN npm install?

RUN npm rebuild node-sass --force

# 配置環(huán)境變量

ENV HOST 0.0.0.0?

ENV PORT 8000

# 容器對(duì)外暴露的端口號(hào)

EXPOSE 8000

# 容器啟動(dòng)時(shí)執(zhí)行的命令喇伯,類似npm run start

CMD ["npm", "start"]

關(guān)于Dockerfile文件中的關(guān)鍵字,解釋如下:

FROM

MAINTAINER

語(yǔ)法:MAINTAINER解釋:MAINTAINER指令允許你給將要制作的鏡像設(shè)置作者信息拨与。

ADD

語(yǔ)法:ADD解釋:ADD指令用于從指定路徑拷貝一個(gè)文件或目錄到容器的指定路徑中稻据,是一個(gè)文件或目錄的路徑,也可以是一個(gè)url买喧,路徑是相對(duì)于該Dockerfile文件所在位置的相對(duì)路徑捻悯,是目標(biāo)容器的一個(gè)絕對(duì)路徑。

WORKDIR

語(yǔ)法:WORKDIR/path/to/workdir 解釋:WORKDIR指令用于設(shè)置Dockerfile中的RUN淤毛、CMD和ENTRYPOINT指令執(zhí)行命令的工作目錄(默認(rèn)為/目錄)今缚,該指令在Dockerfile文件中可以出現(xiàn)多次,如果使用相對(duì)路徑則為相對(duì)于WORKDIR上一次的值钱床,例如WORKDIR /data荚斯,WORKDIR logs,RUN pwd最終輸出的當(dāng)前目錄是/data/logs查牌。

RUN

語(yǔ)法:① RUN #將會(huì)調(diào)用/bin/sh -c<command>② RUN ["executable","param1","param2"]#將會(huì)調(diào)用exec執(zhí)行事期,以避免有些時(shí)候shell方式執(zhí)行時(shí)的傳遞參數(shù)問(wèn)題,而且有些基礎(chǔ)鏡像可能不包含/bin/sh解釋:RUN指令會(huì)在一個(gè)新的容器中執(zhí)行任何命令纸颜,然后把執(zhí)行后的改變提交到當(dāng)前鏡像兽泣,提交后的鏡像會(huì)被用于Dockerfile中定義的下一步操作,RUN中定義的命令會(huì)按順序執(zhí)行并提交胁孙,這正是Docker廉價(jià)的提交和可以基于鏡像的任何一個(gè)歷史點(diǎn)創(chuàng)建容器的好處唠倦,就像版本控制工具一樣称鳞。

ENV

語(yǔ)法:ENV解釋:ENV指令用于設(shè)置環(huán)境變量,在Dockerfile中這些設(shè)置的環(huán)境變量也會(huì)影響到RUN指令稠鼻,當(dāng)運(yùn)行生成的鏡像時(shí)這些環(huán)境變量依然有效冈止,如果需要在運(yùn)行時(shí)更改這些環(huán)境變量可以在運(yùn)行docker run時(shí)添加–env=參數(shù)來(lái)修改。 注意:最好不要定義那些可能和系統(tǒng)預(yù)定義的環(huán)境變量沖突的名字候齿,否則可能會(huì)產(chǎn)生意想不到的結(jié)果熙暴。

EXPOSE

語(yǔ)法:EXPOSE[ ...]解釋:EXPOSE指令用來(lái)告訴Docker這個(gè)容器在運(yùn)行時(shí)會(huì)監(jiān)聽(tīng)哪些端口,Docker在連接不同的容器(使用–link參數(shù))時(shí)使用這些信息慌盯。

CMD

語(yǔ)法: ①CMD["executable","param1","param2"]#將會(huì)調(diào)用exec執(zhí)行周霉,首選方式②CMD["param1","param2"]#當(dāng)使用ENTRYPOINT指令時(shí),為該指令傳遞默認(rèn)參數(shù)③CMD [ | ]#將會(huì)調(diào)用/bin/sh -c執(zhí)行解釋:CMD指令中指定的命令會(huì)在鏡像運(yùn)行時(shí)執(zhí)行亚皂,在Dockerfile中只能存在一個(gè)俱箱,如果使用了多個(gè)CMD指令,則只有最后一個(gè)CMD指令有效灭必。當(dāng)出現(xiàn)ENTRYPOINT指令時(shí)狞谱,CMD中定義的內(nèi)容會(huì)作為ENTRYPOINT指令的默認(rèn)參數(shù),也就是說(shuō)可以使用CMD指令給ENTRYPOINT傳遞參數(shù)厂财。注意:RUN和CMD都是執(zhí)行命令芋簿,他們的差異在于RUN中定義的命令會(huì)在執(zhí)行docker build命令創(chuàng)建鏡像時(shí)執(zhí)行,而CMD中定義的命令會(huì)在執(zhí)行docker run命令運(yùn)行鏡像時(shí)執(zhí)行璃饱,另外使用第一種語(yǔ)法也就是調(diào)用exec執(zhí)行時(shí)与斤,命令必須為絕對(duì)路徑。

其中還有其他的一些關(guān)鍵字:USER荚恶、ENTRYPOINT撩穿、VOLUME、ONBUILD等谒撼,如果你有興趣可以自行研究食寡。

在項(xiàng)目根目錄下添加.dockerignore文件,此文件的作用類似.gitignore文件廓潜,可以忽略掉添加進(jìn)鏡像中的文件抵皱,寫(xiě)法、格式和.gitignore一樣辩蛋,一行代表一個(gè)忽略呻畸。本項(xiàng)目添加的忽略如下:

.DS_Store?

npm-debug.log*?

selenium-debug.log

.nuxt/?

/package-lock.json?

*.tar?

*.md?

# Editor directoriesandfiles?

.idea?

*.suo?

*.ntvs*?

*.njsproj?

*.sln

構(gòu)建鏡像

查看目前本地docker的鏡像

> docker images

REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

cd 到項(xiàng)目根目錄下,執(zhí)行以下命令

> docker build -t deploy:1.0?

deploy是鏡像名悼院,1.0是鏡像的版本號(hào)伤为,到此你已經(jīng)成功構(gòu)建了一個(gè)新的鏡像,你可以通過(guò)docker images据途,查看你的鏡像绞愚。

> docker images

REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE?

deploy? ? ? ? ? ? ? 1.0? ? ? ? ? ? ? ? d8f0875e967b? ? ? ? 3 minutes ago? ? ? ? 2.11GB

啟動(dòng)鏡像叙甸,測(cè)試是否成功。

> docker run -d -p 9000:8000 deploy:1.0

8aec5ee037bb253901d2c2e02c7be546580546c493576139f3789fb660f3401d

> docker ps -a

CONTAINER ID? ? IMAGE? ? ? ? COMMAND? ? ? ? ? CREATED? ? ? ? ? STATUS? ? ? ? PORTS? ? ? ? ? ? ? ? ? NAMES

8aec5ee037bb? ? deploy:1.0? "npm start"? ? 57 seconds ago? ? Up 56 seconds? 0.0.0.0:9000->8000/tcp amazing_bassi

docker run -d -p 9000:8000 deploy:1.0中-d表示后臺(tái)運(yùn)行位衩,-p 9000:8000表示指定本地的9000端口隱射到容器內(nèi)的8000端口裆蒸。?deploy:1.0為我們要運(yùn)行的鏡像。通過(guò)docker ps -a查看docker的進(jìn)程(容器的運(yùn)行本身就是一種特殊的進(jìn)程)運(yùn)行情況蚂四,發(fā)現(xiàn)我們的容器已經(jīng)在運(yùn)行光戈。本地可以訪問(wèn)localhost:9000。

通過(guò)docker logs可以查看我們?nèi)萜鲀?nèi)應(yīng)用進(jìn)程的運(yùn)行日志遂赠。docker logs <CONTAINER ID>

> docker logs 8aec5ee037bb

npm info it worked if it ends with ok??

npm info using npm@5.0.0??

npm info using node@v8.0.0??

npm info lifecycle newlook-deploy@1.0.0~prestart: newlook-deploy@1.0.0?

?npm info lifecycle newlook-deploy@1.0.0~start: newlook-deploy@1.0.0??

> newlook-deploy@1.0.0 start /app? > node ./server/index.jsServer listening on 0.0.0.0:8000? DONE? Compiled successfully in 9310ms06:55:56? > Open http://0.0.0.0:8000

docker stop <CONTAINER ID>可以停止容器運(yùn)行

docker start <CONTAINER ID>可以啟動(dòng)容器運(yùn)行

docker restart <CONTAINER ID>可以重啟容器

docker rm <CONTAINER ID> -f可以強(qiáng)制刪除在運(yùn)行的容器

上傳鏡像(這里用上傳到公共倉(cāng)庫(kù)來(lái)演示)

沒(méi)注冊(cè)DockerHub的同學(xué),請(qǐng)注冊(cè)DockerHub

登錄docker

> docker login

Username: XXX

Password: XXXLogin

?Succeeded

docker tag <name:tag> <namespace>/<name:tag>上傳之前必須給鏡像打上tag晌杰,namespace可以指定為你的docker Id

>?docker tag deploy:1.0 lzqs/deploy:1.0

docker push <namespace>/<name:tag>將鏡像上傳至docker的公共倉(cāng)庫(kù)

>?docker push lzqs/deploy:1.0

上傳成功后跷睦,docker logout?退出,登錄?https://hub.docker.com/?查看上傳的鏡像肋演。

下載鏡像

通過(guò)docker pull <namespace>/<name:tag>下載我們的鏡像抑诸。

>?docker pull lzqs/deploy:1.0

生產(chǎn)部署

前面說(shuō)了,我們可以將上傳到倉(cāng)庫(kù)的鏡像下載下來(lái)部署爹殊,但是如果鏡像比較大或者部署環(huán)境壓根無(wú)法聯(lián)網(wǎng)蜕乡,你是不是要跪了。所以我們采取另一種方法梗夸,將開(kāi)發(fā)好的鏡像直接打包保存到安裝盤(pán)里面层玲,到客戶生產(chǎn)環(huán)境再將鏡像包上傳并加載到服務(wù)器的docker中即可。

在開(kāi)發(fā)環(huán)境打包反症,docker save <namespace>/<name:tag> <name>.tar

>?docker save lzqs/deploy:1.0 > deploy.tar

這里ls會(huì)發(fā)現(xiàn)目錄下生成了deploy.tar的文件辛块。部署時(shí)將此文件copy到生產(chǎn)環(huán)境服務(wù)器上。

確保生產(chǎn)服務(wù)器上已經(jīng)安裝了docker铅碍,若沒(méi)裝润绵,請(qǐng)參考相關(guān)文檔,若不裝胞谈,對(duì)不起小生也無(wú)力了尘盼,然后在服務(wù)器上加載上傳的鏡像包deploy.tar。

> docker load < deploy.tar

007ab444b234: Loading layer [==================================================>] 129.3 MB/129.3 MB??

4902b007e6a7: Loading layer [==================================================>] 45.45 MB/45.45 MB?

?bb07d0c1008d: Loading layer [==================================================>] 126.8 MB/126.8 MB??

ecf5c2e2468e: Loading layer [==================================================>] 326.6 MB/326.6 MB??

7b3b4fef39c1: Loading layer [==================================================>] 352.3 kB/352.3 kB??

677f02386f07: Loading layer [==================================================>] 137.2 kB/137.2 kB??

7333bb4665b8: Loading layer [==================================================>] 55.66 MB/55.66 MB??

e292e64ffb88: Loading layer [==================================================>] 3.757 MB/3.757 MB??

ee76d0e6f6d9: Loading layer [==================================================>] 1.436 GB/1.436 GB??

33dca533c6e5: Loading layer [==================================================>] 331.8 kB/331.8 kB??

24630015679d: Loading layer [==================================================>] 35.18 MB/35.18 MB??

Loaded image: lzqs/deploy:1.0

加載成功后烦绳,docker images即可看到加載的鏡像

> docker images

REPOSITORY? ? ? ? ? TAG? ? ? ? ? ? ? ? IMAGE ID? ? ? ? ? ? CREATED? ? ? ? ? ? SIZE

lzqs/deploy? ? ? ? 1.0? ? ? ? ? ? ? ? d8f0875e967b? ? ? ? About an hour ago? 2.115 GB

運(yùn)行l(wèi)zqs/deploy鏡像卿捎,成功后,在外部訪問(wèn)服務(wù)器的9000端口爵嗅,?<服務(wù)器的IP>:9000

> docker run -d -p 9000:8000 lzqs/deploy

1d0db9a5d0c8826171e501b0e86afd444fca8144b1105e63dae8d621bdda7a77

> docker ps -a

CONTAINER ID? IMAGE? ? ? ? ? COMMAND? ? ? CREATED? ? ? ? ? ? ? STATUS? ? ? ? ? ? PORTS? ? ? ? ? ? ? ? ? ? NAMES

1d0db9a5d0c8? lzqs/deploy:1.0 "npm start"? About a minute ago? Up About a minute? 0.0.0.0:9000->8000/tcp goofy_curran

docker exec -it <CONTAINER ID> /bin/bash?可以進(jìn)入容器中執(zhí)行娇澎,方便我們查看內(nèi)部文件和調(diào)試

>dockerexec-it 1d0db9a5d0c8 /bin/bash

root@1d0db9a5d0c8:/app#

打完收工,可以再外邊訪問(wèn)了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睹晒,一起剝皮案震驚了整個(gè)濱河市趟庄,隨后出現(xiàn)的幾起案子括细,更是在濱河造成了極大的恐慌,老刑警劉巖戚啥,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奋单,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡猫十,警方通過(guò)查閱死者的電腦和手機(jī)览濒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拖云,“玉大人贷笛,你說(shuō)我怎么就攤上這事≈嫦睿” “怎么了乏苦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)尤筐。 經(jīng)常有香客問(wèn)我汇荐,道長(zhǎng),這世上最難降的妖魔是什么盆繁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任掀淘,我火速辦了婚禮,結(jié)果婚禮上油昂,老公的妹妹穿的比我還像新娘革娄。我一直安慰自己,他們只是感情好秕狰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布稠腊。 她就那樣靜靜地躺著,像睡著了一般鸣哀。 火紅的嫁衣襯著肌膚如雪架忌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天我衬,我揣著相機(jī)與錄音叹放,去河邊找鬼。 笑死挠羔,一個(gè)胖子當(dāng)著我的面吹牛井仰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播破加,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俱恶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起合是,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤了罪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后聪全,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泊藕,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年难礼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃圆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛾茉,死狀恐怖讼呢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谦炬,我是刑警寧澤吝岭,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吧寺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏散劫。R本人自食惡果不足惜稚机,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望获搏。 院中可真熱鬧赖条,春花似錦、人聲如沸常熙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)裸卫。三九已至仿贬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間墓贿,已是汗流浹背茧泪。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留聋袋,地道東北人队伟。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像幽勒,于是被迫代替她去往敵國(guó)和親嗜侮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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