FROM node:10 WORKDIR \/appCOPY app \/appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d .\/build"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/0b\/0bc747430757de34de72748a511f05b8.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖2:鏡像的初始大小爲1.16GB"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"第一步優化:使用輕量化基礎鏡像"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在"},{"type":"link","attrs":{"href":"https:\/\/hub.docker.com\/","title":"","type":null},"content":[{"type":"text","text":"Docker Hub"}]},{"type":"text","text":"(公共Docker倉庫)中,有一些鏡像可供下載,每個鏡像都有不同的特徵和大小。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通常,相較於基於其他Linux發行版(例如"},{"type":"link","attrs":{"href":"https:\/\/hub.docker.com\/_\/ubuntu","title":"","type":null},"content":[{"type":"text","text":"Ubuntu"}]},{"type":"text","text":")的鏡像,基於"},{"type":"link","attrs":{"href":"https:\/\/hub.docker.com\/_\/alpine","title":"","type":null},"content":[{"type":"text","text":"Alpine"}]},{"type":"text","text":"或"},{"type":"link","attrs":{"href":"https:\/\/hub.docker.com\/_\/busybox","title":"","type":null},"content":[{"type":"text","text":"BusyBox"}]},{"type":"text","text":"的鏡像非常小。這是因爲Alpine鏡像和類似的其他鏡像都經過了優化,其中僅包含最少的必須的軟件包。在下面的圖片中,你可以看到Ubuntu、Alpine、Node和基於Alpine的Node鏡像之間的大小比較。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/86\/8636fe5ac03b51740ed84bc2d8de4990.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖3:基礎鏡像的不同大小"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過修改Dockerfile並使用Alpine作爲基礎鏡像,我們的鏡像最終大小爲330MB:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"embedcomp","attrs":{"type":"table","data":{"content":"FROM node:10-alpine WORKDIR \/appCOPY app \/appRUN npm install -g webserver.localRUN npm install && npm run build EXPOSE 3000CMD webserver.local -d .\/build"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/b0\/b0c525a22c2b853edc10853e58bc385b.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖4:經過第一步優化後鏡像大小爲330MB"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"第二步優化:多階段構建"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過多階段構建,我們可以在Dockerfile中使用多個基礎鏡像,並將編譯成品、配置文件等從一個階段複製到另一個階段,這樣我們就可以丟棄不需要的東西。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在本例中,我們部署React應用程序需要的是編譯後的代碼,我們不需要源文件,也不需要node_modules目錄和package.json文件等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過將Dockerfile修改爲如下內容,我們最終得到的鏡像大小爲91.5MB。請記住,來自第一階段(第1-4行)的鏡像不會被自動刪除,Docker將它保存在cache中,如果我們在另一個構建鏡像過程中執行了相同的階段,就可以使鏡像構建更快。所以你必須手動刪除第一階段鏡像。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"embedcomp","attrs":{"type":"table","data":{"content":"FROM node:10-alpine AS buildWORKDIR \/appCOPY app \/appRUN npm install && npm run build FROM node:10-alpineWORKDIR \/appRUN npm install -g webserver.localCOPY --from=build \/app\/build .\/buildEXPOSE 3000CMD webserver.local -d .\/build"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/de\/defd6ffdfe16ec546d5a5b083c94a322.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖5:第二步優化後的鏡像大小爲91.5MB"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在我們有了一個Dockerfile,它有兩個階段:在第一個階段中,我們編譯項目,在第二個階段中,我們在web服務器上部署應用程序。然而,Node容器並不是提供網頁(HTML、CSS和JavaScript文件、圖片等)服務的最佳選擇,最好的選擇是使用像Nginx或Apache這樣的服務。在本例中,我將使用Nginx。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過將Dockerfile修改爲如下內容,我們的鏡像最終大小是22.4MB,如果我們運行這個容器,我們可以看到網頁"},{"type":"text","text":"可以正常工作,沒有任何問題"},{"type":"text","text":"(圖7)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"embedcomp","attrs":{"type":"table","data":{"content":"FROM node:10-alpine AS buildWORKDIR \/appCOPY app \/appRUN npm install && npm run build FROM nginx:stable-alpineCOPY --from=build \/app\/build \/usr\/share\/nginx\/htmlEXPOSE 80CMD [\"nginx\", \"-g\", \"daemon off;\"]"}}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/a5\/a5679d4a483b0592976dff51e625a40b.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖6:第三步優化後的鏡像大小爲22.4MB"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/5a\/5aea754a91e0157bf3503daca2a5337a.png","alt":null,"title":null,"style":null,"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"圖7:最終容器的運行結果"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"參考"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/docs.docker.com\/get-started\/","title":"","type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"https:\/\/docs.docker.com\/get-started\/"}]}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/","title":"","type":null},"content":[{"type":"text","marks":[{"type":"underline"}],"text":"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/"}]}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/medium.com\/the-agile-crafter\/docker-image-optimization-from-1-16gb-to-22-4mb-53fdb4c53311"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]} |
|
|
|