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
相关推荐
tq10861 小时前
开放与封闭:类型系统的安全哲学
笔记
龙仔7252 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
韭菜炒鸡肝天2 小时前
VTK开发笔记(一):VTK介绍,Qt..+VSx+VTK.编译
开发语言·笔记·qt
江湖有缘3 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器
张忠琳3 小时前
【NPU】Ascend Docker Runtime v26.0.1 之二 runtime/process/process.go — 超深度逐行分析
云原生·容器·架构·kubernetes·npu·docker-runtime
峥无5 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波5 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
早睡早起身体好1237 小时前
为什么 Network 中会出现两个同名请求?——CORS 预检请求学习笔记
网络·笔记·学习·网络安全
Kevin Wang7277 小时前
Nvidia-AGX-spark部署手册——课堂质量诊断(jetpack:r36)
python·docker·容器
@Mike@8 小时前
06-数据库学习笔记(存储模型与数据压缩)
数据库·笔记·学习