docker安装mysql8.0主备

docker安装mysql8.0主备

八月 09, 2025

mac环境,网上没有找到docker部署8.0的文章,踩了两个小时坑

  1. 拉取master镜像:
    注意要先登录一下docker账户,不然不让拉取镜像,科学上网一下才能登录

image.png

1
docker run -p 3307:3306 --name mysql-master -v ~/data/mysql-master/log:/var/log/mysql -v ~/data/mysql-master/data:/var/lib/mysql -v ~/data/mysql-master/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

在~/data/mysql-master/conf/my.cnf下面要创建一个my.cnf文件,内容如下:

[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

然后登入到容器里面创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

mysql> create user 'slave'@'%' identified with mysql_native_password by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant replication slave,replication client on *.* to 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000003 | 682 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

show master status;命令一会要用到。

  1. 拉取slave
1
docker run -p 3308:3306 --name mysql-slave -v ~/data/mysql-slave/log:/var/log/mysql -v ~/data/mysql-slave/data:/var/lib/mysql -v ~/data/mysql-slave/conf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0

进入到容器里面, 设置主库的信息,不需要额外配置docker网络,两个容器的网络就通,写本机的ifconfig的ip就行。

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

mysql> change master to master_host='192.168.199.192',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000003',master_log_pos=682,master_connect_retry=30;

Query OK, 0 rows affected, 10 warnings (0.03 sec)

mysql> start slave;

Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show slave status \G;

*************************** 1. row ***************************

               Slave_IO_State: Waiting for source to send event

                  Master_Host: 192.168.199.192

                  Master_User: slave

                  Master_Port: 3307

                Connect_Retry: 30

              Master_Log_File: mall-mysql-bin.000003

          Read_Master_Log_Pos: 682

               Relay_Log_File: mall-mysql-relay-bin.000002

                Relay_Log_Pos: 331

        Relay_Master_Log_File: mall-mysql-bin.000003

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB: 

          Replicate_Ignore_DB: 

           Replicate_Do_Table: 

       Replicate_Ignore_Table: 

      Replicate_Wild_Do_Table: 

  Replicate_Wild_Ignore_Table: 

                   Last_Errno: 0

                   Last_Error: 

                 Skip_Counter: 0

          Exec_Master_Log_Pos: 682

              Relay_Log_Space: 546

              Until_Condition: None

               Until_Log_File: 

                Until_Log_Pos: 0

           Master_SSL_Allowed: No

           Master_SSL_CA_File: 

           Master_SSL_CA_Path: 

              Master_SSL_Cert: 

            Master_SSL_Cipher: 

               Master_SSL_Key: 

        Seconds_Behind_Master: 0

Master_SSL_Verify_Server_Cert: No

                Last_IO_Errno: 0

                Last_IO_Error: 

               Last_SQL_Errno: 0

               Last_SQL_Error: 

  Replicate_Ignore_Server_Ids: 

             Master_Server_Id: 101

                  Master_UUID: 27bdea8f-624f-11f0-81d0-0242ac110002

             Master_Info_File: mysql.slave_master_info

                    SQL_Delay: 0

          SQL_Remaining_Delay: NULL

      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates

           Master_Retry_Count: 86400

                  Master_Bind: 

      Last_IO_Error_Timestamp: 

     Last_SQL_Error_Timestamp: 

               Master_SSL_Crl: 

           Master_SSL_Crlpath: 

           Retrieved_Gtid_Set: 

            Executed_Gtid_Set: 

                Auto_Position: 0

         Replicate_Rewrite_DB: 

                 Channel_Name: 

           Master_TLS_Version: 

       Master_public_key_path: 

        Get_master_public_key: 0

            Network_Namespace: 

1 row in set, 1 warning (0.00 sec)

一般有问题都是Last_IO_Error有问题,网络不通,或者server_id重复。server_id重复说明my.cnf没挂上,检查一下之前挂载目录的命令。show variables like ‘server_id’;可以查看当前的server_id。

  1. 测试环节
    主库建表,从库能访问到就成功。
create databse test;
use test;
insert into t1 values(1,1);
select * from t1;

image.png