本節我們自己打包一個docker鏡像并釋出到官方的鏡像倉庫中。這樣任何人隻需執行以下指令: docker run -d -p 3000:3000 finleyma/express
就可以通路一個簡單的express程式了。
需要你有簡單的express使用經驗
實作過程非常簡單:
- 本地全局安裝
npm install express-generator -g
- 初始化一個express項目
express myapp
- cd myapp,然後 npm run start,項目就在本地運作了。
- 我們在項目内建立Dockerfile,内容如下:
FROM node:10.8.0-alpine
MAINTAINER www.mafeifan.com
# 設定工作目錄,下面的RUN指令會在工作目錄執行
WORKDIR /app
# 先拷貝本地的 package.json 和 package-lock 到容器内
# 這樣是利用docker的鏡像分層機制
COPY package*.json ./
# 安裝項目依賴包
# 生産環境可以運作 RUN npm install --only=production 隻按照 package.json 中dependencies定義的子產品
RUN npm install
# 将根目錄下的檔案都copy到container(運作此鏡像的容器)檔案系統的app檔案夾下
ADD . /app/
# 暴露容器内的3000端口
EXPOSE 3000
# 容器啟動時執行的指令,類似npm run start
CMD ["npm", "start"]
- 建構鏡像
别忘了最後的點,表示目前目錄docker build -t finleyma/express .
- 啟動容器
docker run -d -p 3000:3000 finleyma/express
- 可選,登入docker hub, 并送出鏡像。
,docker login
docker push finleyma/express
- 進入容器
簡要說下參數:docker run -it --rm finleyma/express:1.0 ash
- -it:這是兩個參數,一個是 -i:互動式操作,一個是 -t 終端。我們這裡打算進入 容器 執行一些指令并檢視傳回結果,是以我們需要互動式終端。
- --rm:這個參數是說容器退出後随之将其删除。預設情況下,為了排障需求,退出的容器并不會立即删除,除非手動 docker rm。我們這裡隻是随便執行個指令,看看結果,不需要排障和保留結果,是以使用 --rm 可以避免浪費空間。
-
ash:因為我們的Node的基礎鏡像是10.8.0-alpine, alpine的互動式 Shell是ash不是bash,使用bash會提示not found。注意這個細節。
會發現整個項目檔案都在容器内。
image.png![]()
docker學習系列7 容器化Node項目
簡單總結使用Docker的好處:
- 使用版本友善,比如伺服器上跑着node6,而你的項目需要node8以上。使用docker因為是隔離的環境
- 部署分享也友善,一行指令完事
問題:容器内的 node_modules 是本來就有還是容器執行 npm install 産生的呢?
答案:是建構的時候打包進鏡像内了。我們看一下體積,有20M而且進到容器内, ls -l node_modules 時間也是打包的什麼,并不是目前時間。
![]()
docker學習系列7 容器化Node項目