<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Docker鏡像瘦身:從1.43G到22.4MB

          共 2956字,需瀏覽 6分鐘

           ·

          2022-04-18 05:35


          Docker 鏡像的大小對于系統(tǒng)的 CI/CD 等都有影響,尤其是云部署場景。我們在生產(chǎn)實踐中都會做瘦身的操作,盡最大的可能使用 Size 小的鏡像完成功能。


          下文是一個簡單的 ReactJS 程序上線的瘦身體驗,希望可以幫助大家找到鏡像瘦身的方向和靈感。


          如果你正在做 Web 開發(fā)相關工作,那么你可能已經(jīng)知道容器化的概念,以及知道它強大的功能等等。


          但在使用 Docker 時,鏡像大小至關重要。我們從 create-react-app (https://reactjs.org/docs/create-a-new-react-app.html)獲得的樣板項目通常都超過 1.43 GB。


          今天,我們將容器化一個 ReactJS 應用程序,并學習一些關于如何減少鏡像大小并提高性能的技巧。


          我們將以 ReactJS 為例,但它適用于任何類型的 NodeJS 應用程序。


          步驟 1:創(chuàng)建項目


          借助腳手架通過命令行模式創(chuàng)建 React 項目:
          npx?create-react-app?docker-image-test

          命令執(zhí)行成功后將生成一個基礎 React 應用程序架構。


          我們可以進入項目目錄安裝依賴并運行項目:
          cd?docker-image-test
          yarn?install
          yarn?start

          通過訪問 http://localhost:3000 可以訪問已經(jīng)啟動的應用程序。

          步驟 2:構建第一個鏡像


          在項目的根目錄中創(chuàng)建一個名為 Dockerfile 的文件,并粘貼以下代碼:
          FROM?node:12

          WORKDIR?/app

          COPY?package.json?./

          RUN?yarn?install

          COPY?.?.

          EXPOSE?3000

          CMD?["yarn",?"start"]

          注意,這里我們從 Docker 倉庫獲得基礎鏡像 Node:12,然后安裝依賴項并運行基本命令。(我們不會在這里討論 Docker 命令的細節(jié))


          現(xiàn)在可以通過終端為容器構建鏡像:
          docker?build?-t?docker-image-test?.

          Docker 構建鏡像完成之后,你可以使用此命令查看已經(jīng)構建的鏡像:
          docker?images

          在查詢結果列表的頂部,是我們新創(chuàng)建的圖像,在最右邊,我們可以看到圖像的大小。目前是 1.43GB。

          我們使用以下命令運行鏡像:
          docker?run?--rm?-it?-p?3000:3000/tcp?docker-image-test:latest


          打開瀏覽器并且刷新頁面驗證其可以正常運行。



          步驟 3:修改基礎鏡像


          先前的配置中我們用 node:12 作為基礎鏡像。但是傳統(tǒng)的 Node 鏡像是基于 Ubuntu 的,對于我們簡單的 React 應用程序來說這大可不必。


          從 DockerHub(官方 Docker 鏡像注冊表)中我們可以看到,基于 alpine-based 的 Node 鏡像比基于 Ubuntu 的鏡像小得多,而且它們的依賴程度非常低。


          下面顯示了這些基本圖像的大小比較:

          現(xiàn)在我們將使用node:12-alpine作為我們的基礎鏡像,看看會發(fā)生什么。
          FROM?node:12-alpine

          WORKDIR?/app

          COPY?package.json?./

          RUN?yarn?install

          COPY?.?.

          EXPOSE?3000

          CMD?["yarn",?"start"]

          然后我們以此構建我們的鏡像,并與之前做對比。

          哇!我們的鏡像大小減少到只有 580MB,這是一個很大的進步。但還能做得更好嗎?


          步驟 4:多級構建


          在之前的配置中,我們會將所有源代碼也復制到工作目錄中。


          但這大可不必,因為從發(fā)布和運行來看我們只需要構建好的運行目錄即可。因此,現(xiàn)在我們將引入多級構建的概念,以減少不必要的代碼和依賴于我們的最終鏡像。


          配置是這樣的:
          #?STAGE?1

          FROM?node:12-alpine?AS?build

          WORKDIR?/app

          COPY?package.json?./

          RUN?yarn??install

          COPY?.?/app

          RUN?yarn?build


          #?STAGE?2

          FROM?node:12-alpine

          WORKDIR?/app

          RUN?npm?install?-g?webserver.local

          COPY?--from=build?/app/build?./build

          EXPOSE?3000

          CMD?webserver.local?-d?./build

          在第一階段,安裝依賴項并構建我們的項目。


          在第二階段,我們復制上一階段構建產(chǎn)物目錄,并使用它來運行應用程序。


          這樣我們在最終的鏡像中就不會有不必要的依賴和代碼。


          接下來,構建鏡像成功后并從列表中查看鏡像:

          現(xiàn)在我們的鏡像大小只有 97.5MB。這簡直太棒了。


          步驟 5:使用 Nginx


          我們正在使用 Node 服務器運行 ReactJS 應用程序的靜態(tài)資源,但這不是靜態(tài)資源運行的最佳選擇。


          我們嘗試使用 Nginx 這類更高效、更輕量級的服務器來運行資源應用程序,也可以盡可能提高其性能,并且減少鏡像的量。


          我們最終的 Docker 配置文件看起來像這樣:
          #?STAGE?1

          FROM?node:12-alpine?AS?build

          WORKDIR?/app

          COPY?package.json?./

          RUN?yarn??install

          COPY?.?/app

          RUN?yarn?build

          #?STAGE?2

          FROM?nginx:stable-alpine

          COPY?--from=build?/app/build?/usr/share/nginx/html

          EXPOSE?80

          CMD?["nginx",?"-g",?"daemon?off;"]

          我們正在改變 Docker 配置的第二階段,以使用 Nginx 來服務我們的應用程序。


          然后使用當前配置構建鏡像。

          鏡像大小減少到只有 22.4MB!


          同時,我們正在使用一個性能更好的服務器來服務我們出色的應用程序。


          我們可以使用以下命令驗證應用程序是否仍在工作。
          docker?run?--rm??-it?-p?3000:80/tcp?docker-image-test:latest

          注意,我們將容器的 80 端口暴露給外部,因為默認情況下,Nginx 將在容器內部的 80 端口上可用。


          所以這些是一些簡單的技巧,你可以應用到你的任何 NodeJS 項目,以大幅減少鏡像大小。


          現(xiàn)在,您的容器確實更加便攜和高效了。今天就到這里。編碼快樂!

          作者:張亞龍譯

          出處:轉載自公眾號分布式實驗室(ID:dockerone)


          END


          推薦閱讀

          一鍵生成Springboot & Vue項目!【畢設神器】

          Java可視化編程工具系列(一)

          Java可視化編程工具系列(二)


          順便給大家推薦一個GitHub項目,這個 GitHub 整理了上千本常用技術PDF,絕大部分核心的技術書籍都可以在這里找到,

          GitHub地址:https://github.com/javadevbooks/books

          電子書已經(jīng)更新好了,你們需要的可以自行下載了,記得點一個star,持續(xù)更新中..




          瀏覽 53
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  曰韩一级高晴 | 久久黄色免费 | 奇米成人在线 | 欧美精品一卡 | 久久久久久久 |