本文介绍如何使用 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 在本地构建和部署。
原文地址:https://www.wbolt.com/containerize-next-js.html