如何通过SSH安全部署多服务Docker Compose项目?
安全部署Docker Compose项目的实操步骤
一、本地构建安全镜像
- 给前端(Next.js)、后端(Nest.js)分别写多阶段Dockerfile,彻底剥离源码:
- Next.js:先在Node.js镜像里完成依赖安装和构建(生成
.next目录),再把.next、依赖包、启动脚本复制到轻量的Alpine镜像里,最终镜像完全没有src文件夹。 - Nest.js:同理,先在Node镜像里编译TypeScript到
dist目录,再把dist、依赖复制到运行镜像,剔除源码。
- Next.js:先在Node.js镜像里完成依赖安装和构建(生成
- 构建镜像时打明确版本标签,比如
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
相关产品推荐
相关产品推荐

