基于Alpine构建MySQL 10.11.11镜像的完整教程

embedded/2025/3/17 21:37:41/

基于Alpine构建MySQL 10.11.11镜像的完整教程

在容器化技术日益流行的今天,使用Docker构建高效、轻量级的MySQL镜像成为许多开发者的需求。本教程将详细介绍如何基于Alpine Linux构建MySQL 10.11.11镜像,Alpine Linux以其小巧的体积和快速的启动速度而闻名,非常适合用于构建容器镜像。

文件目录结构

MySQL/
├── docker-entrypoint.sh
├── Dockerfile
└── my.cnf0 directories, 3 files

核心文件内容

Dockerfile
FROM alpine:3.18# 切换至旧版本仓库并安装依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& echo "http://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories \&& apk update \&& apk add --no-cache \mysql=10.11.11-r0 \mysql-client=10.11.11-r0 \mariadb-connector-c-dev=3.3.5-r0 \&& mkdir -p /var/run/mysqld /var/lib/mysql \&& chown -R mysql:mysql /var/run/mysqld /var/lib/mysqlCOPY my.cnf /etc/mysql/my.cnf
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.shVOLUME /var/lib/mysql
EXPOSE 3306ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mysqld", "--user=mysql"]
my.cnf 配置文件
[mysqld]
user=mysql
datadir=/var/lib/mysql
port=3306
character-set-server=utf8
collation-server=utf8_general_ci
default-authentication-plugin=mysql_native_password[client]
default-character-set=utf8
dockerentrypointsh_59">docker-entrypoint.sh
#!/bin/sh
set -eo pipefail# 初始化数据库逻辑
if [ -z "$(ls -A /var/lib/mysql)" ]; thenif ! mysql_install_db --user=mysql --datadir=/var/lib/mysql > /dev/null; thenecho "Failed to initialize MySQL database"exit 1fimysqld --user=mysql --datadir=/var/lib/mysql --skip-networking &MYSQL_PID=$!# 等待MySQL启动until mysqladmin ping --silent; dosleep 1done# 设置root密码if ! mysql -uroot <<-EOSQLALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';FLUSH PRIVILEGES;
EOSQLthenecho "Failed to set root password"exit 1fikill $MYSQL_PIDwait $MYSQL_PID
fi# 启动MySQL服务
exec "$@"

构建及运行命令

构建镜像

在构建镜像时,可以使用--cache-from参数来利用之前构建的缓存,加快构建速度。

docker build --cache-from mysql:10.11-alpine -t mysql:10.11-alpine .
  • 使用docker build命令构建镜像,-t参数指定镜像的标签为mysql:10.11-alpine.表示当前目录为构建上下文。

运行容器(需设置root密码)

docker run -d \--name mysql \-e MYSQL_ROOT_PASSWORD='Tech@12345' \-v mysql_data:/var/lib/mysql \-p 3306:3306 \mysql:10.11-alpine
  • 使用docker run命令运行容器,-d参数表示容器在后台运行。
  • --name mysql指定容器的名称为mysql8
  • -e MYSQL_ROOT_PASSWORD=设置环境变量MYSQL_ROOT_PASSWORD,用于指定MySQL的root用户密码。
  • -v mysql_data:/var/lib/mysql将容器内的/var/lib/mysql目录挂载到名为mysql_data的数据卷上,实现数据持久化。
  • -p 3306:3306将容器的3306端口映射到宿主机的3306端口,方便外部访问。

下面是Dockerfile内容解说

基础镜像选择
FROM alpine:3.18
  • 我们选择alpine:3.18作为基础镜像,因为Alpine Linux的镜像非常小巧,这意味着构建出来的MySQL镜像也会相对较小,从而减少磁盘空间的占用,同时也能加快镜像的拉取和容器的启动速度。
仓库切换与依赖安装
# 切换至旧版本仓库并安装依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& echo "http://mirrors.aliyun.com/alpine/v3.18/community" >> /etc/apk/repositories \&& apk update \&& apk add --no-cache \mysql=10.11.11-r0 \mysql-client=10.11.11-r0 \mariadb-connector-c-dev=3.3.5-r0 \&& mkdir -p /var/run/mysqld /var/lib/mysql \&& chown -R mysql:mysql /var/run/mysqld /var/lib/mysql
  • 使用sed命令将Alpine Linux的软件源替换为阿里云的镜像源,这样可以加快软件包的下载速度。
  • 添加http://mirrors.aliyun.com/alpine/v3.18/community仓库,确保可以获取到所需的软件包。
  • 使用apk update更新软件包列表,然后使用apk add --no-cache安装MySQL服务、MySQL客户端以及mariadb-connector-c-dev--no-cache参数可以避免在镜像中缓存安装包,进一步减小镜像体积。
  • 创建MySQL运行和数据目录/var/run/mysqld/var/lib/mysql,并将其所有者设置为mysql用户,确保MySQL服务有正确的权限。
配置文件和入口脚本复制
COPY my.cnf /etc/mysql/my.cnf
COPY docker-entrypoint.sh /usr/local/bin/
  • 将本地的my.cnf配置文件复制到容器内的/etc/mysql/my.cnf路径,用于配置MySQL服务。
  • docker-entrypoint.sh脚本复制到容器内的/usr/local/bin/路径,该脚本将作为容器的入口点,用于初始化数据库和启动MySQL服务。
数据卷和端口暴露
VOLUME /var/lib/mysql
EXPOSE 3306
  • 使用VOLUME指令声明/var/lib/mysql为数据卷,这样可以将MySQL的数据存储在宿主机上,避免容器删除时数据丢失。
  • 使用EXPOSE指令暴露MySQL服务的默认端口3306,方便容器与外部进行通信。
入口点和默认命令
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["mysqld", "--user=mysql"]
  • 使用ENTRYPOINT指令指定容器启动时执行的脚本为docker-entrypoint.sh
  • 使用CMD指令指定容器启动后默认执行的命令为mysqld --user=mysql,即启动MySQL服务。

my.cnf配置文件详解

mysqld配置段

[mysqld]
user=mysql
datadir=/var/lib/mysql
port=3306
character-set-server=utf8
collation-server=utf8_general_ci
default-authentication-plugin=mysql_native_password[client]
default-character-set=utf8
  • user=mysql:指定MySQL服务运行的用户为mysql
  • datadir=/var/lib/mysql:指定MySQL数据存储的目录为/var/lib/mysql
  • port=3306:指定MySQL服务监听的端口为3306。
  • character-set-server=utf8:设置MySQL服务器的字符集为utf8
  • collation-server=utf8_general_ci:设置MySQL服务器的字符排序规则为utf8_general_ci,支持更广泛的字符范围。
  • default-authentication-plugin=mysql_native_password:强制使用mysql_native_password认证方式,避免部分客户端因兼容性问题无法连接。

client配置段

  • default-character-set=utf8:设置MySQL客户端的默认字符集为utf8

dockerentrypointsh_217">docker-entrypoint.sh脚本详解

#!/bin/sh
set -eo pipefail

脚本开头设置

  • #!/bin/sh:指定脚本使用sh解释器执行。
  • set -eo pipefail:设置脚本在遇到错误时立即退出,并且在管道命令中只要有一个子命令失败,整个管道命令就失败。
# 初始化数据库逻辑
if [ -z "$(ls -A /var/lib/mysql)" ]; thenmysql_install_db --user=mysql --datadir=/var/lib/mysql > /dev/nullmysqld --user=mysql --datadir=/var/lib/mysql --skip-networking &MYSQL_PID=$!# 等待MySQL启动until mysqladmin ping --silent; dosleep 1done# 设置root密码mysql -uroot <<-EOSQLALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';FLUSH PRIVILEGES;EOSQLkill $MYSQL_PIDwait $MYSQL_PID
fi
数据库初始化流程
  • 使用if [ -z "$(ls -A /var/lib/mysql)" ]判断/var/lib/mysql目录是否为空,如果为空则表示数据库尚未初始化。
  • 使用mysql_install_db初始化MySQL数据库
  • 启动MySQL服务,并设置--skip-networking参数,避免在初始化过程中接受外部连接。
  • 使用until mysqladmin ping --silent; do sleep 1; done循环等待MySQL服务启动。
  • 使用mysql -uroot执行SQL语句,修改root用户的密码为环境变量MYSQL_ROOT_PASSWORD的值,并刷新权限。
  • 最后杀死临时启动的MySQL进程,并等待其退出。
启动MySQL服务
# 启动MySQL服务
exec "$@"
  • 使用exec "$@"执行传递给脚本的所有参数,即启动MySQL服务。

关键实现说明

依赖安装

通过mariadb-connector-c-dev提供caching_sha2_password插件支持,同时显式指定MySQL 10.11.11的Alpine软件包版本以确保兼容性。

配置优化

my.cnf中强制使用mysql_native_password认证方式,避免部分客户端因兼容性问题无法连接。

数据持久化

使用VOLUME声明数据目录,并通过docker run-v参数实现宿主机挂载,保证数据安全。

初始化流程

入口脚本docker-entrypoint.sh实现了数据库初始化、密码设置和服务启动的完整流程,兼容官方镜像的行为逻辑。

总结

通过本教程,你学会了如何基于Alpine Linux构建MySQL 10.11.11镜像,包括Dockerfile的编写、配置文件的设置、入口脚本的实现以及镜像的构建和运行。同时,你还了解了如何安装额外的模块,希望这些知识能帮助你更好地使用Docker构建自己的镜像。

文章来源:https://blog.csdn.net/sido777/article/details/146239452
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/embedded/173432.html

相关文章

目前市场上主流的机器视觉的框架有哪些?他们的特点及优劣

目前市场上主流的机器视觉框架和工具可以分为商业软件、开源工具和深度学习框架三大类。以下是它们的总结及特点对比&#xff1a; 1. ​商业软件 (1) ​Halcon (MVTec) ​特点&#xff1a; 专注于工业机器视觉&#xff0c;提供高精度、高效率的算法。支持复杂的工业应用&…

如何解决Redis的缓存雪崩、缓存击穿、缓存穿透?

在redis的使用中特别是有大体量业务的场景&#xff0c;Redis的这三大缓存问题是比较常见的。这篇文章来分析一下&#xff0c; 这三个问题到底是什么&#xff0c;以及有什么解决方案。 1、缓存雪崩 缓存雪崩的发生主要有两个场景&#xff0c;一个是有大量的请求无法再Redis缓存…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(45)血海轮回阵 - Floyd-Warshall 多源最短路径

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(45)血海轮回阵 - Floyd-Warshall 多源最短路径 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的血海轮回阵,阵中血液般的液体在沟渠中流动,形成复杂的路径。阵的入口处有一块巨大的石碑,上面刻着一行…

【每日学点HarmonyOS Next知识】tab对齐、相对布局、自定义弹窗全屏、动画集合、回到桌面

1、HarmonyOS Tabs 是否能支持 tabbar 居左对齐&#xff1f; 当前方案为自定义tabbar实现&#xff0c;示例demo&#xff1a; Entry Component struct TabsExample {State tabArray: Array<number> [0, 1,2]State focusIndex: number 0State pre: number 0State inde…

JVM的垃圾回收器都有哪些?

在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;不同的垃圾回收器采用不同的算法和策略&#xff0c;以满足不同应用场景的性能需求。以下为你详细介绍常见的 JVM 垃圾回收器&#xff1a; 新生代垃圾回收器 1. Serial 收集器 特点&#xff1a;单线程的垃圾回收器&a…

CSS3-流星雨

1. 绘制标签 <div class"container"><span></span> </div>2. 设置div背景 在百度上搜索一幅星空的图片 <style>* {/* 初始化 */margin: 0;padding: 0;}body {/* 高度100% */height: 100vh;/* 溢出隐藏 */overflow: hidden;}.contai…

【商城实战(37)】Spring Boot配置优化:解锁高效商城开发密码

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…

ASP.NET Webform和ASP.NET MVC 后台开发 大概80%常用技术

本文涉及ASP.NET Webform和ASP.NET MVC 后台开发大概80%技术 2019年以前对标 深圳22K左右 广州18K左右 武汉16K左右 那么有人问了2019年以后的呢&#xff1f; 答&#xff1a;吉祥三宝。。。 So 想继续看下文的 得有自己的独立判断能力。 C#.NET高级笔试题 架构 优化 性能提…