Files
DependencyDocker/mysql/install-mysql8.0.44-docker.sh
2025-11-08 18:05:44 +08:00

347 lines
11 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# MySQL Docker 自动安装脚本
# 使用镜像: 根据网络环境自动选择官方或第三方镜像
###############################################################################
# 版权声明
# 该脚本由X博客"xblog.tech"编写与维护
# 版权所有 (c) 2025 X博客. 保留所有权利.
# 未经许可,不得擅自复制、修改或发布本脚本
###############################################################################
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # 无颜色
# 彩色输出函数
color_echo() {
local color=$1
shift
echo -e "${color}$*${NC}"
}
# 检查并安装curl如果需要
check_and_install_curl() {
if ! command -v curl &> /dev/null; then
color_echo $YELLOW "检测到系统未安装curl正在尝试安装..."
# 根据不同的包管理器尝试安装curl
if command -v apt-get &> /dev/null; then
color_echo $BLUE "使用apt-get安装curl..."
sudo apt-get update && sudo apt-get install -y curl
elif command -v yum &> /dev/null; then
color_echo $BLUE "使用yum安装curl..."
sudo yum install -y curl
elif command -v dnf &> /dev/null; then
color_echo $BLUE "使用dnf安装curl..."
sudo dnf install -y curl
elif command -v apk &> /dev/null; then
color_echo $BLUE "使用apk安装curl..."
sudo apk add curl
else
color_echo $RED "无法自动安装curl请手动安装后再运行此脚本"
color_echo $YELLOW "您可以运行以下命令之一来安装curl:"
color_echo $CYAN " Ubuntu/Debian: sudo apt-get install curl"
color_echo $CYAN " CentOS/RHEL: sudo yum install curl"
color_echo $CYAN " Fedora: sudo dnf install curl"
color_echo $CYAN " Alpine: sudo apk add curl"
exit 1
fi
# 验证安装是否成功
if command -v curl &> /dev/null; then
color_echo $GREEN "✓ curl安装成功"
else
color_echo $RED "✗ curl安装失败请手动安装后再运行此脚本"
exit 1
fi
else
color_echo $GREEN "✓ 系统已安装curl"
fi
echo ""
}
color_echo $PURPLE "=== MySQL 8.0.44 Docker 自动安装脚本 ==="
echo ""
# 检查Docker是否安装
if ! command -v docker &> /dev/null; then
color_echo $RED "错误: Docker 未安装请先安装Docker"
color_echo $YELLOW "安装Docker的参考命令:"
color_echo $CYAN " curl -fsSL https://get.docker.com -o get-docker.sh"
color_echo $CYAN " sudo sh get-docker.sh"
exit 1
fi
color_echo $GREEN "✓ Docker 已安装"
echo ""
# 检查并确保curl已安装
check_and_install_curl
# 网络环境检测和镜像选择
color_echo $BLUE "检测网络环境..."
OFFICIAL_IMAGE="library/mysql:8.0.44"
THIRD_PARTY_IMAGE="docker.1ms.run/library/mysql:8.0.44"
# 检测是否能够访问Docker Hub
check_network() {
color_echo $BLUE "正在测试网络连接..."
# 尝试访问Docker Hub
if curl --connect-timeout 10 -s https://hub.docker.com/ > /dev/null; then
color_echo $GREEN "✓ 可以访问 Docker Hub"
return 0
else
color_echo $YELLOW "✗ 无法访问 Docker Hub"
return 1
fi
}
# 选择镜像源
select_image_source() {
if check_network; then
MYSQL_IMAGE=$OFFICIAL_IMAGE
color_echo $GREEN "将使用官方镜像: $MYSQL_IMAGE"
else
echo ""
color_echo $YELLOW "⚠️ ⚠️ ⚠️ 安全提示 ⚠️ ⚠️ ⚠️"
color_echo $RED "您即将调用第三方镜像源进行容器的创建,在此之前请您确认您信任该镜像的来源"
color_echo $YELLOW "镜像来源: \"毫秒镜像 1ms.run/r/library/mysql\""
echo ""
color_echo $CYAN "若您同意使用该镜像请您输入 y 确认: "
read -p "确认使用第三方镜像 (y/N): " CONFIRM_THIRD_PARTY
if [[ $CONFIRM_THIRD_PARTY =~ ^[Yy]$ ]]; then
MYSQL_IMAGE=$THIRD_PARTY_IMAGE
color_echo $GREEN "将使用第三方镜像: $MYSQL_IMAGE"
else
color_echo $YELLOW "安装已取消"
exit 0
fi
fi
echo ""
}
# 执行镜像源选择
select_image_source
# 交互式获取用户输入
color_echo $PURPLE "请配置MySQL安装参数可直接回车使用默认值"
color_echo $CYAN "=========================================="
# 容器名称
read -p "$(color_echo $BLUE '1. 输入容器名称') [$(color_echo $GREEN '默认: mysql-8.0.44')]: " CONTAINER_NAME
CONTAINER_NAME=${CONTAINER_NAME:-"mysql-8.0.44"}
# MySQL root密码
while true; do
read -s -p "$(color_echo $BLUE '2. 输入MySQL root密码 (输入将隐藏)') : " MYSQL_ROOT_PASSWORD
echo
if [ -z "$MYSQL_ROOT_PASSWORD" ]; then
color_echo $RED "错误: Root密码不能为空请重新输入"
continue
fi
read -s -p "$(color_echo $BLUE '请再次确认root密码') : " MYSQL_ROOT_PASSWORD_CONFIRM
echo
if [ "$MYSQL_ROOT_PASSWORD" != "$MYSQL_ROOT_PASSWORD_CONFIRM" ]; then
color_echo $RED "错误: 两次输入的密码不一致,请重新输入"
else
break
fi
done
# 端口号
read -p "$(color_echo $BLUE '3. 输入MySQL映射端口') [$(color_echo $GREEN '默认: 3306')]: " MYSQL_PORT
MYSQL_PORT=${MYSQL_PORT:-"3306"}
# 检查端口是否被占用
if command -v lsof &> /dev/null; then
if lsof -Pi :$MYSQL_PORT -sTCP:LISTEN -t >/dev/null ; then
color_echo $YELLOW "警告: 端口 $MYSQL_PORT 已被占用,请选择其他端口"
read -p "$(color_echo $BLUE '输入新的MySQL映射端口'): " MYSQL_PORT
fi
else
color_echo $YELLOW "注意: 无法检查端口占用情况lsof未安装请确保端口 $MYSQL_PORT 可用"
fi
# 数据目录
read -p "$(color_echo $BLUE '4. 输入数据存储目录') [$(color_echo $GREEN '默认: /docker/mysql/data')]: " DATA_DIR
DATA_DIR=${DATA_DIR:-"/docker/mysql/data"}
# 配置目录
read -p "$(color_echo $BLUE '5. 输入配置存储目录') [$(color_echo $GREEN '默认: /docker/mysql/conf')]: " CONF_DIR
CONF_DIR=${CONF_DIR:-"/docker/mysql/conf"}
# 显示配置摘要
echo ""
color_echo $PURPLE "=== 安装配置摘要 ==="
color_echo $CYAN "容器名称: $CONTAINER_NAME"
color_echo $CYAN "MySQL 端口: $MYSQL_PORT"
color_echo $CYAN "数据目录: $DATA_DIR"
color_echo $CYAN "配置目录: $CONF_DIR"
color_echo $CYAN "使用镜像: $MYSQL_IMAGE"
color_echo $CYAN "Root密码: ******"
echo ""
color_echo $YELLOW "注意: 此安装只创建root用户不创建额外数据库和用户"
echo ""
# 确认安装
read -p "$(color_echo $BLUE '是否继续安装?(y/n)') [$(color_echo $GREEN '默认: y')]: " CONFIRM_INSTALL
CONFIRM_INSTALL=${CONFIRM_INSTALL:-"y"}
if [[ ! $CONFIRM_INSTALL =~ ^[Yy]$ ]]; then
color_echo $YELLOW "安装已取消"
exit 0
fi
echo ""
color_echo $GREEN "开始安装 MySQL 8.0.44..."
echo ""
# 创建数据目录和配置目录
color_echo $BLUE "创建数据目录..."
sudo mkdir -p $DATA_DIR
sudo mkdir -p $CONF_DIR
sudo chmod -R 755 $DATA_DIR
sudo chmod -R 755 $CONF_DIR
color_echo $GREEN "✓ 目录创建完成: $DATA_DIR, $CONF_DIR"
# 拉取MySQL镜像
color_echo $BLUE "拉取 MySQL 镜像: $MYSQL_IMAGE"
docker pull $MYSQL_IMAGE
color_echo $GREEN "✓ MySQL 镜像拉取完成"
# 创建自定义配置文件
color_echo $BLUE "创建MySQL配置文件..."
sudo tee $CONF_DIR/my.cnf > /dev/null << EOF
[mysqld]
default_authentication_plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
max_connections=1000
innodb_buffer_pool_size=256M
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
EOF
color_echo $GREEN "✓ 配置文件创建完成"
# 停止并删除已存在的同名容器(如果存在)
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
color_echo $YELLOW "发现已存在的容器,停止并删除..."
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
color_echo $GREEN "✓ 旧容器已清理"
fi
# 运行MySQL容器只设置root密码
color_echo $BLUE "启动 MySQL 容器..."
docker run -d \
--name $CONTAINER_NAME \
--restart=unless-stopped \
-p $MYSQL_PORT:3306 \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-v $DATA_DIR:/var/lib/mysql \
-v $CONF_DIR:/etc/mysql/conf.d \
$MYSQL_IMAGE
color_echo $GREEN "✓ MySQL 容器启动完成"
# 等待MySQL启动
color_echo $BLUE "等待MySQL服务启动..."
for i in {1..30}; do
if docker logs $CONTAINER_NAME 2>&1 | grep -q "Ready for start up"; then
color_echo $GREEN "✓ MySQL 启动完成"
break
fi
color_echo $YELLOW "等待MySQL启动... ($i/30)"
sleep 2
done
# 检查容器状态
if [ "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
color_echo $GREEN "✓ MySQL 容器正在运行"
# 测试连接
color_echo $BLUE "测试MySQL连接..."
sleep 5
if docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1;" &> /dev/null; then
color_echo $GREEN "✓ MySQL 连接测试成功"
# 显示默认数据库
color_echo $BLUE "默认数据库列表:"
docker exec $CONTAINER_NAME mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW DATABASES;"
else
color_echo $YELLOW "⚠️ MySQL 连接测试失败,请检查日志"
docker logs $CONTAINER_NAME
fi
else
color_echo $RED "❌ MySQL 容器启动失败"
docker logs $CONTAINER_NAME
exit 1
fi
# 显示安装完成信息
echo ""
color_echo $PURPLE "=== MySQL 安装完成 ==="
color_echo $GREEN "容器名称: $CONTAINER_NAME"
color_echo $GREEN "MySQL 版本: 8.0.44"
color_echo $GREEN "连接地址: 127.0.0.1:$MYSQL_PORT"
color_echo $GREEN "数据目录: $DATA_DIR"
color_echo $GREEN "配置目录: $CONF_DIR"
color_echo $GREEN "使用镜像: $MYSQL_IMAGE"
color_echo $GREEN "Root 用户: root"
echo ""
color_echo $CYAN "管理命令:"
color_echo $BLUE "查看日志: docker logs $CONTAINER_NAME"
color_echo $BLUE "进入容器: docker exec -it $CONTAINER_NAME bash"
color_echo $BLUE "连接MySQL: docker exec -it $CONTAINER_NAME mysql -uroot -p"
color_echo $BLUE "停止容器: docker stop $CONTAINER_NAME"
color_echo $BLUE "启动容器: docker start $CONTAINER_NAME"
echo ""
# 保存配置信息到文件(可选)
CONFIG_FILE="./mysql_install_${CONTAINER_NAME}.info"
cat > $CONFIG_FILE << EOF
MySQL 安装配置信息
安装时间: $(date)
容器名称: $CONTAINER_NAME
MySQL 版本: 8.0.44
连接端口: $MYSQL_PORT
数据目录: $DATA_DIR
配置目录: $CONF_DIR
使用镜像: $MYSQL_IMAGE
Root 密码: $MYSQL_ROOT_PASSWORD
EOF
color_echo $GREEN "配置信息已保存到: $CONFIG_FILE"
color_echo $YELLOW "请注意妥善保管此文件,特别是密码信息!"
echo ""
color_echo $CYAN "安装后建议操作:"
color_echo $BLUE "1. 登录MySQL后创建所需的数据库和用户"
color_echo $BLUE "2. 根据需求调整MySQL配置"
color_echo $BLUE "3. 考虑设置定期备份策略"
###############################################################################
# 版权声明
# 该脚本由X博客"xblog.tech"编写与维护
# 版权所有 (c) 2025 X博客. 保留所有权利.
# 未经许可,不得擅自复制、修改或发布本脚本
###############################################################################