You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SSH安全部署多服务Docker Compose项目?

安全部署Docker Compose项目的实操步骤

一、本地构建安全镜像

  • 给前端(Next.js)、后端(Nest.js)分别写多阶段Dockerfile,彻底剥离源码:
    • Next.js:先在Node.js镜像里完成依赖安装和构建(生成.next目录),再把.next、依赖包、启动脚本复制到轻量的Alpine镜像里,最终镜像完全没有src文件夹。
    • Nest.js:同理,先在Node镜像里编译TypeScript到dist目录,再把dist、依赖复制到运行镜像,剔除源码。
  • 构建镜像时打明确版本标签,比如my-nextjs-frontend:v1.0.0、my-nestjs-backend:v1.0.0,方便后续版本迭代和回滚。
  • 镜像存储选私有镜像仓库:比如Docker Hub私有库、或者自己搭的Harbor。如果不想折腾私有库,也可以用docker save my-frontend:v1.0.0 > frontend.tar把镜像导出成tar包,通过scp传到远程服务器,再用docker load < frontend.tar导入。

二、远程服务器部署配置

  • 远程服务器只装Docker和Docker Compose,别装Node.js、MySQL编译工具这类无关软件,减少攻击面。
  • 准备精简版docker-compose.yml:去掉所有build字段,直接用本地构建好的镜像(比如image: my-nextjs-frontend:v1.0.0)。同时做好这些配置:
    • 服务间用Docker内部网络通信,不要随便暴露端口到公网。
    • 敏感信息(比如MySQL密码)用.env文件或者Docker Secrets管理,别硬写在yml里,.env文件权限设为chmod 600,仅限所有者读取。
    • MySQL数据挂载到服务器本地目录(比如./mysql-data:/var/lib/mysql),避免容器销毁丢失数据。
  • 如果用私有镜像仓库,远程服务器先执行docker login登录仓库,再拉取镜像;用tar包的话直接导入即可,然后运行docker-compose up -d启动服务。

三、关键安全加固

  • 防火墙只开必要端口:Nginx的80/443对外,phpMyAdmin别直接暴露公网——要么用SSH隧道本地访问,要么通过Nginx加IP白名单限制访问。
  • 容器用普通用户运行:在Dockerfile里创建非root用户(比如RUN useradd -m appuser,然后USER appuser),避免容器以root权限运行带来的风险。
  • 定期更新:服务器系统、Docker镜像、依赖包要定期更新,修复安全漏洞。

关于“上传源码到虚拟机是否是行业标准”

绝对不是。现在主流做法是CI/CD流水线+私有镜像仓库:代码存在Git仓库,通过GitHub Actions、GitLab CI这类工具自动构建镜像、推送到私有仓库,远程服务器只需要拉取镜像部署,全程碰不到源码。哪怕是小项目,本地构建镜像再传远程也比传源码安全——既避免源码泄露风险,又减少服务器上的冗余依赖,降低被攻击的概率。

内容的提问来源于stack exchange,提问作者luka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 05:44:56