用 Docker Compose 在云服务器上跑多服务:网络、数据卷与重启策略一次配对

举报
yd_224380536 发表于 2026/11/03 09:11:39 2026/11/03
【摘要】 用 Docker Compose 把 Web、数据库、缓存写进一个文件:自定义网络用服务名互访、具名卷保数据、健康检查保证依赖就绪、重启策略与备份一次配对,多服务部署可重复复现。

在云服务器上同时跑 Web、数据库和缓存时,直接用 docker run 一个个起很容易丢配置:容器重启后网络变了、数据卷挂错了、依赖启动顺序乱了。用 Docker Compose 把这些写进一个文件,部署就变成可重复的操作。

先准备环境。确认 Docker 与 Compose 已安装:执行 docker version 与 docker compose version,能看到版本号即可。把项目放在固定目录,例如 /opt/myapp,不要放在临时目录,避免重启后找不到文件。

再写 compose.yaml。核心是三个部分。services 定义每个服务,例如 web 用 nginx 镜像映射 80 端口,app 用自己构建的镜像,db 用官方数据库镜像,cache 用 Redis 镜像。networks 定义一个自定义网络,让服务之间用服务名互相访问,例如 app 连接数据库时主机名直接写 db,不用写 IP。volumes 定义数据卷,例如 db_data 挂到数据库的数据目录,这样容器删除重建后数据还在。

依赖与启动顺序要用 depends_on 加健康检查。只写 depends_on 不够,因为它只保证启动顺序、不保证服务就绪。给数据库加 healthcheck,例如用数据库自带的 ping 命令定时检测,等状态为 healthy 再启动应用,能减少应用启动时连不上库的报错。

端口与环境变量要分开管理。端口映射只暴露必须的入口,例如只把 Web 的 80、443 映射到宿主机,数据库和缓存不要映射到公网。敏感信息不要写进 compose.yaml,放在同目录的 .env 文件里引用,例如数据库密码写成 ${DB_PASSWORD},并把 .env 加入 .gitignore,避免提交到代码仓。

重启策略按服务定。Web 和应用设 restart: unless-stopped,服务器重启后自动恢复;一次性初始化任务不要设自动重启,否则会反复执行。改完配置后执行 docker compose up -d 启动,执行 docker compose ps 看状态,执行 docker compose logs -f app 看应用日志,确认没有反复重启。

上线前做三项检查。第一,执行 docker compose config 检查配置文件语法与变量是否解析正确,避免变量没替换就启动。第二,确认数据卷确实挂载:进数据库容器执行数据目录列表,或写入一条测试数据后重建容器再查,数据还在才算通过。第三,检查安全组与防火墙:云服务器安全组只放行 Web 入口,数据库端口不要对公网放行,内网服务之间走自定义网络即可。

日常运维也有固定动作。更新镜像时先执行 docker compose pull,再执行 docker compose up -d,让 Compose 按依赖顺序重建;回滚时把镜像标签改回上一版本再执行一次 up -d。磁盘紧张时不要直接删数据卷,先执行 docker system df 看占用,再清理无用的镜像与停止的容器。备份数据库时不要只备份容器,先用数据库自带工具导出逻辑备份,再把备份文件拷出宿主机并异地保存一份。

常见问题多半出在三处。一是服务名解析失败,通常是服务没加进同一个自定义网络,检查 networks 配置。二是数据丢了,通常是把宿主机目录与具名卷混用,或重建时误删了卷,恢复前先确认卷名与挂载路径。三是启动时连不上数据库,通常是健康检查没配或应用重试次数太少,给应用加几次重试、把超时设得宽松一点,往往就能稳定启动。

把网络、数据卷、依赖检查、重启策略和备份写进同一个 Compose 文件后,多服务部署就不再依赖个人记忆,换一台云服务器也能按同样步骤复现。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。