如何將Next.js應用程式容器化

如何將Next.js應用程式容器化

本文介紹如何使用 DockerfileNext.js 應用程式進行容器化,以實現自定義部署。

使用 Docker,我們可以將應用程式、其環境和依賴關係打包到一個隔離的容器中。容器由在 Linux 簡化版中執行的應用程式組成。Docker 映像是容器的藍圖,而容器則是映像的執行例項。

要對應用程式進行容器化,我們通過 Dockerfile 使用宣告式方法。Docker 會讀取並執行該檔案中定義的指令碼來構建和部署應用程式。

將應用程式容器化的優勢

將應用程式容器化有很多好處,比如可移植性、穩定性、可擴充套件性、安全性和效能。

可移植性

Docker 封裝了應用程式執行所需的一切,允許它們在不同環境之間輕鬆轉換。無論您是在本地執行,還是在使用不同作業系統的計算機上執行,抑或是在暫存和生產環境中執行,Docker 都會使用相同的元件構建應用程式,使其更易於編碼、測試和部署。

可擴充套件性

使用 Docker,你可以在不同的伺服器上執行多個容器例項。容器協調器可以處理增加的流量,而不會影響應用程式的效能。

穩定性

通過在隔離的容器中執行應用程式,在開發、測試和生產系統之間移動程式碼時,您可以獲得可預測的結果。由於容器中包含必要庫和軟體包的精確版本,因此可以最大限度地降低因依賴關係修訂不同而出現錯誤的風險。

此外,當您的應用程式部署到生產伺服器時,Docker 會將其與其他應用程式隔離,從而最大限度地降低受其他應用程式流量峰值影響的風險。

安全性

與傳統模式相比,Docker 容器能為您的工作負載提供更安全的環境。它們將應用程式分解成更小的、鬆散耦合的元件,每個元件之間相互隔離,從而大大降低了攻擊面。Docker 容器減少了黑客利用您的計算機系統的機會,並在發生攻擊時使漏洞更難擴散。在本文中瞭解更多資訊: Docker 容器的 9 個安全最佳實踐

效能

容器不像虛擬機器和傳統伺服器那樣包含整個作業系統。因此,容器的佔用空間更小,構建和啟動速度更快。

要求

要使用 Docker 部署 Next.js 應用程式,您需要:

注:在本教學中,我們假設您對 Next.js 和 Docker 有基本的瞭解。

從 Next.js 應用程式開始

如果從現有應用程式開始,可以跳過這一步。如果從新開始,請建立一個新的 Next.js 應用程式:

  1. 開啟終端,安裝 create-next-app
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm i -g create-next-app@latest
npm i -g create-next-app@latest
npm i -g create-next-app@latest
  1. 導航到要安裝它的目錄,並在其自己的目錄中建立一個新的 Next.js 應用程式:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npx create-next-app@latest new-app
npx create-next-app@latest new-app
npx create-next-app@latest new-app

下一步會提示你為新應用程式指定一些配置選項。在本教學中,您只需接受建議的預設值即可。

  1. 要預覽新應用程式,請導航到 new-app 目錄並執行:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
npm run dev
npm run dev
npm run dev

我們使用這種方法建立了一個應用程式示例,供您參考。

使用 Dockerfile 將 Next.js 應用程式容器化

要將 Next.js 應用程式容器化並使用 Docker 進行部署,請在應用程式的根目錄中建立一個 Dockerfile

構建階段

在您的 Dockerfile 中,首先建立應用程式的 build 階段來構建您的應用程式:

  1. 使用官方最新穩定版 Node.js alpine 映像作為 build 階段的基礎映像:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
FROM node:18-alpine AS build
WORKDIR /app
FROM node:18-alpine AS build WORKDIR /app
FROM node:18-alpine AS build
WORKDIR /app
  1. package.jsonpackage-lock.json 檔案複製到容器中:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COPY package*.json ./
COPY package*.json ./
COPY package*.json ./
  1. 用以下命令安裝應用程式依賴項:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
RUN npm ci
RUN npm ci
RUN npm ci
  1. 將應用程式程式碼的其餘部分複製到容器中:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COPY . .
COPY . .
COPY . .
  1. 構建應用程式:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
RUN npm run build
RUN npm run build
RUN npm run build

執行階段

建立 runtime 時階段以部署您的應用程式:

  1. 使用官方最新穩定版 Node.js alpine 映像作為 runtime 時階段的基礎映像:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
FROM node:18-alpine AS runtime
FROM node:18-alpine AS runtime
FROM node:18-alpine AS runtime
  1. 將工作目錄設定為 /app
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
WORKDIR /app
WORKDIR /app
WORKDIR /app
  1. package.jsonpackage-lock.json 檔案複製到容器中:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COPY package*.json ./
COPY package*.json ./
COPY package*.json ./
  1. 只安裝生產依賴項:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
RUN npm ci --only=production
RUN npm ci --only=production
RUN npm ci --only=production
  1. 將已構建的應用程式從 build 階段複製到 runtime 階段:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COPY --from=build /app/.next ./.next
COPY --from=build /app/.next ./.next
COPY --from=build /app/.next ./.next
  1. 將公共資料夾從code>build階段複製到 runtime 階段:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COPY --from=build /app/public ./public
COPY --from=build /app/public ./public
COPY --from=build /app/public ./public
  1. 公開 3000 埠:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
EXPOSE 3000
EXPOSE 3000
EXPOSE 3000
  1. 以非特權使用者身份執行容器:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
USER node
USER node
USER node
  1. 啟動 Next.js 應用程式:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
CMD ["npm", "start"]
CMD ["npm", "start"]
CMD ["npm", "start"]

我們最終得到了下面的 Dockerfile

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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"]
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"]
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 所做的任何更改。

預覽應用程式:

  1. 使用 docker build 構建應用程式:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker build -t next-docker .
docker build -t next-docker .
docker build -t next-docker .
  1. 執行容器預覽應用程式:
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
docker run -p 3000:3000 next-docker
docker run -p 3000:3000 next-docker
docker run -p 3000:3000 next-docker
  1. 在瀏覽器上開啟 http://localhost:3000

小結

在本文中,我們討論了與傳統模式相比使用 Docker 的一些優勢;我們介紹瞭如何為 Next.js 應用程式建立 Dockerfile,使用 Docker 在本地構建和部署。

評論留言