如何将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
npm i -g create-next-app@latest
  1. 导航到要安装它的目录,并在其自己的目录中创建一个新的 Next.js 应用程序:
npx create-next-app@latest new-app

下一步会提示你为新应用程序指定一些配置选项。在本教程中,您只需接受建议的默认值即可。

  1. 要预览新应用程序,请导航到 new-app 目录并运行:
npm run dev

我们使用这种方法创建了一个应用程序示例,供您参考。

使用 Dockerfile 将 Next.js 应用程序容器化

要将 Next.js 应用程序容器化并使用 Docker 进行部署,请在应用程序的根目录中创建一个 Dockerfile

构建阶段

在您的 Dockerfile 中,首先创建应用程序的 build 阶段来构建您的应用程序:

  1. 使用官方最新稳定版 Node.js alpine 映像作为 build 阶段的基础映像:
FROM node:18-alpine AS build
WORKDIR /app
  1. package.jsonpackage-lock.json 文件复制到容器中:
COPY package*.json ./
  1. 用以下命令安装应用程序依赖项:
RUN npm ci
  1. 将应用程序代码的其余部分复制到容器中:
COPY . .
  1. 构建应用程序:
RUN npm run build

运行阶段

创建 runtime 时阶段以部署您的应用程序:

  1. 使用官方最新稳定版 Node.js alpine 映像作为 runtime 时阶段的基础映像:
FROM node:18-alpine AS runtime
  1. 将工作目录设置为 /app
WORKDIR /app
  1. package.jsonpackage-lock.json 文件复制到容器中:
COPY package*.json ./
  1. 只安装生产依赖项:
RUN npm ci --only=production
  1. 将已构建的应用程序从 build 阶段复制到 runtime 阶段:
COPY --from=build /app/.next ./.next
  1. 将公共文件夹从code>build阶段复制到 runtime 阶段:
COPY --from=build /app/public ./public
  1. 公开 3000 端口:
EXPOSE 3000
  1. 以非特权用户身份运行容器:
USER node
  1. 启动 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 所做的任何更改。

预览应用程序:

  1. 使用 docker build 构建应用程序:
docker build -t next-docker .
  1. 运行容器预览应用程序:
docker run -p 3000:3000 next-docker
  1. 在浏览器上打开 http://localhost:3000

小结

在本文中,我们讨论了与传统模式相比使用 Docker 的一些优势;我们介绍了如何为 Next.js 应用程序创建 Dockerfile,使用 Docker 在本地构建和部署。

评论留言