docker安装mysql5.7、单节点、主从复制(仅供测试使用)

前言

环境:Centos7.9 mysql5.7 Docker version 20.10.9
mysql数据库建议使用物理机安装,这里使用docker安装mysql仅供测试使用或其他不重要场景使用。

docker 安装mysql5.7-单机

#创建mysql的文件存放目录
mkdir -p  /usr/local/mysql/conf
mkdir -p /usr/local/mysql/logs
mkdir -p /usr/local/mysql/mysql
cd  /usr/local/mysql/conf
#创建mysql配置文件
cat > my.cnf <<'EOF'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
default-time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
EOF

#启动mysql5.7容器,并使用-v参数持久化存储mysql的数据
docker run --restart always \
-p 3306:3306 \
--name mysql5.7 \
-v /usr/local/mysql/conf/my.cnf:/etc/my.cnf \
-v /usr/local/mysql/logs:/var/log/mysql \
-v /usr/local/mysql/mysql:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

#查看mysql5.7容器,已经启动了
[root@soft mysql]# docker ps | grep  mysql5.7
1019a1f67f2d   mysql:5.7  "docker-entrypoint.s…"   30 minutes ago   Up 30 minutes   0.0.0.0:3306->3306/tcp, :::3306-
>3306/tcp, 33060/tcp   mysql5.7
[root@soft mysql]#

#进入容器查看mysql容器是否可用
[root@soft ~]# docker exec -it mysql5.7 mysql -uroot -p123456	#登录mysql				
mysql> show databases;											#执行命令,一切正常,说明MySQL可用
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
mysql> create database  test;
mysql> use test;
mysql> create table test(id long);
mysql> insert test(id) value(1);
mysql> select * from test;
+------+
| id   |
+------+
| 1    |
+------+
mysql> 

备注:因为我们在启动mysql5.7容器的时候做了主机端口映射,所以外部应用程序直接链接主机ip:3306即可使用容器的mysql数据库。

docker 安装mysql5.7-主从复制

创建mysql-master节点:

#创建mysql的文件存放目录
mkdir -p  /usr/local/mysql/conf
mkdir -p /usr/local/mysql/logs
mkdir -p /usr/local/mysql/mysql
cd  /usr/local/mysql/conf
#创建mysql配置文件
#server_id参数表示指定mysql的server ID
#log_bin参数表示开启mysql binlog日志,binlog日志前缀叫mysql-bin,这里配置的是相对路径,路径在/var/lib/mysql目录下
cat > my.cnf <<'EOF'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
server_id = 1
log_bin = mysql-bin
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
default-time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
EOF

#启动mysql-master容器,并使用-v参数持久化存储mysql的数据
docker run --restart always \
-p 3306:3306 \
--name mysql-master \
-v /usr/local/mysql/conf/my.cnf:/etc/my.cnf \
-v /usr/local/mysql/logs:/var/log/mysql \
-v /usr/local/mysql/mysql:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

#查看mysql-master,正常
docker exec -it mysql-master mysql -uroot -p123456 -e "show databases"

创建mysql-slave节点(另外一台服务器):

mkdir -p  /usr/local/slave/conf
mkdir -p /usr/local/slave/logs
mkdir -p /usr/local/slave/mysql
cd  /usr/local/slave/conf
#创建mysql配置文件
cat > my.cnf <<'EOF'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
server_id = 2
log_bin = mysql-bin
read-only = 1
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
default-time_zone = '+8:00'
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
lower_case_table_names=1
EOF

#启动mysql-slave容器,并使用-v参数持久化存储mysql的数据
docker run --restart always \
-p 3306:3306 \
--name mysql-slave \
-v /usr/local/slave/conf/my.cnf:/etc/my.cnf \
-v /usr/local/slave/logs:/var/log/mysql \
-v /usr/local/slave/mysql:/var/lib/mysql  \
-e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

在这个命令中,当两个容器都在同一台主机上时可以加上 --link mysql-master:mysql-master 参数,表示将当前容器(mysql-slave)与名为
mysql-master 的容器进行链接。这个链接允许两个容器之间进行通信和数据交换。--link 参数后面跟着的是另一个容器的名称,冒号后面的是别名。
通过这种链接方式,mysql-slave 容器可以获取到 mysql-master 容器的 IP 地址和其他网络信息,从而与其进行通信。这对于一些需要跨容器通信的
场景非常有用,比如在一个主从复制架构中,从服务器需要连接到主服务器进行数据同步。

mysql-master节点创建主从复制的用户:

docker exec -it mysql-master bash
root@09c7a2106da2:/# mysql -uroot -p123456
mysql> grant replication slave on *.* to 'rep'@'%' identified  by '123456';
mysql> exit;
docker restart  mysql-master
docker exec -it mysql-master bash
root@09c7a2106da2:/# mysql -uroot -p123456
mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

mysql> 

配置从节点:

[root@dev-node01 conf]# docker exec -it mysql-slave bash
root@12ca632033a8:/# mysql -uroot -p123456
mysql> change master to master_host='192.168.244.20',master_port=3306,master_user='rep',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=154;

mysql>  start slave;
mysql> show slave status\G

测试主从同步:

# 在mysql-master节点创建一个test数据库,并创建表插入数据
[root@dev-master ~]# docker exec -it mysql-master bash
root@09c7a2106da2:/# mysql -uroot -p123456
mysql> create database test;
mysql> use test;
mysql> create table test(id int,name varchar(10));
mysql> insert into test(id,name) values(1,"lisi");
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | lisi |
+------+------+
mysql> 
# 在mysql-slave上查看,数据已经同步过来了
[root@dev-node01 ~]# docker exec -it mysql-slave bash
root@12ca632033a8:/# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
mysql> use test;
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+
mysql> select * from test;
+------+------+
| id   | name |
+------+------+
|    1 | lisi |
+------+------+
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值