Docker 部署 MySQL容器 & 使用 shell 脚本部署

1、使用 pull 拉取 MySQL 镜像

# latest 为当前最新版本,也可以根据需要选择版本
docker pull mysql:latest

拉取镜像前可以先去 Docker Hub 上去查看相关版本
https://hub.docker.com/_/mysql/tags

在这里插入图片描述

2、创建需要映射的本地目录和配置文件

将 mysql 容器内的相关目录映射到本机,方便进行配置和查看

# 创建需要映射的相关目录
mkdir -p /opt/mysql/{conf,logs,data}

# 创建配置文件
vim /opt/mysql/my.cnf
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

3、启动 MySQL 容器

注意配置文件中的映射端口、容器名和密码

docker run --restart=always --privileged=true  \
-v /opt/mysql/data/:/var/lib/mysql \
-v /opt/mysql/logs/:/var/log/mysql \
-v /opt/mysql/conf/:/etc/mysql \
-v /opt/mysql/my.cnf:/etc/mysql/my.cnf  \
-p 3306:3306 --name my-mysql \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql

4、进入容器并登录 MySQL

docker ps	# 查看已经运行的容器,因为我的3306端口已经被占用,所以我映射到了9999端口
CONTAINER ID	IMAGE	COMMAND						CREATED       STATUS                 PORTS                               NAMES
16dd3199f81d	mysql	"docker-entrypoint.s…"		5 hours ago   Up 5 hours             33060/tcp, 0.0.0.0:9999->3306/tcp   my-mysql

# 这里使用是容器的名字,也可以使用id
docker exec -it my-mysql /bin/bash
docker exec -it 16dd3199f81d /bin/bash
root@16dd3199f81d:/# 

# 登录 MySQL,使用的是启动容器时设置的密码
root@16dd3199f81d:/# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 30
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

5、使用 shell 脚本部署 MySQL 容器

为了方便写了一个简单地脚本来部署 MySQL 容器,写的不怎么好,请见谅!

将以下代码写进 docker_mysql.sh(文件名随意命名)

#!/bin/bash

# 检查 Docker 是否已安装
if ! command -v docker &>/dev/null; then
    echo  -e "\e[93m Docker 未安装!\e[0m"
    exit 1
fi

# 安装 MySQL
install_mysql() {
    read -p "确定镜像版本(默认为最新版本):" version
    version=${version:-latest}

    echo -e "\e[94m 正在拉取镜像... \e[0m"
    if docker pull mysql:$version >/dev/null 2>&1; then
        echo -e "\e[93m 镜像拉取成功!\e[0m"
    else
        echo -e "\e[93m 镜像拉取失败,请确认镜像版本是否存在!\e[0m"
        exit 1
    fi
}

# 启动 MySQL 容器
start_mysql() {
    read -p "需要映射到的端口(默认为 3306):" port
    read -p "容器的名称(默认为 my-mysql):" name
    read -p "MySQL 数据库密码(默认为 123456):" passwd
    port=${port:-3306}
    name=${name:-my-mysql}
    passwd=${passwd:-123456}

    # 检查名称是否已被占用
    if docker ps -a --filter "name=$name" --format '{{.Names}}' | grep -q .; then
        echo -e "\e[93m 名称 $name 已被占用!\e[0m"
        exit 1
    fi

    # 检查端口是否已被占用
    if [[ "$(ps -aux | grep -v grep | grep $port | wc -l)" -gt 0 ]]; then
        echo -e "\e[93m 端口 $port 已被占用!\e[0m"
        exit 1
    fi

    echo -e "\e[94m 正在启动容器... \e[0m"
    if docker run --restart=always --privileged=true \
    -p $port:3306 --name $name \
    -e MYSQL_ROOT_PASSWORD=$passwd \
    -e MYSQL_ROOT_HOST=% \
    -d mysql --default-authentication-plugin=mysql_native_password >/dev/null 2>&1; then
        if [ "$(docker ps -f "name=$name" --format '{{.Names}}')" == "$name" ]; then
            echo -e "\e[93m 容器启动成功!\e[0m"
            echo -e "\e[31m若正常启动则使用以下信息:\e[0m"
            echo -e "\e[32m*****************************************************\e[0m"
            echo -e "\e[34m\tPORT: $port\e[0m"
            echo -e "\e[34m\tNAMES: $name\e[0m"
            echo -e "\e[34m\tPASSWD: $passwd\e[0m"
            echo -e "\e[35m 进入容器使用命令:docker exec -it $name /bin/bash\e[0m"
            echo -e "\e[35m 登录 MySQL 使用命令:mysql -u root -p\e[0m"
            echo -e "\e[32m*****************************************************\e[0m"
        fi
    else
        echo -e "\e[93m 容器启动失败!\e[0m"
        exit 1
    fi
}

# 删除旧的 MySQL 容器
remove_mysql() {
    read -p "已有 MySQL 容器,是否删除(Y/y|N/n):" input
    case $input in
        [yY][eE][sS]|[yY])
            id=$(docker ps -a --filter "ancestor=mysql" --format "{{.ID}}")
            docker stop $id >/dev/null 2>&1 && docker rm $id >/dev/null 2>&1
            if [ $? -eq 0 ]; then
                echo -e "\e[93m 容器 $id 删除成功!\e[0m"
                install_mysql
                start_mysql
            else
                echo -e "\e[93m 删除失败!\e[0m"
                exit 1
            fi
            ;;

        [nN][oO]|[nN])
            install_mysql
            start_mysql
            ;;

        *)
            echo -e "\e[92m 请输入 Y/y 或 N/n \e[0m"
            remove_mysql
            ;;
    esac
}

# 检查是否已经安装 MySQL
if docker ps -f "ancestor=mysql" --format "{{.Names}}" | grep -q .; then
    remove_mysql
else
    install_mysql
    start_mysql
fi

添加执行权限

chmod a+x docker_mysql.sh

测试脚本

运行结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值