Docker Compose 入门:一个文件拉起多容器服务

举报
yd_278701352 发表于 2026/11/08 01:17:04 2026/11/08
【摘要】 只用 docker run 管一个容器还行,容器一多就乱了套:先起数据库、再起后端、最后起前端,每个容器都要记一串端口映射、环境变量和挂载参数,换台机器重来一遍还容易漏。Docker Compose 就是来收拾这个烂摊子的:用一个 YAML 文件把多个容器的配置写在一起,一条命令全部拉起。先确认本机装没装。较新的 Docker Desktop 和 Linux 发行版自带 Compose 插件...

只用 docker run 管一个容器还行,容器一多就乱了套:先起数据库、再起后端、最后起前端,每个容器都要记一串端口映射、环境变量和挂载参数,换台机器重来一遍还容易漏。Docker Compose 就是来收拾这个烂摊子的:用一个 YAML 文件把多个容器的配置写在一起,一条命令全部拉起。

先确认本机装没装。较新的 Docker Desktop 和 Linux 发行版自带 Compose 插件,跑一条命令验证:

docker compose version

能打出版本号就说明可用。注意现在官方写法是 docker compose(中间空格、作为 Docker 的子命令),老教程里的 docker-compose(带横杠的独立程序)是上一代,新版已经不再推荐。

最小例子:一个 Web 服务加一个缓存服务。新建目录,写一个 docker-compose.yml:

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  cache:
    image: redis:7-alpine

在这个目录下执行:

docker compose up -d

Compose 会先拉取两个镜像,再建一个专属网络,把两个容器接进去,然后以后台方式启动。浏览器访问本机的 8080 端口就能看到 Nginx 的欢迎页。服务之间互相访问不用记 IP,直接用服务名当主机名——web 容器里访问 cache:6379 就能连上 Redis,因为 Compose 内置了 DNS 解析。

日常最常用的几条命令,建议记熟:

docker compose ps        # 看当前项目里容器的状态
docker compose logs -f   # 跟踪所有服务的日志
docker compose stop      # 停掉容器但不删除
docker compose down      # 停掉并删除容器和网络
docker compose down -v   # 连数据卷一起删干净

注意 down 默认不删数据卷,数据库的数据还在,下次 up 还能接着用;只有加 -v 才会清空,生产数据千万别手滑。

再看一个稍完整的例子:带数据库的 Web 应用。数据库需要密码,用环境变量传进去:

services:
  app:
    image: nginx:latest
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example-password
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

这里有两个要点。第一,depends_on 只保证启动顺序——先起 db 再起 app,但不保证数据库已经就绪,应用如果启动时就连库,第一次可能会连失败,生产用法要再加健康检查。第二,volumes 把数据库文件落到具名卷里,容器删了数据还在。

密码别直接写进 YAML 文件提交到代码仓库。Compose 支持同目录的 .env 文件,写成 MYSQL_ROOT_PASSWORD=... 这样的键值对,YAML 里用 ${MYSQL_ROOT_PASSWORD} 引用即可,.env 再加进 .gitignore。

新版 Compose 还有一个小变化:文件开头的 version 字段已经废弃,不写也没关系,写了反而可能收到警告,直接从 services 开始写就行。

总结一下使用节奏:一个项目一个目录、一个 docker-compose.yml 管全部服务,up -d 拉起、ps 和 logs 排查、down 收尾。把命令和参数都沉淀进文件里,换机器部署就是复制目录加一条命令的事。下一步可以试着把自己常用的两个服务写进同一个文件,先从 Nginx 加 Redis 这样的组合练手。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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