Docker‑Compose 笔记

一、基础概念

  1. Compose 作用
  • docker:管理单个容器;docker‑compose:编排多个容器。
  • 通过docker‑compose.yml文件定义多个服务,一条命令完成启动、停止、重启,不用写一堆 docker‑run。
  • 3 个核心概念
    • Service:容器服务,nginx、mysql、redis 都是服务。
    • Project 项目:yml 所在文件夹名称就是项目名,同一项目内部容器互通。
    • Network 网络:compose 默认创建桥接网络,只有本项目容器可以互相通信。
  1. 版本区分
  • Compose V2(新版):命令 docker compose(中间空格,推荐),docker20.10 以后自带。
  • Compose V1(旧版):命令 docker‑compose(横线),官方废弃。

二、常用命令(重点)

注意:命令必须在 docker‑compose.yml 所在目录执行

bash

运行

复制代码
# 查看版本
docker compose version

# 创建并启动容器,后台运行 -d
docker compose up -d

# 查看运行中的容器
docker compose ps

# 查看日志
docker compose logs
# 实时跟踪日志
docker compose logs -f
# 只看某一个服务日志
docker compose logs -f mysql

# 停止容器,不会删除容器、数据卷、网络
docker compose stop

# 启动已经停止的服务
docker compose start

# 停止并删除容器、默认网络;不会删除挂载数据卷
docker compose down

# 停止容器同时删除数据卷(慎用,数据清空)
docker compose down -v

# 修改yml配置后重载生效
docker compose up -d

# 列出项目内镜像
docker compose images
# 重启指定服务
docker compose restart mysql

三、docker‑compose.yml 语法(YAML 缩进必须 2 空格,不能用 tab)

顶级关键字

  1. version:新版本 compose 可以省略 version 字段。
  2. services:定义所有容器服务,最核心部分。
  3. volumes:定义外部数据卷。
  4. networks:自定义网络。

services 下面常用配置项

yaml

复制代码
services:
  mysql:                     #服务名称,容器之间就用这个名字通信
    image: mysql:5.7         #指定镜像
    container_name: mysql01 #自定义容器名(可选,不写自动生成)
    restart: always          #重启策略:always总是重启;no默认不重启;on‑failure异常重启
    environment:             #环境变量,配置账号密码
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"          #端口映射:宿主机端口:容器内部端口
    volumes:
      - ./mysql_data:/var/lib/mysql   #数据卷挂载:宿主机目录:容器目录
      - ./my.cnf:/etc/mysql/my.cnf    #挂载配置文件
    networks:
      - mynet                #加入自定义网络

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:               #依赖,启动顺序:先启动mysql再启动nginx
      - mysql
    networks:
      - mynet

networks:
  mynet:                     #自定义网络名称
    driver: bridge            #网络类型默认bridge
参数解释
  1. depends_on:只控制启动先后顺序,并不会等待数据库初始化完毕。mysql 启动初始化较慢,java 程序还是会连接失败,代码层面做好重试。
  2. 容器之间访问:不用宿主机 IP,直接写服务名。例:mysql 服务名就填 mysql,端口写容器内端口 3306。
  3. volumes 两种写法:
    • 命名卷:mysql_data:/var/lib/mysql,由 docker 管理,放在 docker 目录。
    • 绑定挂载:./mysql_data:/var/lib/mysql,指定宿主机当前目录,开发最常用。

四、两种构建方式

方式 1:直接用现成镜像(image),上面示例就是。

方式 2:build 基于 Dockerfile 构建自己镜像

yaml

复制代码
services:
  app:
    build:
      context: ./          #dockerfile所在目录
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    depends_on:
      - mysql

执行docker compose up -d,会自动 build 镜像再启动容器。

五、环境变量进阶用法

  1. 在 yml 里写死 environment 不灵活,可以单独.env文件 项目目录新建.env 文件

env

复制代码
MYSQL_PWD=123456

yml 文件引用变量:

yaml

复制代码
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_PWD}

六、多环境配置(拓展)

  • docker‑compose.yml:公共配置
  • docker‑compose‑dev.yml:开发环境覆盖配置
  • docker‑compose‑prod.yml:生产环境 启动指定配置文件:

bash

运行

复制代码
docker compose -f docker-compose.yml -f docker-compose-prod.yml up -d

七、避坑总结

  1. yaml 缩进严格 2 空格,不能用 tab,冒号后面必须空格,格式错误启动失败。
  2. depends_on 只控制启动顺序,不能等待服务就绪。
  3. compose 项目隔离:不同项目默认网络不同,不能互通;想要互通就要加入同一个自定义 network。
  4. docker compose down -v会删除数据卷,生产环境禁止随便使用。
  5. 修改 yml 配置文件之后,必须执行docker compose up -d重新加载配置,restart 不读取新配置。

八、最简可运行示例(可直接复制保存为 docker‑compose.yml)

yaml

复制代码
services:
  redis:
    image: redis:6
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./redis-data:/data

  mysql:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      - ./mysql-data:/var/lib/mysql

执行启动:

bash

运行

复制代码
docker compose up -d
相关推荐
天衍四九-29 分钟前
【无标题】
前端·spring boot·mysql·nginx·docker
Horn Still Sounds35 分钟前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
赵谨言1 小时前
红蓝对抗Docker渗透复盘-技能与产出汇总
docker·容器·eureka
有范先生3 小时前
这次户外断粮危机后,我更在意主食能不能扛住极端环境了
笔记
I'mChloe4 小时前
Windows部署BiliNote:Docker安装、AI视频转写、Markdown笔记与cpolar远程访问
人工智能·windows·docker
喜欢打篮球的普通人4 小时前
MiniMind 学习笔记(十二):Pretrain 实操——从版本梳理到 8GB 显卡上的真实训练
人工智能·笔记·学习
打工仔折腾 AI6 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
坤坤子吖6 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
天衍四九-6 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
Answer1st6 小时前
【HAL库】嵌入式思路(一)
笔记