Mysql的Docker部署(含可用Shell脚本)

这一次部署又是在新地方,好像又踩了一遍原来的坑。🤣

安装Mysql5.7

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
#!/bin/bash

# Pull MySQL 5.7 image
docker pull mysql:5.7

# Create necessary directories
mkdir -p /mydata/mysql/log
mkdir -p /mydata/mysql/data
mkdir -p /mydata/mysql/conf

# Set permissions for directories
chmod 777 /mydata/mysql/log
chmod 777 /mydata/mysql/data
chmod 777 /mydata/mysql/conf

# Run MySQL container
docker run -d \
--restart=always \
-p 3306:3306 \
--name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7

# Create MySQL configuration file
cat << EOF > /mydata/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
EOF

# Restart MySQL container to apply configuration
docker restart mysql

安装Mysql8.2

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
#!/bin/bash

# 定义 MySQL 版本和容器名称
MYSQL_VERSION="8.0.20"
CONTAINER_NAME="mysql_8_0_20"

# 定义 MySQL 根密码
MYSQL_ROOT_PASSWORD="root"

# Folders to delete
folders=(
"/docker/mysql8/etc"
"/docker/mysql8/logs"
"/docker/mysql8/data"
)

# Loop through each folder and delete it
for folder in "${folders[@]}"; do
if [ -d "$folder" ]; then
echo "Deleting $folder..."
rm -rf "$folder"
else
echo "Folder $folder does not exist."
fi
done

echo "Deletion complete."


mkdir /docker /docker/mysql8 /docker/mysql8/etc /docker/mysql8/logs /docker/mysql8/data

# 拉取 MySQL 镜像
docker pull mysql:$MYSQL_VERSION

# 运行 MySQL 容器
docker run -d \
--name $CONTAINER_NAME \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-p 33306:3306 \
mysql:$MYSQL_VERSION

# 检查容器是否运行成功
if [ $? -eq 0 ]; then
echo "MySQL $MYSQL_VERSION 容器已成功启动,容器名称为 $CONTAINER_NAME"

# 复制配置文件
docker cp $CONTAINER_NAME:/etc/mysql /docker/mysql8/etc

# 停止并删除临时容器
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME

# 运行新的 MySQL 容器
docker run \
-p 33306:3306 \
--name mysql8 \
--privileged=true \
--restart unless-stopped \
-v /docker/mysql8/etc/mysql:/etc/mysql \
-v /docker/mysql8/logs:/logs \
-v /docker/mysql8/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD \
-d mysql:$MYSQL_VERSION


# Wait until MySQL is ready
echo "Waiting for MySQL to be ready..."
sleep 6
# 修改进入容器

docker exec -i mysql8 mysql -u root -p $MYSQL_ROOT_PASSWORD <<EOF
USE mysql;
UPDATE user SET Host='%' WHERE User='root';
FLUSH PRIVILEGES;
EOF
if [ $? -eq 0 ]; then
echo "安装Mysql成功 容器名为 mysql8"
fi

else
echo "启动 MySQL $MYSQL_VERSION 容器失败"
fi

添加远程访问权限
1
2
3
4
5
6
mysql -u root -proot -e "USE mysql;
UPDATE user SET Host='%' WHERE User='root'; FLUSH PRIVILEGES;"
if [ $? -eq 0 ]; then
echo "添加远程访问权限成功"
fi

保存为docker_int_mysql.sh

使用方法

  • vim 将脚本复制
  • 保存为文件 .sh
  • 执行chmod +x
  • ./执行脚本

踩坑

我是安装在虚拟机上的,虚拟机安装完之后,我发现一直连接不上,报错如下:

然后我就在网上找这个问题,其中有提及mysql给root加%访问权限的,有提及root权限不够的,还有防火墙问题的。

我的防火墙是早就关了的,所以我就不停的在试前两个,最后重启了下虚拟机,解决了。。。

在这个脚本里面的这一段其实可要可不要

1
2
3
4
5
docker exec -i mysql8 mysql -u root -p $MYSQL_ROOT_PASSWORD <<EOF
USE mysql;
UPDATE user SET Host='%' WHERE User='root';
FLUSH PRIVILEGES;
EOF

这是我用来添加远程访问权限的,后来发现不是这个问题。不过我就不删了,提醒下自己。

docker想要容器内执行mysql脚本可以试下这个,还有另外的方法

先docker cp 把脚本复制到容器内

1
docker exec -it 容器名 /bin/bash -c "chmod +x 脚本复制到docker容器内的位置"
1
docker exec -it 容器名 /bin/bash -c "sh 脚本.sh"