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í)行的過程。

最后看到 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