Skip to Content
Welcome to yujie-code-blogs build by Nextra 4.0 🎉
Docker 部署Docker 使用

Docker 使用

安装

  • 个人电脑安装
  1. 直接去官网下载docker的桌面端
  2. 下载好后在设置中配置Docker Engine
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev"] }

Ubuntu 24.x服务器以及用户为ubuntu来举例

# 下载 script 脚本 curl -fsSL https://get.docker.com -o install-docker.sh # 编辑脚本内容 cat install-docker.sh # 在末尾加上--dry-run来运行脚本,并编辑执行步骤 sh install-docker.sh --dry-run # 使用root权限执行脚本,或使用sudo执行 sudo sh install-docker.sh

一般只需执行第一步和最后一步即可安装

修改docker加速镜像站

sudo vim /etc/docker/daemon.json
{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev" ] } // 上面的镜像站不一定有用,大多数镜像网站都已经关停 { "registry-mirrors": [ "https://docker.lms.run" ] }
# 重启docker服务 sudo service docker restart
  • 2026年仍然能使用的镜像站

![image-20260513205945310](/Users/gegepos/Library/Application Support/typora-user-images/image-20260513205945310.png)

Dockerfile编写

ARG NODE_VERSION=24.13.0-slim # ============================================ # Stage 1: 安装依赖(需要完整 monorepo 结构) # ============================================ FROM node:${NODE_VERSION} AS dependencies WORKDIR /app COPY package.json pnpm-workspace.yaml pnpm-lock.yaml .npmrc* ./ COPY apps/docs/package.json ./apps/docs/ # 如果 docs 依赖其他 workspace,也要复制它们的 package.json # COPY packages/ui/package.json ./packages/ui/ RUN --mount=type=cache,target=/root/.local/share/pnpm/store \ corepack enable pnpm && \ pnpm install --frozen-lockfile # ============================================ # Stage 2: 构建(在完整 monorepo 里构建) # ============================================ FROM node:${NODE_VERSION} AS builder WORKDIR /app COPY --from=dependencies /app/node_modules ./node_modules COPY . . ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 # 在 docs 目录下执行构建 WORKDIR /app/apps/docs RUN corepack enable pnpm && pnpm build # ============================================ # Stage 3: 运行(只保留 standalone 产物,路径是 /app) # ============================================ FROM node:${NODE_VERSION} AS runner # 工作目录直接是 /app,不会有 apps/docs 子目录 WORKDIR /app ENV NODE_ENV=production ENV PORT=3000 ENV HOSTNAME="0.0.0.0" # 关键:把 standalone 产物复制到 /app 根目录 # 复制后,/app 下直接就有 server.js,而不是 /app/apps/docs/server.js COPY --from=builder --chown=node:node /app/apps/docs/.next/standalone/ ./ # 补充复制静态资源到正确位置 RUN mkdir -p .next && chown node:node .next COPY --from=builder --chown=node:node /app/apps/docs/.next/static ./.next/static COPY --from=builder --chown=node:node /app/apps/docs/public ./public USER node EXPOSE 3000 CMD ["node", "apps/docs/server.js"]

注意:

  1. 这里的 Dockerfile 里有两个 FROM 指令,第一个 FROM 指令是 node:${NODE_VERSION},第二个 FROM 指令是 node:${NODE_VERSION},这两个指令的作用是为了构建不同阶段的镜像,第一个阶段是安装依赖,第二个阶段是构建。
  2. 第二个阶段的 WORKDIR 指令是 /app,而不是 /app/apps/docs,因为我们只需要把 standalone 产物复制到 /app 根目录,不需要把 apps/docs 目录也复制过来。
  3. 第二个阶段的 COPY 指令把 apps/docs/.next/standalone/ 目录复制到 /app 根目录,而不是把 apps/docs 目录也复制过来。
  4. 第二个阶段的 USER 指令是 node,而不是 root,因为我们不需要以 root 用户运行容器。
  5. 第二个阶段的 CMD 指令是 ["node", "apps/docs/server.js"],而不是 ["node", "server.js"],因为我们只需要把 standalone 产物复制到 /app 根目录,不需要把 apps/docs 目录也复制过来,所以 server.js 就在 /app 根目录。