Docker 入门:用 Compose 一条命令跑起前后端两个服务
很多新手第一次接触前后端分离项目时,都会被一串命令吓住:先启动前端,再启动后端,还要记住端口、环境变量和启动顺序。只要其中一步出错,页面就可能一片空白。其实,Docker Compose 就是为了解决这种麻烦而生的工具:它用一个配置文件把多个服务组织在一起,一条命令就能全部跑起来。
Compose 到底是什么
可以把 Compose 理解成一份“服务清单”。我们不再逐个输入 docker run 命令,而是把服务名、镜像、端口、环境变量和依赖关系写进一个名为 docker-compose.yml 的文件。执行 docker compose up 后,Compose 会按清单创建网络、启动容器,并把它们的日志汇总到一个终端里。需要停止时,一条 docker compose down 就能清理容器和网络。
这种方式最大的好处是可重复。同一份文件在同事的电脑上、在测试机上都能跑出基本一致的环境,不再出现“在我电脑上明明可以”的尴尬。对新手来说,它还降低了记忆负担:不用背一长串参数,改配置就是改文件。
准备一个最小项目
假设我们要做一个极简的留言板。前端是一个静态页面,提供输入框和留言列表;后端是一个小型接口服务,负责接收留言并返回列表。为了演示方便,前端可以用 Nginx 托管静态文件,后端可以用 Node.js 写一个不到一百行的接口。这里不需要真实数据库,先用内存数组保存留言,重点是把两个服务连通。
项目结构可以这样安排:根目录放 docker-compose.yml,前端代码放在 frontend 目录,后端代码放在 backend 目录。前端目录里有一个 index.html 和一个简单的脚本,请求后端接口;后端目录里有 package.json 和 server.js,对外提供留言接口。这样的结构清晰,也方便以后把内存存储换成真正的数据库。
写一份能跑的 Compose 文件
下面是一份最小可用的配置:
services:
frontend:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./frontend:/usr/share/nginx/html:ro
depends_on:
- backend
backend:
build: ./backend
ports:
- "3000:3000"
environment:
- PORT=3000
这里有几个要点值得新手注意。第一,frontend 使用现成的 Nginx 镜像,并把本地 frontend 目录挂载到容器里,这样改页面后刷新浏览器就能看到效果。第二,backend 使用 build,Compose 会按 backend 目录里的 Dockerfile 构建镜像,适合我们自己的代码。第三,ports 的写法是“主机端口:容器端口”,访问本地 8080 端口就能看到前端,访问本地 3000 端口的留言接口就能看到后端返回。
在 Compose 创建的默认网络里,服务之间可以直接用服务名互相访问。也就是说,前端页面在浏览器里请求后端时,如果直接写服务名加端口会失败,因为这段请求发生在用户浏览器里,而不是容器网络里。新手最容易在这里踩坑。稳妥的做法是让 Nginx 做一层反向代理,或者在开发阶段让前端直接请求本地 3000 端口。理解“谁在发请求”这一个问题,就能避开很多联调故障。
一条命令跑起来
在项目根目录执行:
docker compose up --build
第一次运行会下载 Nginx 镜像并构建后端镜像,稍等片刻后,终端里会出现两个服务的日志。打开浏览器访问本地 8080 端口,输入一条留言并提交,如果列表里出现了这条留言,说明前后端已经连通。想看某个服务的日志,可以用 docker compose logs -f backend;想停止全部服务,按 Ctrl+C 后执行 docker compose down。
如果启动失败,先不要急着重装 Docker。常见原因有三个:端口被占用、Dockerfile 路径写错、后端依赖没有安装成功。端口被占用时,改一下主机端口再试;路径问题可以对照文件结构逐级检查;依赖问题则看后端构建日志的第一条报错,往往就是缺包或网络问题。把报错信息原样复制下来搜索,通常比反复试错更快。
从能跑到好维护
跑通之后,还可以做三件小事让项目更好维护。第一是把环境变量抽出来,写进 .env 文件,避免把端口、密钥硬编码在 Compose 文件里。第二是给后端加上健康检查或启动等待,避免前端在后端还没就绪时就报错。第三是把常用命令写进 README,比如启动、停止、查看日志和清理数据,让新加入的同事照着做就能跑起来。
等熟悉了这套流程,再扩展也很容易:加一个数据库服务只需要在 Compose 文件里再写一个 service,并把连接信息通过环境变量传给后端;想换成生产部署,也可以基于同一份文件做调整,而不是从零重写。Compose 的价值就在于,它把“多个服务怎么配合”这件事从口头约定变成了可以版本管理的配置文件。
小结
对初学者来说,学 Docker 不必一开始就钻进镜像分层和网络细节。先用 Compose 把前后端两个服务跑起来,亲手改一次端口、改一次环境变量、看一次日志,概念自然就清楚了。当你能用一条命令复现整个开发环境时,就已经迈过了容器入门最关键的一步。
- 点赞
- 收藏
- 关注作者
评论(0)