Skip to content

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;