Ubuntu26.04之docker-compose外置data目录方式运行MariaDB

以下是使用最新 LTS 版本 MariaDB 12.3的 Docker Compose 配置。

1. 编写 docker-compose.yml

/home/moshow/workspace/database/mariadb/ 目录下创建 docker-compose.yml 文件,内容如下:

XML 复制代码
services:
  mariadb:
    # 使用最新的 LTS 版本 12.3[reference:2][reference:3]
    image: mariadb:12.3
    container_name: mariadb_lts
    restart: always
    environment:
      # 【必须修改】设置 root 密码,请替换为你的强密码
      MARIADB_ROOT_PASSWORD: root123
      # 可选:创建初始数据库和用户
      MARIADB_DATABASE: mysql
      MARIADB_USER: mysql
      MARIADB_PASSWORD: mysql123
    ports:
      # 将宿主机的 3306 端口映射到容器的 3306 端口
      # 若端口冲突,可修改左侧端口,如 "3307:3306"
      - "3306:3306"
    volumes:
      # 将数据目录挂载到宿主机你指定的路径
      - /home/moshow/workspace/database/mariadb/data:/var/lib/mysql
      # 可选:挂载自定义配置文件
      # - ./my.cnf:/etc/mysql/my.cnf

2. 启动服务

复制代码
cd /home/moshow/workspace/database/mariadb/
docker compose up -d

3. 验证部署

复制代码
# 查看容器状态
docker compose ps


# 进入容器验证
docker exec -it mariadb_lts mariadb -u root -p
# 输入密码后,执行 SHOW DATABASES; 查看数据库列表

重要注意事项

  • 数据目录权限 :容器内 MariaDB 使用 mysql 用户运行。宿主机目录 /home/moshow/workspace/database/mariadb/data 需要允许该用户写入,否则容器可能启动失败。如果遇到权限问题,可以尝试:

    复制代码
    # 创建目录并赋予权限
    mkdir -p /home/moshow/workspace/database/mariadb/data
    sudo chown -R 999:999 /home/moshow/workspace/database/mariadb/data

    (容器内 mysql 用户的 UID 为 999)

  • 密码安全MARIADB_ROOT_PASSWORD必须设置 的。生产环境建议使用 .env 文件管理敏感信息,避免硬编码在 docker-compose.yml 中。

  • 端口冲突 :如果宿主机 3306 端口已被占用,请修改 ports 映射,例如改为 "3307:3306"

  • 初始化脚本 :如需在首次启动时自动执行 SQL 脚本(如建表),可将 .sql.sh 文件挂载到 /docker-entrypoint-initdb.d/ 目录:

    复制代码
    volumes:
      - /home/moshow/workspace/database/mariadb/data:/var/lib/mysql
      - ./init-scripts:/docker-entrypoint-initdb.d
  • 版本说明:MariaDB 12.3 LTS 是 2026 年 5 月发布的最新 LTS 版本,维护至 2029 年 6 月。目前共有五个 LTS 系列:10.6、10.11、11.4、11.8 和 12.3。

✅ localhost连接问题

遇到的错误 2002 - Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' 是在宿主机 上使用 mysql 客户端连接时出现的典型问题,因为客户端默认尝试通过 Unix Socket 连接,而 Docker 容器内的 Socket 文件并未暴露到宿主机。

原因解析
  • 容器内的 MariaDB 服务将 Socket 文件创建在 /run/mysqld/mysqld.sock

  • 宿主机上的 mysql 命令默认不使用 TCP/IP ,而是寻找本地 Socket 文件(通常位于 /var/run/mysqld/mysqld.sock/run/mysqld/mysqld.sock),但该路径下没有文件,因此报错。

  • 并不表示容器未运行,只是连接方式不匹配。

解决方案:使用 TCP/IP 连接(推荐)

在宿主机上执行 mysql 时,显式指定主机和端口,强制使用 TCP 连接:

复制代码
mysql -h 127.0.0.1 -P 3306 -u root -p

(输入密码后即可连接)

如果你将宿主机的端口映射改为了其他端口(如 3307:3306),则 -P 后需改为对应端口。