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绝对值得一试。性能好、稳定、生态完善,而且国产化支持也很重要。

相关推荐
用户67361323685544 分钟前
openEuler 高效 AI 数据管道
后端
侠客在xingkeit家top1 小时前
全技术栈企业级性能调优万花筒
后端
用户6736132368551 小时前
掌握 DNF,openEuler 软件安装速度翻倍!
后端
用户0524832491761 小时前
在 openEuler 上部署 YOLOv8 实现实时目标检测
后端
稚辉君.MCA_P8_Java1 小时前
Gemini永久会员 Java 返回最长有效子串长度
java·数据结构·后端·算法
极光代码工作室1 小时前
基于SpringBoot的停车场收费管理系统的设计与实现
spring boot·后端·产品运营
喵个咪1 小时前
微服务技术选型:从生态架构视角看go-kratos的不可替代性
后端·go
Wokoo71 小时前
C/S 架构与 B/S 架构:核心差异 + 选型指南
分布式·后端·中间件·架构