第一步、关闭SELINUX服务
修改文件后的重启linux,重启命令为:reboot
注意此处虚拟机里修改重启无法启动linux系统成功,处理方法:
1、重启Linux按e进入系统启动项修改参数
2、在linux16的行位添加 selinux=0
按ctrl + x之后启动linux系统
3、启动之后,修改/etc/selinux/config文件
第二步、安装Docker服务
第三步、DockerHub是Docker公共镜像仓库
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。这里需要重启docker才会生效
daemon.json 内容后面如果有,号就的去除
{“registry-mirrors”: [“http://f1361db2.m.daocloud.io”]}
docker hub镜像仓库中为我们开发要
打开docker hub 网站
dockerHub官网地址dockerHub官网地址dockerHub官网地址:https://registry.hub.docker.com/
在上方搜索栏里输入mysql 找到要拉取的镜像版本,在tag下找到版本
回到虚拟机界面,执行下面命令来拉取mysql镜像
不指定版本号,默认下载最新版本:docker pull mysql
指定版本号:docker pull mysql:5.7
docker run --privileged=true -p 5306:3306 -v /usr/local/mysql/conf:/etc/mysql/conf.d:rw -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql3 -d mysql:5.7
这里对上面的参数做下简单的介绍:
配置端口映射:-p 3306:3306
将容器的3306端口映射到主机的3306端口
配置mysql数据卷挂载
-v /usr/local/mysql/log:/var/log/mysql(日志文件挂载)
将容器中的日志文件夹挂载到主机对应的/var/log/mysql文件夹中
-v /usr/local/mysql/data:/var/lib/mysql(数据文件挂载)
将容器中的数据文件夹挂载到主机对应的/var/lib/mysql文件夹中
-v /usr/local/mysql/conf:/etc/mysql/conf.d:rw(配置文件挂载)
将容器的配置文件夹挂载到主机对应的/etc/mysql文件夹中(容易出错看错误2)
注(这里所提的主机指的是当前的linux主机)
配置用户:-e MYSQL_ROOT_PASSWORD=root
设置初始化root用户的密码
命名:--name mysql3
指定镜像资源:-d mysql:5.7
-d:以后台方式运行实例
mysql:5.7:指定用这个镜像来创建运行实例
下面演示是用root用户来执行的命令,如果当前不是root用户,要在命令前加 sudo,以管理员方式来运行, 创建成功后使用下面命令查看下创建好的mysql实例:docker ps -a
相关命令:
查看容器状态:docker ps -a
启动容器mysql3:docker start mysql3
停用容器mysql3:docker stop mysql3
重新进入容器:docker exec -it mysql3 bash
删除mysql3容器:docker rm mysql3
docker logs --tail -n mysql3
错误1、You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
解释: 由于mysql没有指定root的登录密码导致无法启动,默认mysql配置是不允许空密码登录的
原因:上面执行命令的时候写错了环境变量, MYSQL_SERVICE_PASSWORD 应该修改成 MYSQL_ROOT_PASSWORD
解释:可能由于不同的mysql版本,/etc/mysql目录下的结构不一样
原因: 由于mysql的配置目录/etc/mysql下有两个空目录, 上面的执行命令仅挂载了当前目录,导致里面的两个目录没有权限挂载到宿主机内, 应该将挂载目录指定到具体的目录下: -v /usr/local/mysql/conf:/etc/mysql/conf.d:rw
错误3-2、chown: changing ownership of '/var/lib/mysql': Permission denied
原因: 启动时没有足够的权限, /var/lib/mysql目录没有写权限, 可能是部署docker时指定了--user xxx某个权限不足的用户
解决方法有三个:
1.在docker run中加入 --privileged=true 给容器加上特定权限
2.关闭selinux csdn
3.在selinux添加规则,修改挂载目录
本人使用的是第1种解决方案
1-1、创建主库:
docker run --privileged=true -p 4307:3306 -v /usr/local/docker_mysql/4307master/conf:/etc/mysql/conf.d:rw -v /usr/local/docker_mysql/4307master/data:/var/lib/mysql -v /usr/local/docker_mysql/4307master/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root4307 --name mysql4307master -d mysql:5.7
1-2、进入主库复制my.cnf配置文件
docker exec -it mysql4307master bash
1-3、找到文件并进行复制:
docker cp mysql4307master:/etc/my.cnf /usr/local/docker_mysql/4307master/conf
1-4、编辑my.cnf文件:
[mysqld]
#日志设置
#这里是容器里myslq里目录对应日志输出到挂载目录的
log-error = /var/log/mysql/db-err.log #错误日志路径
slow-query-log-file = /var/log/mysql/db-slow.log #慢SQL日志路径
long-query-time = 3 #怎样才算是慢sql,单位是秒
server_id=4307 #server_id唯一
binlog-ignore-db=mysql #指定不需要同步的数据库名称
log-bin=mall-mysql-bin #开启二进制日志功能
binlog_cache_size=10M #设置二进制日志使用内存大小(事务)
binlog_format=mixed #设置使用的二进制日志的格式(mixed,statement,row)
expire_logs_days=7 #二进制日志过期清理时间,默认值为0,表示不自动清理
slave_skip_errors=1062 #跳过主从复制中遇到的所有的错误或指定类型的错误,避免slave端复制中断
#1062错误是指一些组件重复,1032错误是主从数据库数据不一致
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
重启下:docker restart mysql4307master
1-6、创建数据同步账号:
create user 'slave'@'%' identified by 'slave123';
grant replication slave,replication client on *.* to 'slave'@'%';
2-1、创建从库(步骤和1-1、1-2、1-3相同)
2-2、编辑my.cnf文件:
[mysqld]
#日志设置
long-query-time = 3
#这里是容器里myslq里目录对应日志输出到挂载目录的
slow-query-log-file=/var/log/mysql/db-slow.log
log-error=/var/log/mysql/db-err.log
server_id=4308
binlog-ignore-db=mysql
log-bin=mall-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
#replay_log=mall-mysql-replay-bin #配置中级日志
log_slave_updates=1 #1代表slave写进自己的二进制
read_only=1 #设置只读,super权限除外
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
docker exec -it mysql4307master bash
登录mysql后台:mysql -uroot -p
然后查看主库状态:show master status;
注意:后面配置主从需要这个
docker exec -it mysql4308 bash
登录mysql后台:mysql -uroot -p
配置主从:change master to master_host='192.168.3.150',master_user='slave',master_password='slave123',master_port=4307,master_log_file='mall-mysql-bin.000002',master_log_pos=617,master_connect_retry=30;
参数说明:
查看主从状态:
start slave;
show slave status\G
此处正常显示为Slave_IO_Running: Yes,Slave_SQL_Running: Yes
验证我就不验证啦 大家自己验证自己的吧
错误1:安装mysql后无法远程连接,命令连接无需密码
上图看到没 我根本没输入密码就自动登录的,但此时我无法用Navicat连接mysql
解决如下:如果是我这样那就进行如下操作:
重新设置下root密码:set password for 'root'@'localhost'=password('mysql4307');
为避免麻烦,再次设置远程访问:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'mysql4307' WITH GRANT OPTION;
错误2:
Last_IO_Errno: 2061,Last_IO_Error: error connecting to master '[email protected]:3307' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
解决如下:
mysql> alter user 'slave'@'%' identified with mysql_native_password by'slave123';
mysql> flush privileges;
这时又会抛出一个问题
Last_IO_Errno: 13117
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
解决方法如下
#进入从数据库容器
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id | 101 |
+---------------+-------+
1 row in set (0.04 sec)
mysql> set global server_id=102;
mysql> stop slave;
mysql> start slave;
错误3:Slave_SQL_Running: No
在从库上停止slave:mysql> stop slave;
重置同步:mysql> reset slave;
重新设置同步节点:change master to master_host='192.168.3.150',master_user='slave',master_password='slave123',master_port=4307,master_log_file='mall-mysql-bin.000002',master_log_pos=617,master_connect_retry=30;
开启slave:mysql> start slave;
查看slave状态:mysql> show slave status\G;