Docker Compose 入门:一条命令拉起整套服务

举报
神的孩子都在跳舞 发表于 2026/11/07 10:11:27 2026/11/07
【摘要】 为什么需要 Compose只跑一个容器时,一条 docker run 就够了。可一旦服务多起来,事情立刻变烦:先建网络,再逐个起容器,每个容器都要写一遍端口映射、环境变量和挂载目录,重启一次就要重复一次。更麻烦的是启动顺序,数据库还没起来,应用就已经开始连接,结果连不上直接退出。手工维护这些命令既容易出错,也很难交给同事复现。Docker Compose 就是为了解决这个问题:把一整套服务...

为什么需要 Compose

只跑一个容器时,一条 docker run 就够了。可一旦服务多起来,事情立刻变烦:先建网络,再逐个起容器,每个容器都要写一遍端口映射、环境变量和挂载目录,重启一次就要重复一次。更麻烦的是启动顺序,数据库还没起来,应用就已经开始连接,结果连不上直接退出。手工维护这些命令既容易出错,也很难交给同事复现。Docker Compose 就是为了解决这个问题:把一整套服务写进一个文件里,用一条命令拉起来,配置即文档,谁拿到都能跑出同一套环境。

compose.yaml 的结构

Compose 的配置文件通常叫 compose.yaml,核心只有三块。services 定义每个服务:用什么镜像、映射哪些端口、挂载哪些目录、设置哪些环境变量。networks 定义容器之间的网络,同一个网络里的服务可以直接用服务名互相访问,不用写 IP。volumes 定义数据卷,让数据库这类有状态服务的数据在容器重建后还能保留下来。写清楚这三块,一套多容器应用的骨架就有了。

一个可跑的示例:Nginx + 简单 Web 服务

下面是一个最小的例子,Nginx 对外提供页面,另一个服务提供接口:

services:
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
  api:
    image: python:3.12-slim
    command: python -m http.server 8000
    working_dir: /app
    volumes:
      - ./app:/app
    depends_on:
      - web

在文件所在目录执行 docker compose up -d,打开本机 8080 端口就能看到 Nginx 返回的页面,api 服务则在后台提供数据。想改页面内容,改 html 目录下的文件即可,不用重建镜像。

常用命令

up -d 以后台方式启动整套服务,down 停止并删除容器,ps 查看各服务运行状态,logs -f 跟踪某个服务的日志输出,restart 重启指定服务,config 在真正启动前检查配置文件写得对不对。日常开发基本靠这几个命令就能运转。

常见坑

第一个坑是端口冲突。宿主机端口一旦被别的程序占用,容器就起不来,报错里会出现 address already in use,改一个空闲端口映射即可。第二个坑是 depends_on 的语义,它只保证启动顺序,不保证服务就绪:数据库容器启动了,不代表数据库已经可以接受连接。稳妥的做法是在应用里加重试,或者用 healthcheck 等健康状态变为正常后再启动依赖方。第三个坑是数据卷误删,down 本身不会删数据,但 down -v 会连命名卷一起删掉,没备份的数据就找不回来了,清理之前务必确认卷里没有重要数据。

结尾

Compose 的价值不在命令多炫,而在把散落的启动命令收进一个文件,让环境变得可复制、可交接。先从两三个服务的 compose.yaml 练手,遇到端口冲突、启动顺序和数据卷的问题时回想上面三条,日常开发的大部分多容器场景就够用了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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