最近使用nextjs
网站开发,希望使用docker
进行生产环境的部署,减少环境的依赖可重复部署操作。我采用的是Dockerfile
编写应用镜像方式+ docker-compose
实现容器部署的功能。
编写Dockerfile文件
1、在项目根目录创建Dockerfile文件
构建应用镜像的基础是创建对应的dockerfile文件,常规的我们会选择将dockerfile文件创建在项目的根目录,当然也可以自定义指定位置,只要在之后的构建过程指定路径就可以了
2、dockerfile编写依赖
我这里为了减少容器的大小,所以dockerfile使用了多阶段构建的方式实现,首先是依赖阶段实现依赖库的下载,具体如下:
FROM node:18-alpine AS deps
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk update
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn config set registry https://registry.npm.taobao.org
RUN yarn install --frozen-lockfile
需要注意:
-
nodejs
对应版本,查看package.json
中的版本要求
"engines": {
"node": ">=18.17.0"
}
-
我这里将软件源修改为国内镜像,默认的国外镜像可能导致软件无法更新下载
-
更新前端库镜像为淘宝镜像
3、构建阶段
由于已经完成依赖的下载,构建阶段只需要进行编译打包即可:
FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN yarn config set registry https://registry.npm.taobao.org
RUN yarn build && yarn install --production
4、运行阶段
完成构建后,就需要我们配置容器的基础配置,如环境变量、工作目录、监听端口、应用启动命令等:
FROM node:18-alpine AS runner
WORKDIR /app
ENV NEXT_TELEMETRY_DISABLED 1
ENV NODE_ENV production
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nextjs -u 1001
RUN yarn config set registry https://registry.npm.taobao.org
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node_modules/.bin/next", "start"]
运行配置
1、编写docker-compse.yml文件
完成dockerfile
文件编写后,我们就需要通过编写docker-compose.yml
配置文件来启动容器了。我这里是使用nginx
来部署,配置如下:
version: "3.1"
services:
db:
image: mysql:8
command:
--default-authentication-plugin=mysql_native_password
--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
--group_concat_max_len=102400
restart: unless-stopped
volumes:
- ./data/mysql/:/var/lib/mysql/
environment:
TZ: Asia/Shanghai # 指定时区
MYSQL_ROOT_PASSWORD: "nextjs" # 配置root用户密码
MYSQL_DATABASE: "nextjs" # 业务库名
MYSQL_USER: "nextjs" # 业务库用户名
MYSQL_PASSWORD: "nextjs" # 业务库密码
ports:
- 3306:3306
nextjs:
build: .
ports:
- "3000:3000"
environment:
TZ: Asia/Shanghai # 指定时区
container_name: nextjs
volumes:
- ./:/app/
depends_on:
- db
restart: unless-stopped
nginx:
image: nginx:mainline-alpine
container_name: nginxserver
restart: unless-stopped
ports:
- "80:80"
volumes:
- ./.next:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
networks:
nodeapp-network:
driver: bridge
2、添加nginx配置
如上可以看出,我一共创建了三个容器,一个数据容器db
,一个nextjs
容器是我们的应用还有一个nginx
容器是web
服务,nginx
里还需要将我们的配置文件映射到容器内,nginx-conf
内容如下:
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name patientplatypus.com www.patientplatypus.com localhost;
# location /back {
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header Host $http_host;
# proxy_set_header X-NginX-Proxy true;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# proxy_pass http://nodejs:8000;
# }
location / {
proxy_pass http://nextjs:3000;
}
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
}
3、启动容器
只需要我们的宿主机器安装了docker-compse
即可,直接使用如下命令:
$docker-compose up -d
原文始发于微信公众号(胖蔡话前端):使用Docker部署nextjs应用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/223021.html