Docker 是什么:
Docker 屬于 Linux 容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的 Linux 容器解決方案。
Docker 將應(yīng)用程序與該程序的依賴,打包在一個(gè)文件里面。運(yùn)行這個(gè)文件测垛,就會(huì)生成一個(gè)虛擬容器。程序在這個(gè)虛擬容器里運(yùn)行秧均,就好像在真實(shí)的物理機(jī)上運(yùn)行一樣食侮。有了 Docker,就不用擔(dān)心環(huán)境問題目胡。
總體來說,Docker 的接口相當(dāng)簡單誉己,用戶可以方便地創(chuàng)建和使用容器眉尸,把自己的應(yīng)用放入容器。容器還可以進(jìn)行版本管理巨双、復(fù)制噪猾、分享、修改筑累,就像管理普通的代碼一樣袱蜡。
image 文件:
Docker 把應(yīng)用程序及其依賴,打包在 image 文件里面慢宗。只有通過這個(gè)文件坪蚁,才能生成 Docker 容器奔穿。image 文件可以看作是容器的模板。Docker 根據(jù) image 文件生成容器的實(shí)例迅细。同一個(gè) image 文件巫橄,可以生成多個(gè)同時(shí)運(yùn)行的容器實(shí)例淘邻。
Dockerfile 文件:
學(xué)會(huì)使用 image 文件以后茵典,接下來的問題就是,如何可以生成 image 文件宾舅?如果你要推廣自己的軟件统阿,勢(shì)必要自己制作 image 文件。
這就需要用到 Dockerfile 文件筹我。它是一個(gè)文本文件扶平,用來配置 image。Docker 根據(jù) 該文件生成二進(jìn)制的 image 文件蔬蕊。
下面通過一個(gè)實(shí)例结澄,演示如何編寫 Dockerfile 文件。
編寫 Dockerfile 文件
首先岸夯,在項(xiàng)目的根目錄下麻献,新建一個(gè)文本文件.dockerignore 這個(gè)就相當(dāng)于git的gitignore。
然后猜扮,在項(xiàng)目的根目錄下勉吻,新建一個(gè)文本文件 Dockerfile,寫入下面的內(nèi)容旅赢。(:后面為解釋內(nèi)容)
FROM node:8.4:該 image 文件繼承官方的 node image齿桃,冒號(hào)表示標(biāo)簽,這里標(biāo)簽是8.4煮盼,即8.4版本的 node短纵。
COPY . /app:將當(dāng)前目錄下的所有文件(除了.dockerignore排除的路徑),都拷貝進(jìn)入 image 文件的/app目錄僵控。
WORKDIR /app:指定接下來的工作路徑為/app香到。
RUN npm install:在/app目錄下,運(yùn)行npm install命令安裝依賴喉祭。注意养渴,安裝后所有的依賴,都將打包進(jìn)入 image 文件泛烙。
EXPOSE 3000:將容器 3000 端口暴露出來理卑, 允許外部連接這個(gè)端口。
創(chuàng)建 image 文件
有了 Dockerfile 文件以后蔽氨,就可以使用docker image build命令創(chuàng)建 image 文件 ??
docker image build -t liuxu .
面代碼中藐唠,-t參數(shù)用來指定 image 文件的名字帆疟,后面還可以用冒號(hào)指定標(biāo)簽。如果不指定宇立,默認(rèn)的標(biāo)簽就是latest踪宠。最后的那個(gè)點(diǎn)表示 Dockerfile 文件所在的路徑,上例是當(dāng)前路徑妈嘹,所以是一個(gè)點(diǎn)柳琢。
如果運(yùn)行成功,就可以看到新生成的 image 文件liuxu了润脸。
生成容器:
docker container run命令會(huì)從 image 文件生成容器柬脸。
docker container run -p 8000:3000 -it liuxu /bin/bash
-p參數(shù):容器的 3000 端口映射到本機(jī)的 8000 端口。
-it參數(shù):容器的 Shell 映射到當(dāng)前的 Shell毙驯,然后你在本機(jī)窗口輸入的命令倒堕,就會(huì)傳入容器。
koa-demo:0.0.1:image 文件的名字(如果有標(biāo)簽爆价,還需要提供標(biāo)簽垦巴,默認(rèn)是 latest 標(biāo)簽)。
/bin/bash:容器啟動(dòng)以后铭段,內(nèi)部第一個(gè)執(zhí)行的命令骤宣。這里是啟動(dòng) Bash,保證用戶可以使用 Shell稠项。
如果一切正常涯雅,運(yùn)行上面的命令以后,就會(huì)返回一個(gè)命令行提示符展运。:/app#
這時(shí)活逆,liuxu 框架已經(jīng)運(yùn)行起來了。打開本機(jī)的瀏覽器拗胜,訪問 http://127.0.0.1:8000蔗候,網(wǎng)頁顯示"Not Found",這是因?yàn)檫@個(gè)?demo?沒有寫路由埂软。
這個(gè)例子中锈遥,Node 進(jìn)程運(yùn)行在 Docker 容器的虛擬環(huán)境里面,進(jìn)程接觸到的文件系統(tǒng)和網(wǎng)絡(luò)接口都是虛擬的勘畔,與本機(jī)的文件系統(tǒng)和網(wǎng)絡(luò)接口是隔離的所灸,因此需要定義容器與物理機(jī)的端口映射(map)。
現(xiàn)在炫七,在容器的命令行爬立,按下 Ctrl + c 停止 Node 進(jìn)程,然后按下 Ctrl + d (或者輸入 exit)退出容器万哪。此外侠驯,也可以用docker container kill終止容器運(yùn)行抡秆。
CMD 命令
容器啟動(dòng)以后,需要手動(dòng)輸入命令node demos/01.js吟策。我們可以把這個(gè)命令寫在 Dockerfile 里面儒士,這樣容器啟動(dòng)以后,這個(gè)命令就已經(jīng)執(zhí)行了檩坚,不用再手動(dòng)輸入了着撩。
CMD node demos/01.js
它表示容器啟動(dòng)后自動(dòng)執(zhí)行node demos/01.js?RUN命令在 image 文件的構(gòu)建階段執(zhí)行,執(zhí)行結(jié)果都會(huì)打包進(jìn)入 image 文件效床;CMD命令則是在容器啟動(dòng)后執(zhí)行睹酌。另外权谁,一個(gè) Dockerfile 可以包含多個(gè)RUN命令剩檀,但是只能有一個(gè)CMD命令。