安装docker
也可以参照菜鸟的教程。
yum install docker -y
启动docker并设置开启开机启动
systemctl start docker
systemctl enable docker
查看mysql的容器 并选择下载
docker search mysql
//下载
docker pull mysql:5.7
一般说明,到这里可能你有疑问,我安装了mysql容器,可以在里面把配置文件修改了就不好了吗?这样当然可以。但是考虑到容器原本就封装好了环境,进到容器里面修改可能需要安装很多插件等,不仅要等很久才能下载完还可能对环境进行了污染。所以一般考虑与宿主机的配置文件的方式。
在宿主机上创建目录结构
mkdir -p /usr/local/docker/mysql/conf
mkdir -p /usr/local/docker/mysql/data
运行容器
docker run --name mysql -p 3306:3306 -v /usr/local/docker/mysql/data:/var/lib/mysql -v /usr/local/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
参数说明一下
- -i:表示运行容器
- -t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- --name :为创建的容器命名。
- -v:表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
- -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
- -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
- -e: 设置环境变量,这里是指定root账号密码
设置环境变量,更多设置请参考 my.cnf
--server-id=1 服务器id
--log-bin=mysql-bin 日志文件前缀
#--replicate-do-db 可以指定同步哪个数据库,多个用逗号分隔
如--replicate-do-db=mydb1,mydb2
拷贝默认配置文件进行修改
容器内路径 /etc/mysql/mysql.conf.d/mysqld.cnf
docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /usr/local/docker/mysql/config
修改本地上配置文件
本地路径 /usr/local/docker/mysql/config/mysqld.cnf
在[mysqld] 节点添加
character-set-server=utf8
#服务器id 同一局域网不要重复, 可以用ip后一位
server-id=1
#二进制日志开启, 指定文件前缀
log-bin=mysql-bin
#需要同步的数据库
replicate-do-db=mydb1,mydb2
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
编辑配置文件 vim /usr/local/docker/mysql/config/mysqld.cnf
修改完按esc 输入 : 接着wq! 保存退出。
重启容器
docker restart mysql
设置容器开机自动启动(也可以在创建容器时 设置环境变量(--restart=always)
docker update --restart=always mysql
配置完配置文件,实际开发种不可能使用root用户操作数据库。所有需要添加新的用户和授权。
创建用户和授权
#进入容器:
docker exec -it mysql bash
#进入mysql:
mysql -uroot -p
#授权root用户可以远程访问
mysql> GRANT ALL ON *.* TO 'root'@'%';
#下面是创建两个用户user1,user2并且赋予权限,这里根据你的需要创建用户和授权
CREATE USER 'user1'@'localhost' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO ' user1'@'ip地址' WITH GRANT OPTION;
CREATE USER ' user2'@'%' IDENTIFIED BY '密码2';
GRANT ALL PRIVILEGES ON *.* TO ' user2'@'%' WITH GRANT OPTION;
#创建连接账号(指定从库ip) 多个可以创建多个
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '你想给那个用户连'@'从库ip';
#如果你想省事就直接授权给root用户
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'从库ip';
刷新权限
mysql> flush privileges;
更新root用户密码(如果你不想修改密码省略)
mysql> UPDATE user SET authentication_string=password('新密码') WHERE user='root';
刷新权限
mysql> flush privileges;
主从配置
到上面的步骤主数据库完成了配置,但是从库需要一些参数来连接到主库来达到主从的配置
#查看marster 状态 记住File,Position 从库连接必要参数
#查看marster 状态 记住File,Position 从库连接必要参数
show master status;
这两个参数,等下从库连的时候要用,这时候不用动主库了,修改主库的时候这两个参数会变动。
配置从库
配置文件
在[mysqld] 节点添加
character-set-server=utf8
#服务器id 同一局域网不要重复, 可以用ip后一位
server-id=2
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
设置好了,重启从库容器mysql
docker restart mysql
设置容器开机自动启动(也可以在创建容器时 设置环境变量(--restart=always)
docker update --restart=always mysql
设置好了,就在从表的客户端或者进入从表的mysql容器执行
#停止同步
stop slave;
#更改同步参数 master_log_file , master_log_pos 在主库获取执行下面的命令
change master to master_host=’ 主库ip’,master_user=’用户’,master_password=’密码’,master_log_file=’mysql-bin.000004’,master_log_pos=770
执行完成功后开始同步
start slave;
#刷新同步(马上生效)
flush privileges;
#在从库查看同步状态
show slave status;
如果 Slave_IO_Running , Slave_SQL_Running 都是Yes 表示同步成功
到这里就完结了。测试一下创建mydb1库,创建一张表加数据看看吧。
总结:
配置主从数据库步骤:
安装两个mysql(容器),修改配置文件,在配置文件种设置不同的server-id,主库开启二进制日志功能,这个是给从库可以随便读取日志从而刷新从库的(关键)。
重启mysql让配置生效,这里是从前容器 docker restart mysql;
配置用户和授权 ,并刷新
CREATE USER '用户'@'ip/不限ip使用%代替' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO '用户'@'ip地址[%]' WITH GRANT OPTION
flush privileges;
在从库中操作,更改同步参数 master_log_file , master_log_pos 在主库获取执行命令
change master to master_host=’ 主库ip’,master_user=’用户’,master_password=’root’,master_log_file=’上面查到的参数’,master_log_pos=查到的参数
犯错总结
在docker创建mysql容器创建了几个没有杀掉其它导致配置文件不生效和一些莫名的错;使用docker ps -a 查看所有的docker容器,使用docker rm -f 名称删除不需要的容器。
在修改mysql的配置文件的时候使用的使用的是容器的/etc/mysql/mysql.conf.d/mysqld.cnf配置文件,以前是不是你修改的是my.ini?这里是不是有疑问呢?