0. 背景
本文講解如何構(gòu)建一個鏡像,和發(fā)布到 Docker Hub。
基于 Docker 的開發(fā)流程
一般來說基于 Docker 的開發(fā)流程是這樣的:
- (1)創(chuàng)建Docker鏡像彤侍,它承載了你的程序運(yùn)行的必要環(huán)境妈经,是創(chuàng)建和測試獨(dú)立的基礎(chǔ)杖挣。
- (2)測試慢洋,驗(yàn)證你的鏡像。
- (2)發(fā)布/分享你的鏡像匾效。比如在 Docker Hub 上發(fā)布你的Docker鏡像
本文關(guān)注第一步舷蟀,創(chuàng)建一個基礎(chǔ)的鏡像,這個鏡像是你的容器的基礎(chǔ)。一個鏡像包含了用于承載容器運(yùn)行的私有的文件系統(tǒng)野宜∩ú剑基于此,我們需要把我們的應(yīng)用程序的能夠運(yùn)行的所需文件/ 組件放入鏡像中速缨。
容器化的開發(fā)環(huán)境锌妻,相比于傳統(tǒng)的開發(fā)環(huán)境更容易配置。由于一個容器化的開發(fā)環(huán)境會把應(yīng)用程序所需要的文件依賴項(xiàng)旬牲,隔離在鏡像的內(nèi)部仿粹。那么,在你的真實(shí)開發(fā)主機(jī)上原茅,僅需要安裝Docker就夠了吭历。
通過這種方式,你可以輕松地為不同的技術(shù)棧開發(fā)應(yīng)用程序擂橘,而無需更改開發(fā)者主機(jī)上的內(nèi)容晌区。
1. 在開始之前的準(zhǔn)備
從 git 克隆一個示例項(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)目的根目錄通贞,新一個 Dockerfile 文件朗若,內(nèi)容如下:
# 指定一個 作為基礎(chǔ)的 官方鏡像
FROM node:current-slim
# 設(shè)置工作目錄,這里是你的Docker鏡像文件系統(tǒng)中的文件位置
WORKDIR /usr/src/app
# 拷貝你機(jī)器中的 package.json 到 鏡像文件系統(tǒng)中
COPY package.json .
# 要使用npm昌罩,先指定一個國內(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:指定一個 作為基礎(chǔ)的 官方鏡像
- WORKDIR:設(shè)置Docker鏡像文件系統(tǒng)中的工作目錄哭懈,后續(xù)操作以這個為基礎(chǔ)。
- RUN :后面跟的是在你的Docker鏡像中執(zhí)行的指令茎用。
- EXPOSE:暴露Docker鏡像的 8080 端口
上面的步驟構(gòu)建了鏡像的文件系統(tǒng)遣总。 - CMD:是第一個在映像中運(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í)行后垂券,將會看到按步驟執(zhí)行的過程。
最后看到 Successfully tagged "你的鏡像名"蒿褂,說明構(gòu)建完成圆米。
查看你本機(jī)的所有鏡像
執(zhí)行 docker images 查看你本機(jī)的所有鏡像,看下是不是有了啄栓。
docker images
3. 用這個鏡像啟動容器
用這個鏡像啟動容器,執(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:表示將在后臺運(yùn)行此容器堪旧。
--name:指定容器的名稱削葱。
訪問啟動后的程序
在瀏覽器中打開,可以看到部署成功的應(yīng)用web頁面
http://localhost:8000
移除這個容器
上面指定了名字叫 bb ,那么執(zhí)行:
docker rm --force bb
4. 在 Docker Hub 上發(fā)布你的Docker鏡像
Docker Hub 存放著 Docker 及其組件的很多資源淳梦,很多人在這里發(fā)布/分享鏡像析砸,這里我們也發(fā)布一個。分這么幾步:
- (1)注冊賬戶
- (2) 創(chuàng)建 一個 倉庫 repository
- (3) 推送(push)你的鏡像
4.1 注冊賬戶
在 https://hub.docker.com/signup. 完成注冊爆袍。
4.2 創(chuàng)建 一個 倉庫 repository
找到 Repositories > Create 首繁,填寫一些信息,按引導(dǎo)完成創(chuàng)建陨囊。
4.3 推送(push)你的鏡像
建立鏡像關(guān)聯(lián)到遠(yuǎn)程倉庫
注意下面 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ī)器上部署使用它會非常方便蜘醋,Docker將自動嘗試并從Docker Hub下載它胁塞。
一個至關(guān)重要的最佳實(shí)踐是:將你的 Dockerfile 放在版本控制中,可能與應(yīng)用程序的源代碼放在一起压语。并在 Docker Hub 存儲庫描述指示可以在何處找到這個文件啸罢。這樣不僅保留鏡像構(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