编辑代码

#!/bin/bash

# 函数:检查daemon.jsons配置文件是否存在,存在则备份
function backup_create_daemon_json() {
    local daemon_json_file="/etc/docker/daemon.json"
    local backup_dir="/etc/docker/daemon_json_backup"
    local daemon_json_content='{"insecure-registries": ["192.168.1.144:8083", "192.168.1.144:8082"]}'

    # 检查是否有sudo权限,如果没有,则退出脚本
    if ! sudo -n true 2>/dev/null; then
        echo "脚本需要sudo权限才能操作文件,请确保脚本以sudo或root身份运行。"
        exit 1
    fi

    echo "检查daemon.json文件是否存在"
    # 检查是否存在daemon.json文件
    if [ -f "$daemon_json_file" ]; then
        local backup_date=$(date "+%Y-%m-%d_%H-%M-%S")
        local backup_file="$backup_dir/daemon.json_$backup_date"

        # 创建备份目录
        if ! mkdir -p "$backup_dir"; then
            echo "创建备份目录失败,请检查目录权限或路径设置。"
            exit 1
        fi
        # 备份daemon.json文件
        sudo cp "$daemon_json_file" "$backup_file"
        echo "检查已存在,备份原有的daemon.json文件为 $backup_file"
    else
        echo "daemon.json文件不存在,直接新增"
    fi

    # 创建并写入daemon.json文件
    echo "$daemon_json_content" | sudo tee /etc/docker/daemon.json > /dev/null
    echo "成功新增daemon.json文件"

    #重新加载配置
    echo "重新加载daemon.json配置"
    sudo systemctl daemon-reload

    #重启docker使其生效
    echo "重启 Docker 以使daemon.json配置生效"
    sudo systemctl restart docker
    sleep 5

    #登录docker私库
    docker login 192.168.1.144:8083  -u admin -p 3edc\$RFVs
    echo "成功登录docker私库"

    # 检查是否已经存在同样版本的镜像,如果不存在则从私库中拉取镜像并重命名
    if ! docker images | awk -v image="192.168.1.144:8083/mysql" -v tag="5.7.36" '$1 == image && $2 == tag { found = 1; exit } END { exit !found }'; then
        if docker pull 192.168.1.144:8083/mysql:5.7.36; then
            echo "成功从私库中拉取镜像 192.168.1.144:8083/mysql:5.7.36"
        else
            echo "从私库中拉取镜像失败,请检查私库地址和镜像是否正确。"
            exit 1
        fi
    else
        echo "本地已存在相同版本的镜像 192.168.1.144:8083/mysql:5.7.36,跳过拉取镜像步骤。"
    fi
}


function run_container() {
    #上传配置文件到/opt/docker/mysql路径下
    local backup_dir="/opt/docker/mysql"
    # 创建备份目录
    if ! mkdir -p "$backup_dir"; then
        echo "创建备份目录失败,请检查目录权限或路径设置。"
        exit 1
    fi

    # 创建my.cnf配置文件
    cat <<EOF > $backup_dir/my.cnf
[mysqld]
server-id=10
symbolic-links=0
character-set-server = utf8
collation-server = utf8_general_ci
lower_case_table_names=1
log-bin-trust-function-creators=1
group_concat_max_len = 102400
log_bin = mysql-bin
binlog_format = ROW
slave_skip_errors=all
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=1
auto-increment-increment=2
skip-external-locking
skip-name-resolve
expire_logs_days = 10
open_files_limit = 10240
back_log = 600
max_connections=10000
max_connect_errors = 6000
wait_timeout=605800
max_allowed_packet = 1000M
table_open_cache = 400
tmp_table_size = 256M
max_heap_table_size = 256M
read_buffer_size = 8M
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 256K
myisam_sort_buffer_size = 2M
innodb_buffer_pool_size = 32M
innodb_log_file_size = 8M
innodb_log_buffer_size = 8M
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
bulk_insert_buffer_size = 64M
default-storage-engine = INNODB
innodb_flush_method = O_DIRECT
long_query_time= 2
slow-query-log = on
slow-query-log-file = /var/log/mysql/mysql-slow.log
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqldump]
quick
max_allowed_packet = 1000M
EOF
    echo "已成功创建my.cnf"

    # 运行容器
    docker run -d --name=mysql  --restart=always  -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD="3edc\$RFV" -v /opt/docker/data/mysql:/var/lib/mysql -v /opt/docker/mysql/my.cnf:/etc/mysql/my.cnf 192.168.1.144:8083/mysql:5.7.36

    # 验证容器状态
    sleep 10  # 等待容器启动
    if docker ps -a | grep -q mysql; then
        echo "容器启动成功!"
    else
        echo "容器启动失败,请检查日志和配置。"
    fi
}

function check_and_restore() {
    # 如果之前存在daemon.json文件,还原回去并重启docker
    if [ -f /etc/docker/daemon_json_backup/daemon.json_* ]; then
        cp /etc/docker/daemon_json_backup/daemon.json_* /etc/docker/daemon.json
        rm -rf /etc/docker/daemon_json_backup
        systemctl restart docker
    fi

    # 验证docker是否正常
    docker ps
}

# 调用函数
backup_create_daemon_json
run_container
check_and_restore