当前位置: 首页 > news >正文

docker compose.yaml配置

以下是一个常用的 MySQL Docker Compose 配置示例,包含数据持久化、环境变量配置、自定义配置等核心功能,适用于开发或测试环境。

1. 基础配置文件(docker-compose.yml

创建一个 docker-compose.yml 文件,内容如下:

version: '3.8'  # Compose 文件版本(根据 Docker 版本选择,3.8 兼容大部分新版本)services:mysql:image: mysql:8.0  # MySQL 镜像(可替换为 5.7 等版本,如 mysql:5.7)container_name: mysql-db  # 容器名称(自定义)restart: always  # 容器退出后自动重启(可选,推荐生产环境开启)ports:- "3306:3306"  # 端口映射:宿主机端口:容器内端口(宿主机端口可自定义,如 3307:3306 避免冲突)environment:# 核心环境变量(必配置)MYSQL_ROOT_PASSWORD: root123  # root 用户密码(自定义)MYSQL_DATABASE: mydb  # 初始化时自动创建的数据库名(可选)MYSQL_USER: testuser  # 初始化时创建的普通用户(可选)MYSQL_PASSWORD: test123  # 普通用户的密码(可选,与 MYSQL_USER 配套)# 编码配置(避免中文乱码,可选但推荐)MYSQL_INITDB_SKIP_TZINFO: "1"  # 跳过时区配置(避免部分环境报错)volumes:# 数据持久化:将容器内的数据目录挂载到宿主机卷(避免容器删除后数据丢失)- mysql-data:/var/lib/mysql# 自定义配置文件挂载(可选,如需修改 MySQL 配置)# - ./my.cnf:/etc/mysql/conf.d/my.cnf  # 本地配置文件路径:容器内配置文件路径networks:- mysql-network  # 自定义网络(可选,用于多容器通信)# 定义数据卷(持久化数据)
volumes:mysql-data:# 定义网络(可选,多容器互联时使用)
networks:mysql-network:driver: bridge  # 桥接网络(默认类型)

2. 可选:自定义 MySQL 配置(my.cnf

如果需要修改 MySQL 配置(如字符集、连接数等),可在当前目录创建 my.cnf 文件,内容示例:

[mysqld]
# 字符集配置(避免中文乱码)
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
# 最大连接数(根据需求调整)
max_connections=1000
# 日志配置(可选)
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow.log
long_query_time=2

然后在 docker-compose.ymlvolumes 中取消注释挂载配置,让自定义配置生效。

3. 环境变量安全配置(.env 文件)

为避免密码明文暴露,可使用 .env 文件存储敏感信息,步骤如下:

  1. 创建 .env 文件:

    # .env 文件
    MYSQL_ROOT_PWD=root123
    MYSQL_DB=mydb
    MYSQL_USER=testuser
    MYSQL_USER_PWD=test123
    
  2. 修改 docker-compose.yml 中的 environment 部分,引用 .env 变量:

    environment:MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PWD}MYSQL_DATABASE: ${MYSQL_DB}MYSQL_USER: ${MYSQL_USER}MYSQL_PASSWORD: ${MYSQL_USER_PWD}
    

4. 使用方法

  1. 确保当前目录包含 docker-compose.yml(及可选的 my.cnf.env)。
  2. 启动容器:
    docker-compose up -d  # -d 表示后台运行
    
  3. 查看容器状态:
    docker-compose ps  # 查看服务状态
    docker logs mysql-db  # 查看容器日志(排查启动问题)
    
  4. 连接 MySQL:
    使用客户端工具(如 Navicat、DataGrip)或命令行连接:
    # 本地连接(宿主机端口为 3306 时)
    mysql -h 127.0.0.1 -P 3306 -u root -p
    # 输入 root 密码(如 root123)即可登录
    
  5. 停止/删除容器:
    docker-compose down  # 停止并删除容器(数据卷保留,数据不丢失)
    docker-compose down -v  # 停止并删除容器+数据卷(数据会丢失,谨慎使用)
    

顶层 volumes 定义和服务内 volumes 挂载

在 Docker Compose 中,volumes 配置有两种常见场景:顶层 volumes 定义服务内 volumes 挂载,你提到的两行配置都属于顶层 volumes 定义,但含义和写法有区别,需要结合 Docker 数据卷的类型来理解。

先明确核心概念:Docker 数据卷的两种类型

Docker 中管理容器数据的方式主要有两种:

  1. 命名卷(Named Volume):由 Docker 引擎统一管理的持久化存储,数据存储在 Docker 自身的目录(通常是 /var/lib/docker/volumes/),名称由用户自定义(如 mysql-data)。
  2. 绑定挂载(Bind Mount):直接将宿主机的某个目录/文件挂载到容器内,路径由用户指定(如 ./data:/var/lib/mysql 中的 ./data 是宿主机路径)。

1. 配置 volumes: mysql-data:(正确的命名卷定义)

这是定义命名卷的标准写法,含义是:
创建一个名为 mysql-data 的命名卷,使用 Docker 默认的配置(如默认驱动 local),由 Docker 引擎负责管理其存储位置(无需手动指定宿主机路径)。

示例场景:
docker-compose.yml 中,顶层 volumes 定义命名卷后,服务内可以通过卷名挂载到容器路径,实现数据持久化:

services:mysql:# ... 其他配置volumes:- mysql-data:/var/lib/mysql  # 将命名卷 mysql-data 挂载到容器内的 /var/lib/mysql(MySQL 数据目录)volumes:mysql-data:  # 定义命名卷,使用默认配置

这种方式的优势:

  • 数据由 Docker 管理,避免手动处理宿主机路径权限问题(尤其在 Linux 中)。
  • 容器删除后,卷不会被自动删除(需手动 docker volume rm 删除),数据持久化更可靠。

2. 关于 volumes: mysql-data: .(错误/不规范的写法)

这种写法不符合 Docker Compose 语法规范,可能是误解了配置格式导致的。

原因:
顶层 volumes 的作用是定义卷的属性(如驱动、选项等),语法是 卷名: {配置项},而 . 是宿主机路径(通常用于绑定挂载),不能直接写在顶层 volumes 中。

如果想使用绑定挂载(将宿主机当前目录挂载到容器),正确的写法是在服务内的 volumes 中配置,而非顶层 volumes

services:mysql:# ... 其他配置volumes:- ./mysql-data:/var/lib/mysql  # 绑定挂载:宿主机当前目录下的 mysql-data 目录 → 容器内的 /var/lib/mysql# 这里不需要顶层 volumes 定义(绑定挂载无需提前定义)

这里的 ./mysql-data 是宿主机的相对路径(. 表示当前目录),容器内的 /var/lib/mysql 数据会直接同步到宿主机的 ./mysql-data 目录。

总结

  • volumes: mysql-data::在顶层定义命名卷,由 Docker 管理存储,适合生产环境持久化数据(安全、可靠)。
  • volumes: mysql-data: .:语法错误,绑定挂载的路径配置应写在服务内的 volumes 中(如 - ./mysql-data:/var/lib/mysql),适合开发时需要手动访问数据文件的场景。

核心区别:命名卷由 Docker 托管,绑定挂载直接关联宿主机路径,根据场景选择即可。

http://www.jsqmd.com/news/30478/

相关文章:

  • A39C-T400A22D1a Lora通讯模块的命令配置示例记录
  • 好久没来了
  • 【入门】使用Node.js开发一个MCP服务器
  • Multisim保姆级图文下载安装教程包含下载、安装、汉化、激活
  • AgenticSeek:完全本地的AI助手,保护隐私的智能代理
  • CSP-S 2025 题解
  • Day30-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\annotation\Proxy
  • JMeter生包
  • 洛谷 P11190
  • linux报错
  • 20251103 - 折半搜索 总结
  • 高级语言程序设计作业3
  • NPI
  • P14359 [CSP-J 2025 T3] 异或和 ← 前缀异或和
  • Edge插件导入到chrome浏览器
  • [CSP 2025]游记
  • CF Pinely Round 5(#2161) 总结
  • 第14天(中等题 滑动窗口、哈希表)
  • 寂静处的回响
  • 收藏!强化学习从入门到封神:5 本经典教材 + 8 大实战项目 + 7个免费视频,一站式搞定 - AI
  • P2757 [国家集训队] 等差子序列 题解
  • 拾壹月Ⅲ
  • 20251103周一日记
  • Window 安装多个 MySQL 实例 - Higurashi
  • 普赛斯
  • claude code+openspec开发java代码基本流程
  • 【C】结构体赋值
  • Office 2024 专业增强版下载安装教程:安装/下载/激活/全流程教程
  • Office 2024 专业增强版下载安装教程:安装/下载/激活/全流程教程
  • 模拟赛 29