docker-compose.yml

一、docker-compose.yml

docker-compose.yml 本质上是把多个 docker run 命令翻译成 YAML 格式。它描述了:

  • 有哪些服务(容器)

  • 每个服务用什么镜像

  • 端口怎么映射

  • 数据怎么持久化

  • 服务之间怎么依赖

二、文件的基本结构

复制代码
version: '3.8'          # Compose 文件版本

services:               # 定义所有服务(必填)
  service_name:         # 服务名(自己起)
    image: ...          # 镜像
    ports: ...          # 端口映射
    environment: ...    # 环境变量
    volumes: ...        # 数据卷
    depends_on: ...     # 依赖关系

volumes:                # 声明数据卷(可选)
networks:               # 声明网络(可选)

三、怎么写:从 docker run 翻译过来

1. 先写一个 docker run

复制代码
docker run -d \
  --name mysql_db \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mydb \
  -v mysql_data:/var/lib/mysql \
  --restart always \
  mysql:8.0

2. 翻译成 docker-compose.yml

复制代码
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: mydb
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always

volumes:
  mysql_data:

3. 参数对应关系

docker run 参数 docker-compose.yml 字段
--name mysql_db container_name: mysql_db
-p 3306:3306 ports: - "3306:3306"
-e KEY=VALUE environment: KEY: VALUE
-v mysql_data:/var/lib/mysql volumes: - mysql_data:/var/lib/mysql
--restart always restart: always
mysql:8.0 image: mysql:8.0

四、多个服务的示例

以 Python 应用 + MySQL + Redis 为例:

复制代码
version: '3.8'

services:
  # Python 应用
  app:
    build: .                          # 从当前目录的 Dockerfile 构建
    container_name: python_app
    ports:
      - "8080:8080"
    environment:
      DB_HOST: mysql                  # 用服务名访问,不是 localhost
      DB_PORT: 3306
      DB_USER: app_user
      DB_PASSWORD: app_pass
      REDIS_HOST: redis
    volumes:
      - ./app:/app                    # 挂载代码(开发用)
    depends_on:
      - mysql
      - redis
    restart: always

  # MySQL 数据库
  mysql:
    image: mysql:8.0
    container_name: mysql_db
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: mydb
      MYSQL_USER: app_user
      MYSQL_PASSWORD: app_pass
    volumes:
      - mysql_data:/var/lib/mysql
    restart: always

  # Redis 缓存
  redis:
    image: redis:7.0-alpine
    container_name: redis_cache
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: always

volumes:
  mysql_data:
  redis_data:

五、常用字段

1. image vs build

复制代码
# 用现成的镜像
image: mysql:8.0

# 从 Dockerfile 构建
build:
  context: .                # 构建上下文
  dockerfile: Dockerfile    # Dockerfile 路径

2. ports:端口映射

复制代码
ports:
  - "8080:8080"           # 主机:容器
  - "443:443"
  - "127.0.0.1:3306:3306" # 只绑定本地

3. environment:环境变量

复制代码
# 方式一:键值对
environment:
  DB_HOST: mysql
  DB_PORT: 3306

# 方式二:列表
environment:
  - DB_HOST=mysql
  - DB_PORT=3306

# 方式三:从 .env 文件读取
env_file:
  - .env

4. volumes:数据卷

复制代码
volumes:
  # 命名卷(Docker 管理)
  - mysql_data:/var/lib/mysql

  # 绑定挂载(主机路径)
  - ./app:/app

  # 只读挂载
  - ./config:/app/config:ro

5. depends_on:依赖关系

复制代码
depends_on:
  - mysql
  - redis

注意 :depends_on 只保证启动顺序 ,不保证服务就绪 。如果需要等待服务就绪,要用 healthcheck:

复制代码
services:
  app:
    depends_on:
      mysql:
        condition: service_healthy

  mysql:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

6. restart:重启策略

值 说明
no 不自动重启(默认)
always 总是重启
on-failure 失败时重启
unless-stopped 除非手动停止,否则重启

7. command:覆盖启动命令

复制代码
command: python app.py
# 或
command: ["python", "app.py"]

8. networks:自定义网络

复制代码
services:
  app:
    networks:
      - app_network

networks:
  app_network:
    driver: bridge

六、用 .env 文件管理敏感信息

不要在 docker-compose.yml 里写密码 ,用 .env 文件:

复制代码
# .env
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=mydb
DB_USER=app_user
DB_PASSWORD=app_pass

# docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}

备注: Compose 会自动读取同目录下的 .env 文件。

七、写 docker-compose.yml 的套路

步骤:

  1. 列出所有服务:应用、数据库、缓存、消息队列等

  2. 确定每个服务的镜像:从 Docker Hub 查官方镜像名

  3. 配置端口:需要外部访问的才映射

  4. 配置环境变量:查官方文档,看哪些是必填的

  5. 配置数据卷:有状态的服务(数据库)必须挂载

  6. 配置依赖 :depends_on 控制启动顺序

  7. 配置重启策略 :生产环境用 always

  8. 声明 volumes 和 networks:在文件末尾统一声明

docker-compose.yml 就是把多个 docker run 命令翻译成 YAML 格式。先写 docker run,再逐条翻译成 YAML 字段,最后用 docker-compose up -d 一键启动。

相关推荐
Java开发追求者13 小时前
windows快速安装docker
windows·docker·安装·1024程序员节
骑着蜗牛撵大象32715 小时前
飞牛fnOS部署Damselfly:Compose编排、照片目录与7100固定访问
java·docker·rpc·dubbo·fnos·照片管理·damselfly
一掬净土15 小时前
kubelet 报错如下:docker does not support reopening container log files
docker·云原生·kubelet·logfiles
TTATTC17 小时前
为什么 Python 做 Agent 总在并发中崩溃?拆解 Blockcell 在 Rust 下的 Host-Cell 隔离与自愈状态机
docker·开源
骑着蜗牛撵大象32720 小时前
N1 小盒子撑起 AI 接口中转层:New-API 接管本地 Ollama,用 Token 分发模型能力
docker·llama·1024程序员节·api网关·飞牛nas·new-api
艸肅20 小时前
Docker 国内镜像源配置
linux·ubuntu·docker·1024程序员节
java_logo20 小时前
Docker 部署 Bililive-go:轻松搭建多平台直播录制
docker·1024程序员节·直播录制·轩辕镜像·bililive-go·chigusa/bililive-go
A-刘晨阳20 小时前
【云原生】nerdctl 部署及使用指南
运维·docker·kubernetes·云计算·1024程序员节·nerdctl
bigbig_ben1 天前
yearning安装docker
运维·docker·容器
吴声子夜歌1 天前
Docker入门与实战——热门镜像介绍
运维·docker·容器