Docker 學(xué)習(xí)筆記2 - 創(chuàng)建一個(gè)鏡像和發(fā)布鏡像

0. 背景

本文講解如何構(gòu)建一個(gè)鏡像,和發(fā)布到 Docker Hub。

基于 Docker 的開發(fā)流程
一般來說基于 Docker 的開發(fā)流程是這樣的:

  • (1)創(chuàng)建Docker鏡像,它承載了你的程序運(yùn)行的必要環(huán)境,是創(chuàng)建和測(cè)試獨(dú)立的基礎(chǔ)。
  • (2)測(cè)試,驗(yàn)證你的鏡像。
  • (2)發(fā)布/分享你的鏡像。比如在 Docker Hub 上發(fā)布你的Docker鏡像

本文關(guān)注第一步,創(chuàng)建一個(gè)基礎(chǔ)的鏡像,這個(gè)鏡像是你的容器的基礎(chǔ)。一個(gè)鏡像包含了用于承載容器運(yùn)行的私有的文件系統(tǒng)?;诖?,我們需要把我們的應(yīng)用程序的能夠運(yùn)行的所需文件/ 組件放入鏡像中。

容器化的開發(fā)環(huán)境,相比于傳統(tǒng)的開發(fā)環(huán)境更容易配置。由于一個(gè)容器化的開發(fā)環(huán)境會(huì)把應(yīng)用程序所需要的文件依賴項(xiàng),隔離在鏡像的內(nèi)部。那么,在你的真實(shí)開發(fā)主機(jī)上,僅需要安裝Docker就夠了。

通過這種方式,你可以輕松地為不同的技術(shù)棧開發(fā)應(yīng)用程序,而無需更改開發(fā)者主機(jī)上的內(nèi)容。

1. 在開始之前的準(zhǔn)備

從 git 克隆一個(gè)示例項(xiàng)目到你本地:

git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

2. 創(chuàng)建Docker鏡像

步驟拆解:

  • (1) 編寫 Dockerfile 文件
  • (2) 執(zhí)行

下面分別說明。

2.1 編寫 Dockerfile 文件

進(jìn)入項(xiàng)目的根目錄,新一個(gè) Dockerfile 文件,內(nèi)容如下:

# 指定一個(gè) 作為基礎(chǔ)的 官方鏡像
FROM node:current-slim

# 設(shè)置工作目錄,這里是你的Docker鏡像文件系統(tǒng)中的文件位置
WORKDIR /usr/src/app
# 拷貝你機(jī)器中的 package.json 到 鏡像文件系統(tǒng)中
COPY package.json .
# 要使用npm,先指定一個(gè)國(guó)內(nèi)的源
RUN npm config set registry https://registry.npm.taobao.org
# 執(zhí)行 npm install
RUN npm install

# 暴露Docker鏡像的 8080 端口
EXPOSE 8080

# 執(zhí)行 指令 npm start
CMD [ "npm", "start" ]

# 拷貝當(dāng)前文件下的內(nèi)容到 Docker鏡像中
COPY . .

說明:

  • FROM:指定一個(gè) 作為基礎(chǔ)的 官方鏡像
  • WORKDIR:設(shè)置Docker鏡像文件系統(tǒng)中的工作目錄,后續(xù)操作以這個(gè)為基礎(chǔ)。
  • RUN :后面跟的是在你的Docker鏡像中執(zhí)行的指令。
  • EXPOSE:暴露Docker鏡像的 8080 端口
    上面的步驟構(gòu)建了鏡像的文件系統(tǒng)。
  • CMD:是第一個(gè)在映像中運(yùn)行的指令。

這些步驟與您在主機(jī)上設(shè)置和安裝應(yīng)用程序的步驟大致相同。由于使用了Dockerfile,它可以使您在可移植的、獨(dú)立的Docker鏡像中執(zhí)行相同的操作。

2.2 執(zhí)行構(gòu)建 docker build

在命令行執(zhí)行:

docker build --tag bulletinboard:1.0 .

執(zhí)行后,將會(huì)看到按步驟執(zhí)行的過程。

image.png

最后看到 Successfully tagged "你的鏡像名",說明構(gòu)建完成。

查看你本機(jī)的所有鏡像
執(zhí)行 docker images 查看你本機(jī)的所有鏡像,看下是不是有了。

docker images

3. 用這個(gè)鏡像啟動(dòng)容器

用這個(gè)鏡像啟動(dòng)容器,執(zhí)行:
docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

說明:
--publish: 指定端口映射,比如這里它將主機(jī)端口8000的流量轉(zhuǎn)發(fā)到容器端口8080。容器的端口是私有的,想從網(wǎng)絡(luò)中訪問就必須以這種方式將流量轉(zhuǎn)發(fā)給它。
--detach:表示將在后臺(tái)運(yùn)行此容器。
--name:指定容器的名稱。

訪問啟動(dòng)后的程序
在瀏覽器中打開,可以看到部署成功的應(yīng)用web頁面

http://localhost:8000

移除這個(gè)容器
上面指定了名字叫 bb ,那么執(zhí)行:

docker rm --force bb

4. 在 Docker Hub 上發(fā)布你的Docker鏡像

Docker Hub 存放著 Docker 及其組件的很多資源,很多人在這里發(fā)布/分享鏡像,這里我們也發(fā)布一個(gè)。分這么幾步:

  • (1)注冊(cè)賬戶
  • (2) 創(chuàng)建 一個(gè) 倉(cāng)庫(kù) repository
  • (3) 推送(push)你的鏡像

4.1 注冊(cè)賬戶

https://hub.docker.com/signup. 完成注冊(cè)。

4.2 創(chuàng)建 一個(gè) 倉(cāng)庫(kù) repository

找到 Repositories > Create ,填寫一些信息,按引導(dǎo)完成創(chuàng)建。

4.3 推送(push)你的鏡像

建立鏡像關(guān)聯(lián)到遠(yuǎn)程倉(cāng)庫(kù)
注意下面 gordon 改成你的賬戶名。

docker tag bulletinboard:1.0 gordon/bulletinboard:1.0

執(zhí)行push

docker push gordon/bulletinboard:1.0

現(xiàn)在鏡像已經(jīng)可以在Docker Hub上使用了,在新機(jī)器上部署使用它會(huì)非常方便,Docker將自動(dòng)嘗試并從Docker Hub下載它。

一個(gè)至關(guān)重要的最佳實(shí)踐是:將你的 Dockerfile 放在版本控制中,可能與應(yīng)用程序的源代碼放在一起。并在 Docker Hub 存儲(chǔ)庫(kù)描述指示可以在何處找到這個(gè)文件。這樣不僅保留鏡像構(gòu)建方式的記錄,還保留鏡像作為完整應(yīng)用程序運(yùn)行的方式的記錄。

5. 參考

https://docs.docker.com/get-started/part2/

https://www.widuu.com/chinese_docker/userguide/dockerhub.html

https://docs.docker.com/get-started/part3/

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容