docker安装mysql
docker安装最新的mysql,8.0为例
一、安装单机mysql
1.1 拉取远程仓库镜像
如果需要拉取指定版本的镜像,后面的命令也需要带版本号
docker pull mysql
1.2 配置文件
本地创建配置文件和数据目录,具体路径以实际为准。赋权给其他用户
#创建目录,并且赋权
mkdir -p /software/mysql/conf /software/mysql/data
chmod -R 755 /software
#创建配置文件
vi /software/mysql/conf/my.cnf
粘贴一下配置文件信息:
[client]
default-character-set = utf8mb4
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
#socket = /software/mysql/mysqld.sock
#pid-file = /software/mysql/mysqld.pid
datadir = /software/mysql/data
character_set_server = utf8mb4
collation_server = utf8mb4_bin
secure-file-priv= NULL
max_connections=1000
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
!includedir /etc/mysql/conf.d/
1.3 创建容器
创建并且运行容器,注意要设置密码。
docker run --restart=unless-stopped -d --name mysql -v /software/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /software/mysql/data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12345678 mysql
查看容器是否已经创建:
docker ps -a
1.4 远程访问主机权限
navicat要连接mysql8.0,加密必须要改成这种模式mysql_native_password,否则连接不上
#进入容器
docker exec -it mysql /bin/bash
#连接mysql
mysql -uroot -p
#修改访问主机以及密码等,设置为所有主机可访问。
#如果是8.4以后的mysql,修改加密规则为caching_sha2_password,如需使用mysql_native_password则需要开启
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '新密码';
#如果执行报错,查看root用户表是否为%
select user,host from user;
#如果不一致,开放授权
grant select on *.* to 用户名@登录主机 identified by '密码'
#刷新权限
flush privileges
#查看是否将加密方式修改过来
select host,user,authentication_string,plugin from user;
#退出容器,开放外部端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
二、安装主从复制mysql
2.1 拉取远程仓库镜像
如果需要拉取指定版本的镜像,后面的命令也需要带版本号
docker pull mysql
2.2 配置文件
本地创建配置文件和数据目录,具体路径以实际为准。赋权给其他用户,这里权限不能是777否则程序会报错
#创建目录,并且赋权
mkdir -p /software/mysql/master/conf /software/mysql/master/data /software/mysql/slave/conf /software/mysql/slave/data
chmod -R 755 /software
与单机不同的是,主从需要一个主节点配置和一个从节点的配置文件,执行
vi /software/mysql/master/conf/my.cnf
master主节点配置文件如下:
[client]
default-character-set = utf8mb4
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
# 设置默认时区
default-time_zone = '+8:00'
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
secure-file-priv= NULL
max_connections = 10000
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true
!includedir /etc/mysql/conf.d/
执行
vi /software/mysql/slave/conf/my.cnf
slave从节点配置文件如下:
[client]
default-character-set = utf8mb4
[mysqld]
#pid-file = /var/run/mysqld/mysqld.pid
#socket = /var/run/mysqld/mysqld.sock
#datadir = /var/lib/mysql
# 设置默认时区
default-time_zone = '+8:00'
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
secure-file-priv= NULL
max_connections = 10000
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
## 设置server-id,注意要唯一
server_id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true
!includedir /etc/mysql/conf.d/
2.3 创建容器
注意: mysql8以后docker的安全验证问题,需要增加参数--security-opt seccomp=unconfined
否则会出现提示mbind: Operation not permitted
创建并且运行容器,注意要设置密码。master主节点启动如下,注意启动端口的改变
docker run --restart=unless-stopped -d --name mysql-master -v /software/mysql/master/conf/my.cnf:/etc/mysql/my.cnf -v /software/mysql/master/logs:/var/log/mysql -v /software/mysql/master/data:/var/lib/mysql --security-opt seccomp=unconfined
-p 3300:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=12345678 mysql
slave从节点启动如下,注意以下参数--link mysql-master:master。
docker run --restart=unless-stopped -d --name mysql-slave -v /software/mysql/slave/conf/my.cnf:/etc/mysql/my.cnf -v /software/mysql/slave/logs:/var/log/mysql -v /software/mysql/slave/data:/var/lib/mysql --security-opt seccomp=unconfined
-p 3301:3306 --link mysql-master:master -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=12345678 mysql
从容器启动与主容器启动参数主要有一下两点:
- 所映射的宿主机的端口号不能与master容器相同,因为其已经被master容器占用;
- 必须加上--link参数,其后指定了当前容器所要连接的容器,mysql-master表示所要连接的容器的名称,master表示为该容器起的一个别名,通俗来讲,就是slave容器通过这两个名称都可以访问到master容器。这么做的原因在于,如果master与slave不在同一个docker network中,那么这两个容器相互之间是没法访问的。注意这一点非常重要,之前本人按照网上的搭建方式搭建主从服务器一直无法成功,主要就是因为他们一直没有提到要设置这个参数。
查看容器是否已经创建:
docker ps -a
2.4 初始化信息
这里mysql的时区问题,由于mysql默认CST时区,配置文件已经改成东八区
- 美国中部时间 Central Standard Time (USA) UTC-05:00 / UTC-06:00
- 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
- 中国标准时 China Standard Time UTC+08:00
- 古巴标准时 Cuba Standard Time UTC-04:00
设置mysql的信息,对于主和从都是一样的设置
#进入主节点容器:以master为例子
docker exec -it mysql-master /bin/bash
#进入mysql,输入密码
mysql -u root -p
#如果是8.4以后的mysql,修改加密规则为caching_sha2_password,如需使用mysql_native_password则需要开启
ALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY '新密码';
flush privileges;
对于需要主的数据库需要执行,不管对于主从模式还是主主模式,主要是主节点都执行。
初始化完数据,要对服务进行重启
#创建用于同步数据的用户
SET SQL_LOG_BIN=0;
CREATE USER 'slave'@'%' IDENTIFIED BY '12345678';
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '新密码';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;
SET SQL_LOG_BIN=1;
2.5 查看节点状态
show slave status;
#格式化查看
show slave status \G
如果slave状态如下则成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes
三、主主模式
3.1 拉取远程仓库镜像
如果需要拉取指定版本的镜像,后面的命令也需要带版本号
docker pull mysql
3.2 配置文件
配置文件与主主模式步骤一致,但是两个主的配置,除了serverId不一样,其他的都一致
[client]
default-character-set = utf8mb4
[mysqld]
# 设置默认时区
default-time_zone = '+8:00'
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci
secure-file-priv= NULL
max_connections = 10000
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Custom config should go here
## 设置server-id,注意要唯一
server_id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-bin
binlog_format=mixed
log-slave-updates
slave-skip-errors=all
binlog-ignore-db=mysql,sys,performance_schema,information_schema
replicate-ignore-db=mysql,sys,performance_schema,information_schema
# 开启gtid
gtid_mode=ON
enforce-gtid-consistency=true
3.3 设置主主模式
自动的主主Failover,主有两个,这里需要依赖GTID,即两个主都要开启gtid
两个主都需要加入集群
#如果启动失败,先执行reset slave;
stop slave;
change master to master_host='另外一个库的地址',master_port=3306,master_user='slave',master_password='12345678',master_auto_position = 1;
start slave;
3.4 从库加入主库
先从主库获取数据--这个时候主库是不能执行写的,否则会导致数据变动
mysqldump -uroot -p12345678 -h127.0.0.1 -P3306 -S=/data/my3306/run/mysql.sock --single-transaction --master-data=2 -A > /var/lib/mysql-files/all.sql
从库执行先导入数据再加入节点:
#如果需要搭建双主则需要在主库上执行第二步命令里边的ii,iv,v即可,禁止在节点下还有从库在正常同步的情况下执行reset master;,否则从库会报错,找不到同步位置
#重置主节点 reset master慎用
stop slave;
reset slave;