跳转到内容

Docker 与运行环境

“在我电脑上能运行”常常是因为系统、Node 版本、依赖和环境变量刚好不同。Docker 把应用和运行所需的一部分环境打包成可重复启动的镜像。

  • 镜像(Image):可复用的构建模板;
  • 容器(Container):镜像启动后的运行实例;
  • 仓库(Registry):保存和分发镜像的地方;
  • Volume:在容器重建后仍保留的数据;
  • Compose:用一个文件描述多个相关容器。

容器不是完整虚拟机;它共享宿主机内核,隔离范围和安全模型需要单独理解。

应用端口 → 容器端口 → 宿主机端口
应用配置 ← 环境变量
持久数据 ← Volume
构建步骤 ← Dockerfile

容器删除后,写在容器临时文件系统里的数据可能消失。数据库、上传文件和日志要设计持久化和备份。

# 示例版本;实际以项目 engines 和官方 LTS 为准
FROM node:22-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "run", "start"]

这只是示例,Node 版本、构建命令、启动命令和输出目录必须以项目文档为准。生产环境应使用经过验证的版本,不要盲目复制。

  • 端口是否只暴露必要范围;
  • 环境变量是否在运行时注入而不是写进镜像;
  • .dockerignore 是否排除了密钥、依赖缓存和本地构建物;
  • 镜像是否锁定版本并定期更新;
  • 应用是否有健康检查和优雅停止;
  • 日志是否可查看且没有敏感数据。

纯静态网站、简单文档和已有平台自动构建的项目,通常直接连接 Git 部署更省心。只有当需要固定运行环境、同时运行多个服务或迁移到自有服务器时,再引入 Docker。

不要把 API Key 写进 Dockerfile 或提交到镜像仓库;不要为了“能跑”默认使用 --privileged、开放 Docker daemon 或把所有端口暴露公网。生产部署要限制资源、配置备份和回滚。