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


    1、使用 pull 拉取 MySQL 镜像

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

    拉取镜像前可以先去 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    添加执行权限

    chmod a+x docker_mysql.sh
    
    • 1

    测试脚本

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

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

  • 相关阅读:
    分数计算 初级题目
    java校园二手书交易管理系统springboot+Vue
    C# ToString
    口袋参谋:如何利用“问大家”机制,提高转化?
    第13章 并发编程高阶(一)
    Android SystemServer进程解析
    IntelliJ IDEA Services工具栏运行不显示端口问题解决
    OpenApi(Swagger)快速转换成 TypeScript 代码 - STC
    图片压缩软件有哪些?分享三个好用的图片压缩软件
    react之组件与JSX
  • 原文地址:https://blog.csdn.net/qq_43773590/article/details/127449480