OpenEuler上Docker Compose部署MySQL数据库

一、开场:遇到小问题

最近项目需要用MySQL数据库,想着用Docker Compose部署方便管理。 打开终端,习惯性地敲了一下:

bash 复制代码
docker-compose

结果:

bash 复制代码
-bash: docker-compose: command not found

好吧,看来得先装个docker-compose。

二、OpenEuler:稳定可靠的国产操作系统

在解决这个问题之前,先说说我用的系统------OpenEuler 22.03 LTS。 OpenEuler是什么? OpenEuler是由openAtom开源基金会孵化及运营的开源操作系统项目,面向服务器、云计算、边缘计算、嵌入式等场景。它的特点是:

  • ✅ 高性能:针对各种场景深度优化
  • ✅ 高稳定:生产级可靠性
  • ✅ 高安全:内置安全机制
  • ✅ 易迁移:兼容CentOS等主流发行版
  • ✅ 完整生态:软件仓库丰富,容器、数据库、开发工具一应俱全 我这台服务器配置是2核4GB,对于跑MySQL这种中等负载的应用来说够用了。 官方资源:
  • 官网:www.openeuler.org/
  • 文档:docs.openeuler.org/
  • 社区:forum.openeuler.org/ OpenEuler在云原生这块做得很不错,对Docker、Kubernetes、各种数据库的支持都很好。这也是我选择它的原因之一。

三、安装docker-compose:遇到GitHub访问问题

3.1 尝试直接下载

按照官方文档,docker-compose可以直接从GitHub下载:

bash 复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

结果下载到一半:

bash 复制代码
curl: (92) HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)

失败了。

3.2 分析问题

这个错误在国内很常见:GitHub的访问不稳定,下载大文件经常超时或中断。 58MB的docker-compose二进制文件,下载了30MB就断了,挺无奈的。

3.3 解决方案:本机下载+上传

既然服务器下载不了,那就换个思路:

  1. 在本机(Mac/Windows)下载docker-compose
  2. 本机网络可能更好,或者可以用梯子
  3. 下载完后用scp上传到服务器 本机操作:
bash 复制代码
# 访问GitHub releases页面,下载docker-compose-linux-x86_64
# https://github.com/docker/compose/releases

# 或者本机用命令下载(如果本机网络好)
curl -L "https://github.com/docker/compose/releases/download/v2.40.0/docker-compose-linux-x86_64" -o ~/Downloads/docker-compose

# 上传到服务器
scp ~/Downloads/docker-compose root@your-server-ip:/root/

服务器操作:

bash 复制代码
# 移动到正确位置
sudo mv ~/docker-compose-linux-x86_64 /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

成功!安装的是v2.40.0版本。 小结: 这个问题的解决过程其实挺实用的。国内访问GitHub不稳定是常态,很多开发者都会遇到。本机下载+scp上传是一个通用的解决方案,不只适用于docker-compose,其他工具也可以这样操作。

四、Docker Compose部署MySQL

4.1 创建项目目录

bash 复制代码
mkdir -p ~/mysql-monomer
cd ~/mysql-monomer

4.2 创建docker-compose.yml

bash 复制代码
version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: mysql-server
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_strong_password
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
    command: --default-authentication-plugin=mysql_native_password

volumes:
  mysql_data:

配置说明:

  • image: mysql:8.0:使用MySQL 8.0官方镜像
  • restart: always:容器退出自动重启
  • environment:环境变量配置root密码、默认数据库、用户
  • ports:映射3306端口到宿主机
  • volumes:
    • mysql_data:持久化数据目录
    • ./my.cnf:挂载自定义配置文件
  • command:使用传统的密码认证插件(兼容性更好)

4.3 创建MySQL配置文件

bash 复制代码
[mysqld]
# 基础配置
max_connections = 200
max_connect_errors = 10000

# 性能配置
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 时区
default-time-zone = '+08:00'

配置解析:

  • max_connections = 200:最大连接数,2核4G服务器设置200够用
  • innodb_buffer_pool_size = 1G:InnoDB缓冲池,设置为物理内存的25%左右
  • innodb_flush_log_at_trx_commit = 2:每秒刷新一次日志,平衡性能和安全
  • innodb_flush_method = O_DIRECT:直接I/O,减少系统缓存开销
  • utf8mb4:支持完整的Unicode字符集,包括emoji
  • +08:00:东八区时区

4.4 启动MySQL

bash 复制代码
docker-compose up -d

查看日志,等待MySQL启动完成:

bash 复制代码
docker-compose logs -f mysql

看到ready for connections. Version: '8.0.44'就成功了。


五、MySQL基础验证

5.1 连接MySQL

bash 复制代码
docker exec -it mysql-server mysql -uroot -pyour_strong_password

MySQL版本信息:

bash 复制代码
Server version: 8.0.44 MySQL Community Server - GPL

查看数据库列表:

bash 复制代码
SHOW DATABASES;
输出:
+--------------------+
| Database           |
+--------------------+
| benchmark_test     |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
6 rows in set (0.00 sec)

5.2 创建测试数据

bash 复制代码
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS benchmark_test;
USE benchmark_test;

-- 创建用户表
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 插入测试数据
INSERT INTO users (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com'),
('user4', 'user4@example.com'),
('user5', 'user5@example.com'),
('user6', 'user6@example.com'),
('user7', 'user7@example.com'),
('user8', 'user8@example.com'),
('user9', 'user9@example.com'),
('user10', 'user10@example.com');

-- 查看数据
SELECT * FROM users;
SELECT COUNT(*) FROM users;

数据插入成功,10条记录。

六、MySQL性能测试:OpenEuler的表现

6.1 sysbench工具介绍

sysbench是MySQL官方推荐的性能测试工具,可以测试CPU、内存、磁盘I/O、数据库等性能。 在OpenEuler上安装很简单:

bash 复制代码
sudo dnf install -y sysbench

OpenEuler的软件仓库很完善,常用工具基本都能直接装,这点很方便。

6.2 准备测试数据

bash 复制代码
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 \
  --mysql-port=3306 \
  --mysql-user=root \
  --mysql-password=your_strong_password \
  --mysql-db=benchmark_test \
  --tables=10 \
  --table-size=10000 \
  prepare

sysbench创建了10个表(sbtest1-sbtest10),每个表10000条记录,总共10万条数据。

6.3 运行性能测试

bash 复制代码
sysbench /usr/share/sysbench/oltp_read_write.lua \
  --mysql-host=127.0.0.1 \
  --mysql-port=3306 \
  --mysql-user=root \
  --mysql-password=your_strong_password \
  --mysql-db=benchmark_test \
  --tables=10 \
  --table-size=10000 \
  --threads=4 \
  --time=30 \
  --report-interval=5 \
  run

测试参数:

  • 10个表,每个表10000条记录
  • 4个并发线程
  • 运行30秒
  • 每5秒输出一次报告 性能测试结果: 暂时无法在飞书文档外展示此内容

6.4 性能数据分析

这个性能表现怎么样? 对于2核4GB的服务器来说,这个结果已经很不错了:

  1. TPS(事务处理能力)
  • 459.62 TPS意味着每秒可以处理约460个事务
  • 对于中小型应用(日活几千到几万)完全够用
  • 如果是电商系统,按每个订单5-10个事务计算,可以支持每秒50-90个订单
  1. QPS(查询处理能力)
  • 9,192 QPS意味着每秒可以处理约9200个SQL查询
  • 对于一般的Web应用,每个页面请求可能涉及10-50个SQL查询
  • 可以支持每秒200-900个页面请求
  1. 延迟表现
  • 平均延迟8.70ms:很优秀,用户基本无感知
  • 95%延迟11.45ms:说明大多数请求都很快
  • 最大延迟19.10ms:也在可接受范围内

6.5 OpenEuler的性能优势

为什么MySQL在OpenEuler上能跑出这样的性能? 7. 内核优化 OpenEuler基于Linux 5.10 LTS内核,针对服务器场景做了很多优化:

  • I/O调度器优化
  • 内存管理优化
  • 进程调度优化
  • 网络栈优化 这些优化直接提升了数据库的I/O性能和响应速度。
  1. 软件生态完善 OpenEuler的软件仓库维护得很好:
  • MySQL 8.0官方镜像完美支持
  • Docker运行稳定
  • sysbench等测试工具开箱即用 不需要折腾各种依赖,省时省力。
  1. 容器化支持出色 OpenEuler对容器化支持很好:
  • Docker运行稳定
  • 容器网络性能优秀
  • 存储卷性能高 这次测试MySQL是跑在Docker容器里的,性能损耗很小。
  1. 生产级稳定性 测试过程中,系统一直很稳定,没有出现任何异常。对于数据库这种关键应用来说,稳定性比性能更重要。

七、容器资源占用

bash 复制代码
docker stats --no-stream mysql-server

资源占用情况: 暂时无法在飞书文档外展示此内容 资源占用分析:

  1. 内存占用
  • 空载时:约535MB(15.69%)
  • 这个占用很合理,MySQL的innodb_buffer_pool_size设置为1GB,加上连接缓存、查询缓存等,535MB是正常的
  • 对于4GB内存的服务器,留给系统和其他进程约2.8GB,足够了
  1. CPU占用
  • 空载时:0.22%
  • 说明MySQL在没有高负载时很节能
  • 性能测试时CPU会升高,但测试完就降下来了
  1. 进程数
  • 63个进程
  • MySQL是多线程架构,这个进程数正常 OpenEuler的资源管理: OpenEuler在资源管理这块做得很好:
  • cgroup资源限制精准
  • 内存管理高效
  • CPU调度合理 容器化部署MySQL不会影响系统的其他服务。

八、总结:OpenEuler与MySQL的完美组合

8.1 整体感受

从发现没有docker-compose,到GitHub下载失败,再到本机下载上传,最后成功部署MySQL并测试性能,整个过程挺顺利的。 虽然遇到了一些小问题,但都有解决方案。这也是实际工作中的常态:遇到问题→分析→解决→继续。

8.2 OpenEuler的优势

通过这次MySQL部署和测试,我对OpenEuler有了更深的认识: 14. 性能出色

  • MySQL TPS 459.62,QPS 9,192
  • 对于2核4GB的服务器,这个性能很优秀
  • OpenEuler的内核优化、I/O优化功不可没
  1. 稳定可靠
  • 整个部署和测试过程,系统一直很稳定
  • 容器运行稳定,没有出现异常
  • 这对于数据库这种关键应用很重要
  1. 生态完善
  • Docker、docker-compose支持完美
  • sysbench等工具开箱即用
  • MySQL官方镜像完美运行
  1. 易用性好
  • dnf包管理器方便
  • 文档完善,社区活跃
  • 遇到问题容易找到解决方案

8.3 适用场景

基于这次实践,我觉得OpenEuler + Docker + MySQL这个组合适合: 18. 开发环境

  • 快速搭建,用完就删
  • Docker Compose管理方便
  • 不影响宿主机
  1. 测试环境
  • 隔离性好
  • 可以同时跑多个MySQL版本
  • 方便做性能测试
  1. 中小型生产环境
  • 单机部署简单
  • 性能够用
  • 稳定可靠
  1. 迁移场景
  • 从CentOS迁移到OpenEuler
  • 原有Docker化应用无缝迁移
  • 兼容性好

8.4 建议

如果你也在:

  • 寻找CentOS的替代品
  • 搭建数据库服务器
  • 探索国产操作系统
  • 学习容器化部署

那么OpenEuler绝对值得一试。性能好、稳定、生态完善,而且国产化支持也很重要。

相关推荐
jiangbo_dev4 分钟前
还在手搓分布式事务?我把 Saga + Outbox 模板化后,新服务接入从 5 天压到 1 天
后端
BING_Algorithm7 分钟前
深入理解JVM垃圾回收
jvm·后端·面试
RainCity26 分钟前
Java Swing 自定义组件库分享(六)
java·笔记·后端
techdashen30 分钟前
深入 Rust enum 的内存世界
开发语言·后端·rust
龙码精神1 小时前
TimescaleDB 物联网设备属性历史数据表设计及常用SQL文档
后端
小小小小宇1 小时前
Go 后端锁机制详解
后端
挖坑的张师傅1 小时前
你的仓库 Agent Ready 了吗?
后端
客场消音器1 小时前
如何使用codex进行UI重构,让AI开发的前端页面不再千篇一律
前端·后端·微信小程序
Full Stack Developme2 小时前
spring-beans 解析
java·后端·spring
苏三说技术2 小时前
为什么大厂都不推荐在MySQL中使用NULL值?
后端