本文介紹如何使用 Dockerfile 對 Next.js 應用程式進行容器化,以實現自定義部署。
使用 Docker,我們可以將應用程式、其環境和依賴關係打包到一個隔離的容器中。容器由在 Linux 簡化版中執行的應用程式組成。Docker 映像是容器的藍圖,而容器則是映像的執行例項。
要對應用程式進行容器化,我們通過 Dockerfile 使用宣告式方法。Docker 會讀取並執行該檔案中定義的指令碼來構建和部署應用程式。
將應用程式容器化的優勢
將應用程式容器化有很多好處,比如可移植性、穩定性、可擴充套件性、安全性和效能。
可移植性
Docker 封裝了應用程式執行所需的一切,允許它們在不同環境之間輕鬆轉換。無論您是在本地執行,還是在使用不同作業系統的計算機上執行,抑或是在暫存和生產環境中執行,Docker 都會使用相同的元件構建應用程式,使其更易於編碼、測試和部署。
可擴充套件性
使用 Docker,你可以在不同的伺服器上執行多個容器例項。容器協調器可以處理增加的流量,而不會影響應用程式的效能。
穩定性
通過在隔離的容器中執行應用程式,在開發、測試和生產系統之間移動程式碼時,您可以獲得可預測的結果。由於容器中包含必要庫和軟體包的精確版本,因此可以最大限度地降低因依賴關係修訂不同而出現錯誤的風險。
此外,當您的應用程式部署到生產伺服器時,Docker 會將其與其他應用程式隔離,從而最大限度地降低受其他應用程式流量峰值影響的風險。
安全性
與傳統模式相比,Docker 容器能為您的工作負載提供更安全的環境。它們將應用程式分解成更小的、鬆散耦合的元件,每個元件之間相互隔離,從而大大降低了攻擊面。Docker 容器減少了黑客利用您的計算機系統的機會,並在發生攻擊時使漏洞更難擴散。在本文中瞭解更多資訊: Docker 容器的 9 個安全最佳實踐。
效能
容器不像虛擬機器和傳統伺服器那樣包含整個作業系統。因此,容器的佔用空間更小,構建和啟動速度更快。
要求
要使用 Docker 部署 Next.js 應用程式,您需要:
- 已安裝 Node.js 和 npm。
- 計算機上安裝並執行 Docker Desktop(或 Docker Engine)。
注:在本教學中,我們假設您對 Next.js 和 Docker 有基本的瞭解。
從 Next.js 應用程式開始
如果從現有應用程式開始,可以跳過這一步。如果從新開始,請建立一個新的 Next.js 應用程式:
- 開啟終端,安裝
create-next-app
:
npm i -g create-next-app@latest
- 導航到要安裝它的目錄,並在其自己的目錄中建立一個新的 Next.js 應用程式:
npx create-next-app@latest new-app
下一步會提示你為新應用程式指定一些配置選項。在本教學中,您只需接受建議的預設值即可。
- 要預覽新應用程式,請導航到 new-app 目錄並執行:
npm run dev
我們使用這種方法建立了一個應用程式示例,供您參考。
使用 Dockerfile 將 Next.js 應用程式容器化
要將 Next.js 應用程式容器化並使用 Docker 進行部署,請在應用程式的根目錄中建立一個 Dockerfile。
構建階段
在您的 Dockerfile 中,首先建立應用程式的 build
階段來構建您的應用程式:
- 使用官方最新穩定版 Node.js alpine 映像作為
build
階段的基礎映像:
FROM node:18-alpine AS build WORKDIR /app
- 將 package.json 和 package-lock.json 檔案複製到容器中:
COPY package*.json ./
- 用以下命令安裝應用程式依賴項:
RUN npm ci
- 將應用程式程式碼的其餘部分複製到容器中:
COPY . .
- 構建應用程式:
RUN npm run build
執行階段
建立 runtime
時階段以部署您的應用程式:
- 使用官方最新穩定版 Node.js alpine 映像作為
runtime
時階段的基礎映像:
FROM node:18-alpine AS runtime
- 將工作目錄設定為
/app
:
WORKDIR /app
- 將 package.json 和 package-lock.json 檔案複製到容器中:
COPY package*.json ./
- 只安裝生產依賴項:
RUN npm ci --only=production
- 將已構建的應用程式從
build
階段複製到runtime
階段:
COPY --from=build /app/.next ./.next
- 將公共資料夾從code>build階段複製到
runtime
階段:
COPY --from=build /app/public ./public
- 公開 3000 埠:
EXPOSE 3000
- 以非特權使用者身份執行容器:
USER node
- 啟動 Next.js 應用程式:
CMD ["npm", "start"]
我們最終得到了下面的 Dockerfile:
FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build FROM node:18-alpine AS runtime WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY --from=build /app/.next ./.next COPY --from=build /app/public ./public EXPOSE 3000 USER node CMD ["npm", "start"]
使用 Docker 在本地部署應用程式
儘管您仍然可以通過執行 run npm dev
來預覽應用程式,但還是要使用 Docker 在本地執行,以模擬生產環境,並測試和預覽您對應用程式的 Dockerfile 所做的任何更改。
預覽應用程式:
- 使用
docker build
構建應用程式:
docker build -t next-docker .
- 執行容器預覽應用程式:
docker run -p 3000:3000 next-docker
- 在瀏覽器上開啟
http://localhost:3000
。
小結
在本文中,我們討論了與傳統模式相比使用 Docker 的一些優勢;我們介紹瞭如何為 Next.js 應用程式建立 Dockerfile,使用 Docker 在本地構建和部署。
評論留言