在上一章我提到過一篇【第1章 1.5 API 服務(wù) (webapi) 部署到Docker容器中 http://www.reibang.com/p/13c7f5cfc4a1】淆珊,講述的是如何將github上的源碼打包到Docker鏡像中,其中Dockerfile如下
FROM microsoft/dotnet
MAINTAINER DAIJINMING@LIVE.CN
RUN apt-get update && apt-get install -y \
git
RUN git clone -q https://github.com/dockersample/webapi.git
WORKDIR webapi/
RUN dotnet restore
EXPOSE 5000
CMD ["dotnet","run"]
使用上面的Dockerfile構(gòu)建鏡像的時候夺饲,每次都是從Github上下載最新代碼,將代碼和dotnet環(huán)境打包到一起形成最新的鏡像。
隨著開發(fā)的迭代往声,后臺API可能經(jīng)常要更新擂找,每次更新API都需要重新構(gòu)建Dockerfile,更新容器鏡像浩销。這樣不僅浪費時間和CPU,還會對業(yè)務(wù)造成一定的影響贯涎。
這時候我們確實應(yīng)該思考下是否有必要每次都更新鏡像?
Docker提供了一個容器掛接宿主磁盤的代碼目錄的功能撼嗓,將宿主磁盤目錄映射為容器磁盤目錄柬采,將github上的代碼下載到宿主磁盤的代碼目錄中,如果一旦github上的代碼更新且警,就直接更新宿主磁盤的代碼目錄中的程序源碼粉捻,然后重啟容器,API服務(wù)就得到了更新斑芜,免去了重新構(gòu)建容器鏡像的過程肩刃。
實現(xiàn)過程如下:
前提
宿主磁盤目錄:
/home/daijinming/demo/codebase/webapi容器磁盤目錄:
/codebase
編寫Dockerfile
FROM microsoft/dotnet
MAINTAINER DAIJINMING@LIVE.CN
VOLUME /codebase ## 用于掛接磁盤
EXPOSE 5000
WORKDIR /codebase
ENTRYPOINT ["dotnet","restore"]
ENTRYPOINT ["dotnet","run"]
獲得最新代碼
- git clone 或 git pull
克隆或拉取最新代碼到本地磁盤
構(gòu)建鏡像
定位到Dockerfile文件目錄,這次設(shè)置的鏡像名字:djm/dotnet ,而不是之前 djm/webapi,這個主要考慮到這個鏡像是通用的dotnet鏡像,和業(yè)務(wù)沒關(guān)系杏头,在運行鏡像時盈包,采用不同路徑、名稱來區(qū)分不同服務(wù)醇王。
docker build -t djm/dotnet .
運行鏡像
docker run --name webapi -d -p 5000:5000 -v /home/daijinming/demo/codebase/webapi:/codebase djm/dotnet
掛接宿主磁盤目錄:-v /home/daijinming/demo/codebase/webapi
命名容器:--name webapi
對外端口:5000
上述參數(shù)都可以根據(jù)不同路徑的代碼修改進(jìn)行區(qū)分呢燥。
運行容器后,查看下當(dāng)前在運行的容器:
root@dai-u:/home/daijinming/demo/code/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c0f88ca3f8c djm/dotnet "dotnet run" 5 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp webapi
將穩(wěn)定寓娩、復(fù)雜的部分封裝到Docker鏡像中叛氨,這應(yīng)該才是Docker的本質(zhì)。