Docker 中安装单体架构 MySQL 的 Shell 脚本

news2024/10/7 11:32:20

该脚本用于实现 root 用户在 Linux 操作系统下的 Docker 中安装单体架构 MySQL

Shell 脚本 Git 仓库地址

Gitee:https://gitee.com/tongchaowei/common-shell/tree/main/root

执行脚本

bash ./docker-mysql-install-single.sh

image.png

需要注意的

  • 该脚本会先检查是否安装了社区版 Docker,如果没有安装,则会退出脚本的执行,所以请先完成社区版 Docker 的安装
  • 该脚本会进行如下目录的映射:
    • /log: /var/log/mysql:MySQL 日志文件存放目录
    • /data:/var/lib/mysql,MySQL 数据表和数据文件存放的目录
    • /conf:/etc/mysql,MySQL 配置文件目录
    • /mysql-files:/var/lib/mysql-files,MySQL 相关文件,这个映射主要是防止报错
    • /csv:/var/lib/mysql-csv,MySQL 配置文件中配置的用于存放数据库 csv 格式导出文件
  • 该脚本启动容器时,会自动设置的参数如下:
    • --restart=always:跟随系统启动而自启
    • --privileged=true:容器具有 root 权限

MySQL 配置文件

配置文件中的配置项的说明,可以参考:https://www.yuque.com/u27599042/ugk6po/uosu9hbt78g24g0x

该脚本在成功启动 MySQL 容器后,编写的配置文件内容如下:

配置文件存放位置:$docker_mysql_home/conf/conf.d/my.cnf
docker_mysql_home:Docker 安装 MySQL 相关映射目录和文件的家目录

# MySQL 服务端的相关配置
[mysqld]
# MySQL 集群中的每个 MySQL 服务端的唯一标识
# server-id=1
# MySQL 服务端运行监听来自客户端连接的端口号
port=3306
# 是否跳过(关闭) MySQL 服务端的域名解析
# 1 表示跳过(关闭) MySQL 服务端的域名解析
skip_name_resolve=1
# MySQL 服务端关闭交互式连接前等待活动的时间
# 如果超过这个时间,客户端还未发送数据过来,服务端则会断开本次连接。
# interactive_timeout=28800
# MySQL 服务端等待来自非交互式连接的客户端的数据的最长时间
# 如果超过这个时间,客户端还未发送数据过来,服务端则会断开本次连接。
wait_timeout=300
# MySQL 服务端的默认时区
default-time_zone='+8:00'
# MySQL 服务端的默认存储引擎
default-storage-engine=InnoDB
# MySQL 服务端的字符集编码
character-set-server=utf8mb4
# MySQL 服务端的比较规则
# 要和 character-set-server 配置项配置的 MySQL 服务端的字符集编码对应
collation-server=utf8mb4_general_ci
# 客户端连接 MySQL 服务端时使用的字符集
init_connect='SET NAMES utf8mb4'
# MySQL 服务端是否对 SQL 语句大小写敏感
# 1 表示对 SQL 语句大小写不敏感
lower_case_table_names=1
# MySQL 服务端使用的默认密码校验规则插件
# MySQL 8.3.0 中“mysql_native_password”已弃用,并将在将来的版本中删除。请改用caching_sha2_password'
# default_authentication_plugin=mysql_native_password
default_authentication_plugin=caching_sha2_password
# 如果进行要进行如下配置项的配置修改,log-error 需要手动创建 error.log 文件,否则会报错,
# datadir secure_file_priv 需要在容器启动时做好目录映射,且存放数据表和数据文件的目录要保证为空,否则会报错  
# 报错日志写入位置
# log-error=/var/lib/mysql/log/error.log
# MySQL 服务端进程 ID 的存放文件及其位置
pid-file=/var/lib/mysql/mysqld.pid
# MySQL 服务端中的数据表和数据文件的存放位置
datadir=/var/lib/mysql
# MySQL 数据库中数据表中的数据导出到 csv 文件中,csv 文件的存放位置
secure_file_priv=/var/lib/mysql-csv

# 连接访问 MySQL 的客户端的相关配置
[client]
# MySQL 接收来自客户端连接访问请求时客户端使用的字符集
default-character-set=utf8mb4

Shell 脚本源码

#!/bin/bash
# 该脚本用于实现 root 用户在 Linux 操作系统下的 Docker 中安装单体架构 MySQL

# 临时保存并修改语言环境
LANG_temp=$LANG
LANG=zh_CN.UTF-8

# 还原语言环境
function re_lang () {
    # 将语言环境修改回原来的值
    LANG=$LANG_temp
}

# 还原语言环境,并无异常退出
function re_lang_exit () {
    re_lang
    exit 0
}

function success_text () {
    echo -e -n "\033[32m【SUCCESS】\033[0m"
}

function warn_text () {
    echo -e -n "\033[33m【WARN】\033[0m"
}

function error_text () {
    echo -e -n "\033[31m【ERROR】\033[0m"
}

# 如果传入的目录不存在,进行目录的创建
function mkdir_404 () {
    if [ ! -d $1 ]; then
        warn_text
	echo "目录 $1 不存在,进行目录的创建..."
	mkdir -p $1
	success_text
	echo "目录 $1 创建成功"
    else
        success_text
	echo "目录 $1 已存在,无需进行创建."
    fi
}

# 检查是否安装了社区版 Docker
is_docker_ce_install=`rpm -q docker-ce | grep '未安装软件包.*'`
if [ ${#is_yum_install} -gt 0 ]; then
    error_text
    echo '还未安装社区版 Docker,请先进行安装.'
    re_lang_exit
fi

# 启动 Docker 并开启 Docker 开机自启,确保 Docker 处于运行状态
echo "Docker 启动中..."
systemctl start docker || re_lang_exit
echo "开启 Docker 开机自启中..."
systemctl enable docker || re_lang_exit

# 要进行安装的 MySQL 的版本
docker_mysql_version_default=latest
read -p "请输入要安装的 MySQL 版本(默认 $docker_mysql_version_default):" docker_mysql_version
if [ -z "$docker_mysql_version" ]; then
    docker_mysql_version=$docker_mysql_version_default
fi

# Docker MySQL 镜像名称
if [ "$docker_mysql_version" = "latest" ]; then
    docker_mysql_image_name=mysql
else
    docker_mysql_image_name=mysql:$docker_mysql_version
fi

# Docker 安装 MySQL 相关映射目录和文件的家目录
docker_mysql_home_default=/home/docker/mysql
read -p "请输入 Docker 安装 MySQL 相关映射目录和文件的家目录(默认 $docker_mysql_home_default):" docker_mysql_home
if [ -z "$docker_mysql_home" ]; then
    docker_mysql_home=$docker_mysql_home_default
fi

# 需要进行映射的目录
need_map_dir=( /log /data /conf /mysql-files /csv )

# 目录如果不存在,进行目录的创建
mkdir_404 $docker_mysql_home
for (( i=0; i<${#need_map_dir[*]}; i++ )); do
    # 删除原先存在的 MySQL 容器的映射目录
    rm -rf $docker_mysql_home${need_map_dir[i]}
    warn_text
    echo "已删除 $docker_mysql_home${need_map_dir[i]} 目录及其子目录和其中的文件"
    mkdir_404 $docker_mysql_home${need_map_dir[i]}
done

# 查询 Docker 中是否存在 MySQL 镜像,不存在,进行镜像的拉取
docker_mysql_image=`docker images -a | grep 'mysql' | grep "$docker_mysql_version"`
if [ -z "$docker_mysql_image" ]; then
    warn_text
    echo "Docker 中不存在 $docker_mysql_image_name 镜像"
    echo "开始拉取镜像 $docker_mysql_image_name..."
    docker pull $docker_mysql_image_name || re_lang_exit
    success_text
    echo "拉取 $docker_mysql_image_name 镜像成功"
else
    success_text
    echo "镜像 $docker_mysql_image_name 已存在,无需进行拉取"
fi

# MySQL Docker 容器名称
docker_mysql_container_name=mysql$docker_mysql_version

# 判断容器是否存在,如果存在,手动输入指定容器名称
while true; do
    if [ ! -z "`docker ps -a | grep \"$docker_mysql_container_name\"`" ]; then
        error_text
	echo "名称为 $docker_mysql_container_name 的 Docker 容器已经存在"
	read -p "请输入新 Docker 容器名称:" docker_mysql_container_name
    else
	if [ -z "$docker_mysql_container_name" ]; then
	    error_text
	    echo "Docker 容器名称不能为空."
	    read -p "请输入新 Docker 容器名称:" docker_mysql_container_name
	    continue
	fi
        break
    fi 
done

# 先运行一个 MySQL docker 容器,获取初始的配置文件后,将其删除
docker run --name $docker_mysql_container_name -d $docker_mysql_image_name || re_lang_exit
docker cp $docker_mysql_container_name:/etc/mysql $docker_mysql_home${need_map_dir[2]} || re_lang_exit
mv $docker_mysql_home${need_map_dir[2]}/mysql/* $docker_mysql_home${need_map_dir[2]}/ || re_lang_exit
docker rm -f $docker_mysql_container_name || re_lang_exit

# MySQL 容器运行时的端口,即容器的端口映射
while true; do
    read -p "请输入 MySQL 容器运行映射的端口号(默认 3306):" mysql_port
    if [ -z "$mysql_port" ]; then
        mysql_port=3306
    fi
    # 判断端口是否被占用
    if [ ! -z "`lsof -i:$mysql_port`" ]; then
        error_text
	echo "端口 $mysql_port 已经被占用,请选择未被占用的端口号."
    else
	break
    fi
done

# MySQL root 用户的初始密码
read -p "请输入 MySQL 数据库 root 用户的初始密码(默认 root):" mysql_root_pwd
if [ -z "$mysql_root_pwd" ]; then
    mysql_root_pwd=root
fi

# 运行 MySQL 容器, 
docker run \
-p $mysql_port:3306 \
--name $docker_mysql_container_name \
--restart=always \
--privileged=true \
-v $docker_mysql_home/conf:/etc/mysql \
-v $docker_mysql_home/data:/var/lib/mysql \
-v $docker_mysql_home/log:/var/log/mysql \
-v $docker_mysql_home/mysql-files:/var/lib/mysql-files \
-v $docker_mysql_home/csv:/var/lib/mysql-csv \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=$mysql_root_pwd \
-d $docker_mysql_image_name \
 || re_lang_exit

success_text
echo "MySQL 容器启动运行成功."
echo "MySQL 容器运行情况如下:"
docker ps -f name=$docker_mysql_container_name

# 编写 MySQL 配置文件
echo "开始编写 MySQL 配置文件..."
echo
tee $docker_mysql_home/conf/conf.d/my.cnf <<- EOF
# MySQL 服务端的相关配置
[mysqld]
# MySQL 集群中的每个 MySQL 服务端的唯一标识
# server-id=1
# MySQL 服务端运行监听来自客户端连接的端口号
port=3306
# 是否跳过(关闭) MySQL 服务端的域名解析
# 1 表示跳过(关闭) MySQL 服务端的域名解析
skip_name_resolve=1
# MySQL 服务端关闭交互式连接前等待活动的时间
# 如果超过这个时间,客户端还未发送数据过来,服务端则会断开本次连接。
# interactive_timeout=28800
# MySQL 服务端等待来自非交互式连接的客户端的数据的最长时间
# 如果超过这个时间,客户端还未发送数据过来,服务端则会断开本次连接。
wait_timeout=300
# MySQL 服务端的默认时区
default-time_zone='+8:00'
# MySQL 服务端的默认存储引擎
default-storage-engine=InnoDB
# MySQL 服务端的字符集编码
character-set-server=utf8mb4
# MySQL 服务端的比较规则
# 要和 character-set-server 配置项配置的 MySQL 服务端的字符集编码对应
collation-server=utf8mb4_general_ci
# 客户端连接 MySQL 服务端时使用的字符集
init_connect='SET NAMES utf8mb4'
# MySQL 服务端是否对 SQL 语句大小写敏感
# 1 表示对 SQL 语句大小写不敏感
lower_case_table_names=1
# MySQL 服务端使用的默认密码校验规则插件
# MySQL 8.3.0 中“mysql_native_password”已弃用,并将在将来的版本中删除。请改用caching_sha2_password'
# default_authentication_plugin=mysql_native_password
default_authentication_plugin=caching_sha2_password
# 如果进行要进行如下配置项的配置修改,log-error 需要手动创建 error.log 文件,否则会报错,
# datadir secure_file_priv 需要在容器启动时做好目录映射,且存放数据表和数据文件的目录要保证为空,否则会报错  
# 报错日志写入位置
# log-error=/var/lib/mysql/log/error.log
# MySQL 服务端进程 ID 的存放文件及其位置
pid-file=/var/lib/mysql/mysqld.pid
# MySQL 服务端中的数据表和数据文件的存放位置
datadir=/var/lib/mysql
# MySQL 数据库中数据表中的数据导出到 csv 文件中,csv 文件的存放位置
secure_file_priv=/var/lib/mysql-csv

# 连接访问 MySQL 的客户端的相关配置
[client]
# MySQL 接收来自客户端连接访问请求时客户端使用的字符集
default-character-set=utf8mb4
EOF
success_text
echo "MySQL 配置文件编写完成."

echo "重启 MySQL 容器..."
docker restart $docker_mysql_container_name || re_lang_exit
success_text
echo "重启 MySQL 容器成功."

re_lang


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为配置mDNS网关示例(AP与AC间二层转发)

华为配置mDNS网关示例&#xff08;AP与AC间二层转发&#xff09; 组网图形 图1 配置mDNS网关组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业的移动终端通过WLAN连接网络&#xff0c;AP_1和AP_2分别与AC之间采用二层转发。部门1和部门2分别属…

Elasticsearch中对文章进行索引和查重

解决思路 要在Elasticsearch中对文章进行索引和查重&#xff0c;可以按照以下步骤操作&#xff1a; 安装Elasticsearch并启动服务。 安装Python的Elasticsearch客户端库&#xff0c;可以使用pip install elasticsearch命令进行安装。 编写Python代码&#xff0c;使用Elastic…

照片特定风格变换Stylar AI;GPT-4V开源替代方案InternVL;纯C/C++实现的Stable Diffusion库;基于AI的数据爬取

✨ 1: AI Photo Filter Stylar AI是一款功能强大的AI图像编辑与设计工具&#xff0c;提供无与伦比的图片组合和风格控制。 AI Photo Filter&#xff0c;简言之&#xff0c;就是使用人工智能技术来改善或改变图片的风格、质量和元素组合的一种工具。 如果你想将你的照片转换成…

如何看待Agent AI智能体的未来

Agent AI智能体的未来 Agent AI智能体&#xff0c;也称为自主代理或智能代理&#xff0c;是指能够自主执行任务、与环境交互并作出决策的计算机程序或系统。这些智能体通常具备学习、适应和推理的能力&#xff0c;能够在复杂和不确定的环境中执行任务。随着技术的进步&#xf…

爬虫自动调用shell通过脚本运行scrapy爬虫(crawler API)

一、爬虫时如何同时调用shell 1)终端cd项目>>scrapy crawl example 2)打开example.py import scrapy from scrapy.shell import inspect_response#引入shellclass ExampleSpider(scrapy.Spider):name "example"allowed_domains ["example.com"]…

【EI会议|稳定检索】2024年传感技术与图像处理国际会议(ICSTIP 2024)

2024 International Conference on Sensing Technology and Image Processing 一、大会信息 会议名称&#xff1a;2024年传感技术与图像处理国际会议会议简称&#xff1a;ICSTIP 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;htt…

开源代码分享(26)-考虑预测不确定性的综合能源调度优化

参考文献&#xff1a; [1]崔杨,周慧娟,仲悟之,等.考虑源荷两侧不确定性的含风电电力系统低碳调度[J].电力自动化设备,2020,40(11):85-93.DOI:10.16081/j.epae.202009019. 1.基本原理 考虑碳交易机制能够有效提高风电消纳量&#xff0c;但是随着风电并网容量的增大&#xff0c…

【酱浦菌-爬虫项目】python爬取彼岸桌面壁纸

首先&#xff0c;代码导入了两个库&#xff1a;requests和parsel。这些库用于处理HTTP请求和解析HTML内容。 然后&#xff0c;它定义了一个变量url&#xff0c;指向网站’樱花2024年4月日历风景桌面壁纸_高清2024年4月日历壁纸_彼岸桌面’。 接下来&#xff0c;设置了一个HTT…

每天五分钟玩转深度学习PyTorch:创建pytorch中的零维标量tensor

标量是什么? tensor张量是一个多维数组,零维就是一个点(就是本章的标量),一维就是向量,二维就是一般的矩阵,多维就相当于一个多维的数组,这和 numpy理解是一样的,不同的是Tensor不仅可以在CPU上跑,在GPU上也可以跑。 标量(scalar),只具有数值大小,而没有方向,…

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介 1.1 COM是什么&#xff1f; COM&#xff0c;Component Object Model&#xff0c;即组件对象模型&#xff0c;是一种以组件为发布单元的对象模型&#xff0c;这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范&#xff0c;也…

【matplot】【matlab】绘制简洁美观二维坐标系的一个例子

觉得下图不错美观大方&#xff0c;现仿制下图&#xff1a; import numpy as np import matplotlib.pyplot as pltdef sigmoid(x):return 1 / (1 np.exp(-x))def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 设置中文字体 plt.rcParams[font.family] [Tim…

使用opencv改变图片大小

使用opencv改变图片大小 图片的宽度和高度效果代码 图片的宽度和高度 宽度&#xff1a;图片的宽度指的是图像从左边缘到右边缘的水平跨度。在数字图像中&#xff0c;宽度通常是以像素&#xff08;pixels&#xff09;为单位来度量的。高度&#xff1a;图片的高度指的是图像从上…

面试中算法(最小栈)

最小栈的实现 实现一个栈&#xff0c;该栈有出栈(pop&#xff09;、入栈(push)、取最小元素(get_min) 。要保证时间复杂度都是O (1&#xff09;。 第1步&#xff1a;设原有的栈叫作栈A&#xff0c;额外的“备胎”栈B&#xff0c;用于辅助栈A。 当第1个元素进入栈A时&#xff0c…

“科技让广告更精彩”四川迈瑞斯文化传媒有限公司 行业领先的一站式媒体采购供应平台

国际数字影像产业园与园区企业一同推动数字影像技术的创新与发展&#xff0c;为数字影像产业注入新的活力。其中&#xff0c;四川迈瑞斯文化传媒有限公司&#xff08;906&#xff09;作为数字媒体行业的优秀企业&#xff0c;坚持“科技让广告更精彩”的理念&#xff0c;致力于为…

谷歌浏览器查看http请求的请求标头和响应标头

http://t.weather.itboy.net/api/weather/city/101010100 记得刷新&#xff0c;才算请求了一次服务器 响应标头&#xff1a; HTTP/1.1 200 OK Content-Type: application/json; 请求标头&#xff1a; GET /api/weather/city/101010100 HTTP/1.1 Host: t.weather.itboy.n…

Spark持久化、broadcast广播变量和accumulator累加器

持久化操作 什么是持久化&#xff0c;为什么要持久化 Spark中最重要的功能之一是跨操作在内存中持久化&#xff08;或缓存&#xff09;数据集。当您持久化RDD时&#xff0c;每个节点将其计算的任何分区存储在内存中&#xff0c;并在该数据集&#xff08;或从该数据集派生的数…

Arcgis Pro 制图基础操作流程

为什么推荐用Arcgis Pro 出图&#xff1f; 1、相比Arcmap 10.X&#xff0c;Pro的制图功能更强大&#xff0c;制图更便捷 2、相比PS&#xff0c;Arcgis Pro中的数据自带坐标&#xff0c;无需校正&#xff0c;表达更准确 3、自带底图&#xff0c;方便又美观 01 — 与Arcmap …

Objective-C大爆炸:从零到单例模式

oc学习笔记&#xff08;一&#xff09; 文章目录 oc学习笔记&#xff08;一&#xff09;oc与c语言的区别#import的用法foundation框架NSLog函数NSString类型符号的作用oc中的数据类型 类与对象概念&#xff1a; 创建第一个类类的定义类的实现类加载对象的产生和使用 self语法id…

对于button按钮引发的bug

主要原因就是今天在给button按钮添加一个点击事件的时候&#xff0c;并没有声明button的type类型&#xff0c;就一直发生点击按钮但事件并不触发的问题。 触发这种问题的原因就是: 按钮默认的 type 类型是 "submit"&#xff0c;而不是 "button"。当你不显式…

AI视频教程下载:用ChatGPT提示词开发AI应用和GPTs

在这个课程中&#xff0c;你将深入ChatGPT的迷人世界&#xff0c;学习如何利用其能力构建创新和有影响力的工具。你将发现如何创建不仅吸引而且保持用户参与度的应用程序&#xff0c;将流量驱动到你的网站&#xff0c;并开辟新的货币化途径。 **课程的主要特点&#xff1a;** …