十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ARM架构下MySQL 5.7.44 Docker镜像从源码编译到生产部署全指南

ARM架构下MySQL 5.7.44 Docker镜像从源码编译到生产部署全指南 简介本资源是专为ARM架构平台定制的MySQL 5.7.44官方源码编译版Docker镜像包面向嵌入式开发、IoT应用部署及ARM服务器运维人员解决x86生态下MySQL无法原生运行于树莓派、NVIDIA Jetson等ARM硬件的兼容性问题。压缩包共5个文件2个Shell脚本用于初始化与启动服务、1个Dockerfile定义构建流程、1个my.cnf配置模板、1个mysql-5.7.44-arm64.tar.gz二进制镜像总大小520.46MB基于Ubuntu 22.04jammy基础镜像构建确保环境稳定且开箱即用。目前已有425人学习下载。用户可直接导入Docker环境快速拉起ARM原生MySQL实例配套脚本已预置端口映射、数据卷挂载与安全初始化逻辑避免手动配置疏漏Dockerfile结构清晰支持二次定制cnf配置兼顾ARM平台内存与IO特性适配低功耗场景下的数据库调优需求。1. 项目缘起为什么要在ARM上自己编译MySQL 5.7.44的Docker镜像最近在给一个基于ARM架构的服务器集群做数据库选型和部署目标环境是华为鲲鹏920或者AWS Graviton2这类处理器。官方的MySQL Docker镜像仓库里对于5.7这个经典版本通常只提供x86_64/amd64架构的镜像。直接docker pull mysql:5.7在ARM机器上跑不起来会报错提示平台不匹配。这事儿听起来简单不就是找个ARM版的镜像嘛但实际踩进去才发现坑比想象的多。首先确实有一些第三方构建的ARM版MySQL镜像但来源混杂安全性和稳定性存疑。对于生产环境尤其是数据库这种核心组件用来历不明的镜像无异于埋雷。其次即使找到了一个看似可靠的ARM基础镜像比如arm64v8/ubuntu:20.04直接在里面用apt-get install mysql-server安装的往往是系统仓库里较新的MySQL 8.0版本或者打了各种补丁的5.7版本很难精确锁定到我们需要的5.7.44这个特定小版本。版本不一致可能带来细微的兼容性问题这是我们做迁移和升级时极力要避免的。所以最稳妥、最可控的方案就是从MySQL官方下载5.7.44的源代码在ARM架构的容器环境里从头编译、构建一个完全属于自己的Docker镜像。这个过程不仅能确保版本绝对精确还能让我们根据实际需求定制编译参数比如调整字符集、优化器特性、禁用不需要的引擎等打造一个“瘦身”且贴合业务的专属镜像。今天我就把这次从踩坑到成功的完整过程包括编译环境搭建、依赖解决、参数调优、镜像构建以及最终的性能验证毫无保留地分享出来。2. 编译环境奠基打造一个稳定高效的ARM编译容器编译MySQL尤其是老版本的MySQL对编译环境有比较严格的要求。我们不能在随随便便一个容器里就开始需要精心准备一个“编译车间”。2.1 基础镜像选择与初步配置我的选择是arm64v8/ubuntu:20.04。为什么不选更新的22.04因为MySQL 5.7的官方支持周期已经结束其编译依赖的库如libssl、boost的版本在更新的系统上可能过高或存在兼容性问题。Ubuntu 20.04 LTS是一个长期支持版本其软件库版本与MySQL 5.7编译期所需的环境匹配度更高社区资料也最丰富。arm64v8这个命名空间明确指明了这是ARM 64位架构的官方镜像。首先我们创建一个Dockerfile的起点并安装最基础的编译工具链# 使用 ARM64 架构的 Ubuntu 20.04 作为基础镜像 FROM arm64v8/ubuntu:20.04 # 设置非交互式前端避免安装过程中需要手动确认 ENV DEBIAN_FRONTENDnoninteractive # 更新软件源并安装基础编译工具和依赖 RUN apt-get update apt-get install -y \ wget \ gnupg \ lsb-release \ software-properties-common \ build-essential \ cmake \ pkg-config \ libncurses5-dev \ libssl-dev \ libreadline-dev \ zlib1g-dev \ rm -rf /var/lib/apt/lists/*这里有几个关键点DEBIAN_FRONTENDnoninteractive至关重要。在自动化构建中有些包如tzdata会尝试弹出时区选择界面这个环境变量可以阻止它让安装过程静默完成。build-essential包含了gcc,g,make等核心编译工具。cmakeMySQL 5.7使用CMake作为构建系统生成器必须安装。libncurses5-dev,libreadline-dev为MySQL客户端提供命令行编辑和历史功能。libssl-dev提供SSL/TLS加密支持对于安全的数据库连接是必须的。最后清理apt缓存rm -rf /var/lib/apt/lists/*是一个好习惯可以显著减小这一层镜像的体积。2.2 解决MySQL 5.7特有的依赖难题MySQL 5.7编译有一个比较特殊的依赖Boost库。从5.7版本开始MySQL的某些组件如GIS空间功能需要Boost C库。官方要求是精确的1.59.0版本。用系统自带的或者更高版本的Boost编译时很可能报错。所以我们需要手动下载并编译Boost 1.59.0。这一步是ARM编译路上第一个容易卡住的地方。# 下载并编译 Boost 1.59.0 RUN wget -O /tmp/boost_1_59_0.tar.gz https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz/download \ tar -xzf /tmp/boost_1_59_0.tar.gz -C /tmp/ \ cd /tmp/boost_1_59_0 \ ./bootstrap.sh \ ./b2 --with-system --with-thread --with-date_time --with-regex --with-serialization install \ rm -rf /tmp/boost_1_59_0 /tmp/boost_1_59_0.tar.gz解释一下wget下载指定版本的Boost源码包。./bootstrap.sh是Boost的配置脚本。./b2是Boost的构建工具原名bjam。后面的--with-xxx参数是指定只编译我们需要的几个库system,thread,date_time,regex,serialization因为MySQL只需要这几个。如果全量编译耗时极长且占用大量空间。最后安装到系统默认路径通常是/usr/local/并清理临时文件。除了Boost还需要一些其他依赖比如用于测试的perl模块以及可选的libaio异步IO库提升性能# 安装其他必要的依赖 RUN apt-get update apt-get install -y \ libaio-dev \ libjemalloc-dev \ bison \ libcurl4-openssl-dev \ perl \ libdbd-mysql-perl \ libmysqlclient-dev \ rm -rf /var/lib/apt/lists/*注意libjemalloc是一个替代glibc malloc的内存分配器在某些工作负载下能提供更好的性能和更少的内存碎片。MySQL也支持用它进行编译。虽然不是必须但为性能考虑建议加上。3. 源码编译实战配置、编译与安装的完整链条环境准备好后就到了最核心的编译环节。这一步参数多耗时长任何一个选项错误都可能导致编译失败或运行时异常。3.1 下载与准备MySQL 5.7.44源码我们直接从MySQL官方Git仓库下载特定版本的源码。这比下载通用源码包更灵活也更容易验证完整性。# 下载 MySQL 5.7.44 源码 RUN wget -O /tmp/mysql-5.7.44.tar.gz https://github.com/mysql/mysql-server/archive/refs/tags/mysql-5.7.44.tar.gz \ tar -xzf /tmp/mysql-5.7.44.tar.gz -C /usr/src/ \ mv /usr/src/mysql-server-mysql-5.7.44 /usr/src/mysql-server \ rm /tmp/mysql-5.7.44.tar.gz3.2 CMake配置决定MySQL的“基因”编译MySQL的第一步不是make而是cmake。它根据我们提供的参数生成对应的Makefile。以下是一个针对生产环境优化、适用于ARM架构的配置示例WORKDIR /usr/src/mysql-server RUN cmake . \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/var/lib/mysql \ -DSYSCONFDIR/etc/mysql \ -DWITH_INNOBASE_STORAGE_ENGINE1 \ -DWITH_ARCHIVE_STORAGE_ENGINE1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE1 \ -DWITH_READLINE1 \ -DWITH_SSLsystem \ -DWITH_ZLIBsystem \ -DWITH_LIBWRAP0 \ -DENABLED_LOCAL_INFILE1 \ -DMYSQL_UNIX_ADDR/tmp/mysql.sock \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_unicode_ci \ -DWITH_BOOST/usr/local \ -DWITH_JEMALLOC1 \ -DENABLE_DOWNLOADS0 \ -DFORCE_INSOURCE_BUILD1我们来拆解几个关键参数-DCMAKE_INSTALL_PREFIX/usr/local/mysql指定安装目录。这是MySQL的“家”。-DMYSQL_DATADIR/var/lib/mysql指定数据文件存放目录。与最终容器运行时的数据卷挂载位置对应。-DWITH_INNOBASE_STORAGE_ENGINE1启用InnoDB引擎这是默认且必须的。-DWITH_SSLsystem使用系统安装的OpenSSL而不是编译自带的。-DDEFAULT_CHARSETutf8mb4和-DDEFAULT_COLLATIONutf8mb4_unicode_ci强烈建议设置。将默认字符集设为utf8mb4以支持完整的Unicode包括emoji表情避免后期出现“字符串截断”或“不支持的字符”问题。-DWITH_BOOST/usr/local指向我们之前编译安装Boost 1.59.0的目录。-DWITH_JEMALLOC1启用jemalloc支持。-DENABLE_DOWNLOADS0禁止CMake在配置过程中自动下载任何东西如Boost所有依赖必须提前准备好保证构建可重复。-DFORCE_INSOURCE_BUILD1强制在源码目录内构建避免一些潜在的路径问题。踩坑记录如果不指定-DWITH_BOOSTCMake可能会尝试自动下载但在容器内网络环境不稳定时极易失败。如果指定了路径但Boost版本不对CMake会报错。务必确保/usr/local/include/boost目录存在且版本正确。3.3 编译与安装耐心与资源的博弈配置成功后就可以开始编译了。编译MySQL是个资源消耗大户尤其是内存。# 编译并安装使用尽可能多的CPU核心以加速编译 RUN make -j$(nproc) make install-j$(nproc)nproc命令会获取当前容器可用的CPU核心数-j参数告诉make工具进行并行编译能极大缩短编译时间。在拥有多核的ARM服务器上效果显著。编译过程视机器性能而定在4核8G的ARM机器上可能需要30分钟到1小时。期间CPU使用率会接近100%。如果内存不足小于4GB编译可能会失败并报出“internal compiler error: Killed (program cc1plus)”这类错误这通常是系统OOM Killer杀掉了编译进程。解决方案就是增加编译容器的内存资源。安装make install过程很快会把编译好的二进制文件、库、头文件等复制到-DCMAKE_INSTALL_PREFIX指定的目录/usr/local/mysql下。4. 镜像封装与优化从编译环境到运行环境现在我们已经在容器内有了一个编译安装好的MySQL。但这不是最终目标我们需要构建一个干净、小巧、只包含运行所需文件的Docker镜像。4.1 多阶段构建精简镜像的利器这是Docker最佳实践。我们使用多阶段构建Multi-stage build。第一阶段上面所有的步骤是庞大的“编译环境”包含了编译器、源码、中间文件等。第二阶段是一个干净的基础镜像我们只从第一阶段复制运行MySQL所必需的文件进去。# 第二阶段创建运行时镜像 FROM arm64v8/ubuntu:20.04 LABEL maintaineryour-emailexample.com LABEL versionmysql-5.7.44-arm64 LABEL descriptionCustom MySQL 5.7.44 server built for ARM64 ENV DEBIAN_FRONTENDnoninteractive \ MYSQL_HOME/usr/local/mysql \ PATH$PATH:/usr/local/mysql/bin # 安装运行时依赖比编译依赖少得多 RUN apt-get update apt-get install -y \ libaio1 \ libjemalloc2 \ libssl1.1 \ libncurses5 \ libreadline7 \ perl \ rm -rf /var/lib/apt/lists/* \ groupadd -r mysql useradd -r -g mysql mysql # 从编译阶段复制安装好的MySQL COPY --from0 /usr/local/mysql /usr/local/mysql # 创建必要的目录并设置权限 RUN mkdir -p /var/lib/mysql /var/run/mysqld \ chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /usr/local/mysql \ chmod 755 /usr/local/mysql # 复制自定义配置文件 COPY my.cnf /etc/mysql/my.cnf # 暴露端口 EXPOSE 3306 # 定义数据卷 VOLUME [/var/lib/mysql] # 设置健康检查 HEALTHCHECK --interval30s --timeout5s --start-period60s --retries3 \ CMD /usr/local/mysql/bin/mysqladmin ping -h localhost -uroot || exit 1 # 切换用户并设置入口点 USER mysql WORKDIR /usr/local/mysql ENTRYPOINT [mysqld]关键优化解析运行时依赖只安装运行MySQL二进制文件所必需的共享库libaio1,libjemalloc2,libssl1.1等移除了所有-dev开发包和编译工具。这能大幅减小镜像体积。用户与权限创建专用的mysql用户和组并以非root用户运行MySQL服务遵循安全最小权限原则。配置文件通过COPY my.cnf将预定义好的配置文件放入镜像。你需要提前准备一个my.cnf文件放在与Dockerfile相同的目录下。这个文件可以初始化一些关键参数例如[mysqld] usermysql datadir/var/lib/mysql socket/var/run/mysqld/mysqld.sock symbolic-links0 log-error/var/log/mysql/error.log pid-file/var/run/mysqld/mysqld.pid # 性能相关设置可根据ARM服务器内存调整 innodb_buffer_pool_size256M innodb_log_file_size48M max_connections100 character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci [client] default-character-setutf8mb4健康检查HEALTHCHECK指令让Docker能够监控容器内MySQL服务的健康状态这对于编排工具如Kubernetes非常重要。入口点使用ENTRYPOINT [mysqld]使得容器启动时直接运行MySQL服务进程。4.2 构建与验证在包含Dockerfile和my.cnf的目录下执行构建命令docker build -t my-custom-mysql:5.7.44-arm64 .构建成功后运行并验证# 运行容器将数据目录挂载到宿主机 docker run -d \ --name mysql-test \ -p 3306:3306 \ -v /path/to/your/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDyour_secure_password \ my-custom-mysql:5.7.44-arm64 # 进入容器查看版本 docker exec -it mysql-test /usr/local/mysql/bin/mysql --version # 预期输出Ver 14.14 Distrib 5.7.44, for Linux (aarch64) using EditLine wrapper # 客户端连接测试 mysql -h 127.0.0.1 -P 3306 -u root -p看到for Linux (aarch64)就说明我们成功编译出了ARM 64位架构的MySQL。连接后可以进一步检查字符集、引擎等配置是否与编译参数一致。5. 进阶调优与生产环境考量一个能跑的镜像只是开始要用于生产还需要考虑更多。5.1 镜像体积优化通过多阶段构建我们的运行时镜像已经比编译镜像小了很多但还可以进一步“瘦身”使用更小的基础镜像可以考虑用arm64v8/debian:buster-slim或arm64v8/alpine:latest替代Ubuntu。但要注意Alpine使用musl libc可能与某些二进制库存在兼容性问题需要重新编译或测试。对于MySQL使用基于glibc的Debian或Ubuntu更省心。清理不必要的文件在复制MySQL目录后可以删除/usr/local/mysql/docs,/usr/local/mysql/man,/usr/local/mysql/test等非运行时必需的文件。使用Docker的--squash实验性功能需在Docker Daemon开启可以合并镜像层进一步减少层数和体积但会破坏层缓存不利于增量构建。5.2 编译参数深度调优根据你的硬件和负载特点可以调整CMake参数内存分配器我们已经启用了jemalloc。你也可以对比测试tcmalloc通过-DWITH_TCMALLOCsystem看哪个在ARM架构上对你的负载更优。禁用不需要的组件如果确定用不到可以禁用一些存储引擎或插件以减少二进制大小和潜在攻击面例如-DWITH_FEDERATED_STORAGE_ENGINE0 \ -DWITH_PARTITION_STORAGE_ENGINE0 \ # 如果你不用表分区 -DCOMPILATION_COMMENTCustom ARM Build \优化级别CMake默认使用-O2优化。对于追求极致性能可以在make阶段覆盖CFLAGS和CXXFLAGS环境变量尝试-O3或针对ARM架构的优化标志如-mcpunative但这需要充分测试稳定性。5.3 CI/CD集成与自动化手动构建毕竟效率低。可以将整个Dockerfile和配置放入Git仓库利用GitHub Actions、GitLab CI或Jenkins等CI/CD工具进行自动化构建。关键步骤包括在ARM架构的Runner或节点上执行构建例如GitHub Actions的ubuntu-22.04-arm标签。构建成功后将镜像推送到私有镜像仓库如Harbor, AWS ECR, 阿里云ACR。可以编写测试脚本在构建后启动一个临时容器运行基本的SQL连接和查询测试验证镜像功能是否正常。整个过程走下来虽然比直接docker pull费时费力但收获是巨大的你得到了一个版本确定、配置透明、安全可控的专属MySQL镜像。特别是在ARM生态日益壮大的今天掌握这套从源码到镜像的完整能力对于保障基础服务的稳定性和可维护性有着不可替代的价值。本文还有配套的精品资源点击获取
返回列表