Docker Compose

Docker Compose介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许你通过一个 YAML 文件来配置应用程序的服务、网络和卷等资源,然后使用简单的命令来启动、停止和管理这些服务。

主要功能:

  1. 多容器管理:通过一个配置文件定义多个容器及其依赖关系。
  2. 简化部署:使用 docker-compose up 命令一键启动所有服务。
  3. 环境隔离:可以为不同的环境(如开发、测试、生产)创建不同的配置文件。
  4. 服务依赖:通过 depends_on 配置服务启动顺序。

核心概念:

  • services:定义应用程序的各个服务,如 Web 服务器、数据库等。
    • build: 指定Dockerfile路径
    • image: 使用现有镜像
    • ports: 端口映射(HOST:CONTAINER)
    • volumes: 数据卷配置
    • environment: 环境变量
    • networks: 自定义网络
    • depends_on: 服务依赖顺序
  • networks:定义容器之间的网络连接。
  • volumes:定义数据卷,用于持久化数据。

示例:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DEBUG=1
    depends_on:
      - redis

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data

volumes:
  redis_data:

在这个示例中,定义了一个 Web 服务和一个 Redis 服务,Web 服务依赖于 Redis 服务。

常用命令

docker-compose up -d        # 安装并启动服务
docker-compose down         # 停止并删除容器
docker-compose start
docker-compose stop
docker-compose build        # 重新构建镜像
docker-compose logs -f      # 查看日志
docker-compose ps           # 查看服务状态

通过 Docker Compose 启动的容器在关闭之后,能够再次使用 Docker Compose 启动这些已关闭的容器

  • 如果容器之前是通过 docker compose up 启动,之后被关闭,再次使用该命令时,它会检查容器的状态,若容器只是停止状态,会重新启动这些容器;若容器已被删除,则会重新创建并启动容器。

  • docker compose start 该命令专门用于启动已经存在但处于停止状态的容器。它不会重新创建容器,只是简单地启动那些之前通过 Docker Compose 创建但当前处于停止状态的容器。

命名

在 Docker Compose 中,当你使用 docker compose up -d 启动服务时,Docker 会自动为每个服务容器生成一个 唯一名称。你看到的 zabbix-zabbix-server-mysql-1 这种格式的名字是由 Docker Compose 自动生成的命名规则决定的。


✅ 容器名后缀 -1 的含义

🧠 简单解释:

这个 -1Docker Compose 自动分配的服务实例编号

📌 命名规则如下:

<项目名>-<服务名>-<序号>
部分 含义
项目名 默认是当前目录名(也可以通过 -p 指定)
服务名 来自 docker-compose.yml 文件中定义的服务名称(如 zabbix-server-mysql
序号 表示该服务运行了多少个副本(默认从 1 开始)

所以:

  • zabbix-zabbix-server-mysql-1 → 项目名为 zabbix,服务名为 zabbix-server-mysql,第 1 个实例
  • 如果你启动了多个副本(例如使用 --scale),就会出现 -2, -3

🔁 示例说明

假设你的目录结构如下:

~/zabbix/
  └── docker-compose.yml

你执行命令:

docker compose up -d

Docker Compose 会将项目名设为当前目录名 zabbix,然后根据 docker-compose.yml 创建以下容器:

服务名 容器名
zabbix-server-mysql zabbix-zabbix-server-mysql-1
zabbix-web-nginx-mysql zabbix-zabbix-web-nginx-mysql-1
zabbix-agent zabbix-zabbix-agent-1

💡 可以手动控制容器名称吗?

可以!你可以通过 container_name 字段显式指定容器名:

zabbix-server-mysql:
  image: zabbix/zabbix-server-mysql:centos-6.4.0
  container_name: zabbix-server
  restart: always
  ...

这样它的名字就是 zabbix-server,不会带 -1

但注意:使用 container_name 后就不能再用 scale 扩展该服务,因为名字必须唯一。


🚫 注意事项

  • 如果你多次执行 docker compose down && docker compose up -d,旧容器会被删除,新容器仍会使用 -1
  • 如果你想运行多个相同服务(比如测试集群),可以使用 --scale,它会创建 -2, -3 等。

🧾 总结

问题 解释
为什么有 -1 Docker Compose 自动给服务实例添加的编号
能不能去掉? 可以,使用 container_name 显式命名
多实例怎么办? 使用 --scaledeploy.replicas(适用于 Swarm 模式)

docker

posted @ 2025-12-25 14:59  姬雨晨  阅读(10)  评论(0)    收藏  举报