1.本地运行独立的Mysql

1.1 编辑配置文件设置默认密码插件

vim my3319.cnf
[mysqld]
server-id=33319
general_log = ON
log_output = FILE
default-authentication-plugin=mysql_native_password
local-infile=1               

vim 保存并且退出

1.2 Docker一键运行

$ docker run --name master --network=host \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_USER=testuser \
-e MYSQL_PASSWORD=123456 \
-v ./my3319.cnf:/etc/mysql/mysql.conf.d/my.cnf \
-d mysql:latest

两个用户都可以登录

mysql -uroot -p123456 -h127.0.0.1 -P3306  

默认是3306

登录root用户后给testuser用户给权限

GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

然后可以登录testuser 创建数据库了。刚开始的时候,testuser没有足够的权限在MySQL中创建数据库。当通过docker run命令创建MySQL容器并设置MYSQL_USER和MYSQL_PASSWORD环境变量时,这会创建一个用户,但是这个用户默认并没有权限创建新的数据库。这个用户只能访问它已经被授权的数据库。所以需要登录root用户后给权限。

mysql -utestuser -p123456 -h127.0.0.1 -P3306  

或者仅仅改名root用户的密码

$ docker run --name master --network=host \
-e MYSQL_ROOT_PASSWORD=123456 \
-v ./my3319.cnf:/etc/mysql/mysql.conf.d/my.cnf \
-d mysql:latest

当使用宿主机网络模式(–network host)运行mysql容器时,与之前相同,-p或–publish参数不会被使用,因为容器将直接使用宿主机的网络,不需要进行端口映射。因此,应该移除-p 3307:3306部分。

1.3 登录

mysql -uroot -p123456 -h127.0.0.1 -P3306  

1.4 创建数据库

CREATE DATABASE IF NOT EXISTS sensor_data;
USE sensor_data;
CREATE TABLE IF NOT EXISTS sensor_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    sensor_id VARCHAR(255) NOT NULL,
    status VARCHAR(100) NOT NULL,
    timestamp DATETIME NOT NULL
);

最最简单的运行独立Mysql的方式

docker run --name test -p 3308:3306 -e MYSQL_ROOT_PASSWORD=public -d mysql
mysql -uroot -ppublic -h127.0.0.1 -P3308                
               
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.3.0 MySQL Community Server - GPL

Copyright (c) 2000, 2024, 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.

2 本地部署Mysql 集群

2.1 编辑配置文件

2.1.1 my3319.cnf文件

[mysqld]
server-id=33319
general_log = ON
log_output = FILE
default-authentication-plugin=mysql_native_password
local-infile=1

2.1.2 my3329.cnf文件

[mysqld]
server-id=33329
general_log = ON
log_output = FILE
default-authentication-plugin=mysql_native_password
local-infile=1        

2.1.3 my3339.cnf文件

[mysqld]
server-id=33339
general_log = ON
log_output = FILE
local-infile=1
default-authentication-plugin=mysql_native_password   

2.2 完整的脚本

2.2.1 搭建集群的完整脚本

#!/bin/bash
docker network rm
docker network create mysql-net

# pull mysql image
docker pull mysql:8
path=$(pwd)
echo "PATH: $path"

# start mysql master
docker run --name=mysql-master --network=mysql-net -p 3319:3306   -e MYSQL_ROOT_PASSWORD=root -v ./my3319.cnf:/etc/mysql/conf.d/my.cnf -v ./my3319log:/var/lib/mysql -d mysql:8

# start mysql slave1
docker run --name=mysql-slave1 --network=mysql-net -p 3329:3306  -e MYSQL_ROOT_PASSWORD=root -v ./my3329.cnf:/etc/mysql/conf.d/my.cnf -v ./my3329log:/var/lib/mysql -d mysql:8

# start mysql slave2
docker run --name=mysql-slave2 --network=mysql-net -p 3339:3306  -e MYSQL_ROOT_PASSWORD=root -v ./my3339.cnf:/etc/mysql/conf.d/my.cnf -v ./my3339log:/var/lib/mysql -d mysql:8
# sleep wait container run
sleep 20

# create new user and rep user
docker exec mysql-master mysql -uroot -proot -e"
CREATE USER 'superroot'@'%' IDENTIFIED BY 'superroot';
ALTER USER 'superroot'@'%' IDENTIFIED WITH mysql_native_password BY 'superroot';
GRANT ALL PRIVILEGES ON *.* TO 'superroot'@'%' WITH GRANT OPTION;
CREATE USER 'repl'@'%' IDENTIFIED BY '111';
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '111';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
"

# Get Master Status
MS_STATUS=$(docker exec mysql-master mysql -uroot -proot -e "SHOW MASTER STATUS\G")
echo $MS_STATUS

# get bin_file and bin_pos value
bin_file=$(echo "$MS_STATUS" | awk -F: '/File/ {print $2;}' | xargs)
bin_pos=$(echo "$MS_STATUS" | awk -F: '/Position/ {print $2;}' | xargs)

# confirm bin_file and bin_pos value
echo $bin_file
echo $bin_pos

# build a master-slave relationship

docker exec mysql-slave1 mysql -uroot -proot -e "
CREATE USER 'superroot'@'%' IDENTIFIED BY 'superroot';
ALTER USER 'superroot'@'%' IDENTIFIED WITH mysql_native_password BY 'superroot';
GRANT ALL PRIVILEGES ON *.* TO 'superroot'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl', MASTER_PASSWORD='111', MASTER_LOG_FILE='$bin_file', MASTER_LOG_POS=$bin_pos;
START SLAVE;
"

# build a master-slave relationship
docker exec mysql-slave2 mysql -uroot -proot -e "
CREATE USER 'superroot'@'%' IDENTIFIED BY 'superroot';
ALTER USER 'superroot'@'%' IDENTIFIED WITH mysql_native_password BY 'superroot';
GRANT ALL PRIVILEGES ON *.* TO 'superroot'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='repl', MASTER_PASSWORD='111', MASTER_LOG_FILE='$bin_file', MASTER_LOG_POS=$bin_pos;
START SLAVE;
"

# check slaves status
for slave in slave1 slave2; do
  docker exec mysql-$slave mysql -uroot -proot -e "SHOW SLAVE STATUS\G"
done

docker exec mysql-master mysql -usuperroot -psuperroot -e "
  CREATE DATABASE test;
  USE test;
  CREATE TABLE demo (id INT);
  INSERT INTO demo VALUES (1);
"

# check relationship
docker exec mysql-slave1 mysql -usuperroot -psuperroot -e "
  SHOW DATABASES ;
  USE test;
"

# check relationship
docker exec mysql-slave2 mysql -usuperroot -psuperroot -e "
  SHOW DATABASES ;
  USE test;
"

因为上面三个Mysql上述都是在–network=mysql-net这个Docker网络下,因此他们之间可以通信,而,–network=host 就是直接在宿主机上。