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
相关推荐
疯狂打码的少年1 小时前
【软件工程】软件开发模型:增量模型与迭代模型
笔记·软件工程
Generalzy2 小时前
从本地 Demo 到生产级检索:Milvus 学习笔记(3)
笔记·学习·milvus
jieyucx4 小时前
Docker 入门第一阶段:建立正确认知与初体验
运维·docker·容器
凉、介4 小时前
Virtio 系列(一):框架概览
笔记·学习·嵌入式·虚拟化·virtio
Yang_jie_035 小时前
笔记:数据结构(栈是否使用底指针以及头指针的初始化值)
数据结构·笔记·算法
一杯奶茶¥6 小时前
c语言程序设计大学期末考试考研知识点重点笔记题库复习资料C语言重点考点题库资料合集
c语言·笔记·考研·c语言程序设计·c语言笔记
jieyucx6 小时前
Docker 入门第二阶段:掌握日常命令
运维·docker·容器
依然范特东6 小时前
动手学深度学习笔记--数据操作、线性代数
人工智能·笔记·深度学习
有毒的教程7 小时前
Kubernetes进阶实战教程(生产落地完整版)
云原生·容器·kubernetes
FakeOccupational8 小时前
【电路笔记 信号】传输线方程:从RLGC推导传输线特性阻抗
笔记