1、首先在docker搜索mysql
docker search mysql
2、docker仓库拉取mysql8.0
docker pull mysql:8.0 //拉取8.0版本的MySQL
docker pull mysql //默认拉取最新版本的MySQL
备注:由于我之前拉取过mysql,所以这里显示的是Already exists
3、查看本地的镜像是否下载成功
docker images mysql:8.0
4、运行mysql:8.0容器
docker run -p 3307:3306 --name master -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
-p:将本地主机的端口映射到docker容器的端口
–name:给运行的容器命名
-e:配置信息,这里是配置root密码
-d:镜像的名称
5、查看master容器的运行情况
docker ps
6、登录mysql
docker exec -it master bash
mysql -u root -p
-it后接的是容器的名称,也就是运行容器时–name后指定的名称
接上述的mysql安装,接下来就是实现主从复制
1、创建配置文件
要想通过docker安装的mysql实现主从复制,我们需要指定运行时的配置文件
所以首先我们需要在宿主机上面建立master.cnf以及slave.cnf
其中master.cnf文件的内容为:
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
character-set-server = utf8
#skip-networking
innodb_print_all_deadlocks = 1
max_connections = 2000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 28M
key_buffer_size = 4M
thread_cache_size = 8
#query_cache_type = 1
#query_cache_size = 8M
#query_cache_limit = 2M
ft_min_word_len = 4
log-bin = mysql-bin
server-id = 1
binlog_format = mixed
relay-log-index=slave-relay-bin.index
performance_schema = 0
default-authentication-plugin=mysql_native_password
explicit_defaults_for_timestamp
#lower_case_table_names = 1
interactive_timeout = 28800
wait_timeout = 28800
# Recommended in standard MySQL setup
#sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
lower_case_table_names:忽略表名、列名等数据结构的大小写(注意:不是每行记录内容的大小写!)。
server-id=1: 表示此MySQL服务器是主服务器 。
log-bin:开启二进制记录。这是为了主从复制而做的设置。本文使用RBR(Row-Based Replication)模式。
slow_query_log=1:开启慢查询日志。如果某一条SQL执行的时间超过long_query_time设置的秒数,那么就记录下来。记录文件路径可以使用show variables;命令,在变量名是slow_query_log_file下查找到具体的日志文件路径。
long_query_time=1:单位是秒。指如果某一条SQL语句执行时间超过1秒,就记录下来。必须开启慢查询日志了以后,此变量才能使用。
log_error:开启错误日志。show variables like ‘log_error’; 就可以查询到日志文件的路径。mysql的docker官方镜像如果设置别的取值会导致容器无法正常启动。
slave.cnf文件的内容为:
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
symbolic-links=0
character-set-server = utf8
#skip-networking
innodb_print_all_deadlocks = 1
max_connections = 2000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 28M
key_buffer_size = 4M
thread_cache_size = 8
#query_cache_type = 1
#query_cache_size = 8M
#query_cache_limit = 2M
ft_min_word_len = 4
log-bin = mysql-bin
server-id = 2
binlog_format = mixed
relay-log-index=slave-relay-bin.index
performance_schema = 0
default-authentication-plugin=mysql_native_password
explicit_defaults_for_timestamp
#lower_case_table_names = 1
interactive_timeout = 28800
wait_timeout = 28800
# Recommended in standard MySQL setup
#sql_mode=NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
两个文件的区别就是server-id不同,其余部分都一样
2、运行容器
运行master节点
docker run -p 3308:3306 --name master -v /home/zpf/wyg/mysql/master.cnf:/etc/mysql/conf.d/master.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
运行slave节点
docker run -p 3309:3306 --name slave -v /home/zpf/wyg/mysql/slave.cnf:/etc/mysql/conf.d/slave.cnf -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
-v是将宿主机的文件挂载到docker对应的目录中,这里我们使用的是自定义的配置文件,所以要将其挂载到docker对应的位置上
查看运行结果
docker ps
3、配置master容器
docker exec -it master bash
mysql -u root -p
进入到master mysql以后需要分配从节点的用户
create user 'slave'@'%' identified by '123456';
grant replication slave on *.* to 'slave'@'%';
flush privileges;
查看master数据库状态:
show master status;
4、配置slave容器
首先我们需要先查一下master数据库运行的ip地址,需要根据容器的id进行查询
docker ps
找到对应的id,根据对应的id查询ip地址
docker inspect --format='{
{.NetworkSettings.IPAddress}}' 919cda654cb8
进入slave容器中
docker exec -it slave bash
mysql -u root -p
然后进行如下配置
mysql> change master to
-> master_host='172.17.0.2',
-> master_port=3306,
-> master_user='slave',
-> master_password='123456',
-> get_master_public_key=1,
-> master_log_file='mysql-bin.000003',
-> master_log_pos=1423;
master_host为刚才查询到的ip地址
master_user以及master_password为刚才在master数据库分配的slave用户
get_master_public_key=1为:mysql8配置主从复制必须的
master_log_file和master_log_pos是在show master status中查询到的那两个信息
5、启动并查看slave
使用如下命令启动slave节点
start slave;
查看slave的状态:
show slave status\G;
Slave_IO_Running以及Slave_SQL_Running都为Yes代表成功
6、可以使用navicat连接数据库进行测试
在master数据库创建数据库表并写入数据,slave数据库会自动同步
7、如果服务器关机重启后,直接重启这两个数据库即可
docker restart master
docker restart slave
参考:
Docker安装MySQL8.0的实现方法
在linux主机用docker部署mysql8 一主一从