docker下使用mysql

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/inthat/article/details/84668868

docker下载安装并运行docker镜像

  1. 拉取 Docker Hub 官方提供的mysql镜像
    docker pull mysql:5.7
    报错Error response from daemon: Get https://registry-1.docker.io/v2

修改docker-仓库资源地址
docker在中国已经有了仓库:https://www.docker-cn.com/registry-mirror
windows下setting->demon
配置如下

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

linux下
进入/etc/docker
查看有没有 daemon.json。这是docker默认的配置文件。
如果没有新建,如果有,则修改。

{
  "registry-mirrors": [
    "https://iwfs1l0l.mirror.aliyuncs.com",
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": []
}
  1. 运行容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7

含义

--name mysql 创建的容器名称
-e MYSQL_ROOT_PASSWORD=root 使用root作为root账号的密码
-p 3306:3306 容器的3306端口映射到宿主机器
-d 后台运行容器
mysql:5.7 镜像名称
  1. 进入Mysql容器
docker exec -it mysql bash
  1. 开启远程连接
mysql -u root -p"root" 

进行授权

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

重载授权表

FLUSH PRIVILEGES;

退出

exit;

docker mysql常用其他配置

Docker mysql指定容器内固定ip

docker network create --subnet=192.168.130.0/24 mynetwork

创建mysql节点1

docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql_node1 -v e:/home/docker/mysql_node1/my.cnf:/etc/mysql/my.cnf -v /home/docker/mysql_node1/data:/var/lib/mysql  --network mynetwork --ip 192.168.130.100 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7

创建mysql节点2

docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql_node2 -v e:/home/docker/mysql_node2/my.cnf:/etc/mysql/my.cnf -v /home/docker/mysql_node2/data:/var/lib/mysql  --network mynetwork --ip 192.168.130.101 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7

注意: docker run的最后一个参数是镜像,如果把镜像参数放在中间,后面的参数 --xxx就不能识别。

Docker mysql 把数据存储在本地目录

什么是Docker Volume?
参考URL: https://blog.51cto.com/13957060/2318653

Docker Volume,通常翻译为数据卷,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过Docker Volume保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。

Docker Volume本质上是容器与主机之间共享的目录或者文件,这样Docker Volume中的数据可以在主机和容器中实时同步。

指定Docker Volume
使用docker run命令,可以运行一个Docker容器
docker run -itd --volume /tmp/data1:/tmp/data2 --name test ubuntu bash
基于ubuntu镜像创建了一个Docker容器。
容器的名称为test,由–name选项指定。
Docker Volume由–volume选项指定,主机的/tmp/data1目录与容器中的/tmp/data2目录一一对应。

使用-v也可以,-v 是–volume的缩写,如下:
-v, --volume list Bind mount a volume

Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可。
加上-v参数
示例命令如下:

$ docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql -v /docker_volume/mysql/data:/var/lib/mysql -p 3306:3306 mysql 
docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql -v e:/docker_volume/mysql3306/:/var/lib/mysql -p 3306:3306 mysql 

还可以指定mysql配置文件

docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql -v d:/home/docker/mysql/my.cnf:/etc/mysql/my.cnf -v d:/home/docker/mysql/data/:/var/lib/mysql -p 3306:3306 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7

这样,即可修改配置文件,还能把数据存在本地目录,一举两得,-v 参数可以多次使用,每次映射一个目录,通过这种方式,很容易进行配置。

注意1:-v指定了my.cnf,那么启动容器必须该文件存在,否则报错
docker: Error response from daemon: Mount denied:
The source path “E:/home/docker/mysql/my.cnf”
doesn’t exist and is not known to Docker.
并且my.cnf内容必须正确,否则mysql 容器启动不起来。

注意2: 报错
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused “process_linux.go:402: container init caused “rootfs_linux.go:58: mounting \”/host_mnt/e/home/docker/mysql/my.cnf\” to rootfs \"/var/lib/docker/overlay2/b3d1a323e1131fda6bc20ef817445c26aede815ffde1077af84278985823e56c/merged\" at \"/var/lib/docker/overlay2/b3d1a323e1131fda6bc20ef817445c26aede815ffde1077af84278985823e56c/merged/etc/mysql/mysql.cnf\" caused \“not a directory\”"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
解决:因为我的e盘是个移动硬盘,可能是这个原因,window docker setting sharding driver 我该为d盘,修改启动参数,再启动就好了。

配置mysql大小写忽略

参考URL: https://www.cnblogs.com/seethrough/p/9010522.html
默认的mysql镜像是严格检查大小写,因此我们需要对配置文件做设置,官方推荐的做法是,映射配置文件夹到宿主机,这边使用的做法是把配置文件拷贝到宿主机,修改完,覆盖回去。
拷贝容器中的文件
拷贝容器中的文件

docker cp mysql:./etc/mysql/mysql.conf.d/mysqld.cnf /home/custom/mysqld.cnf

[mysqld] 底部新增

lower_case_table_names=1

文件拷贝到容器

docker cp /home/custom/mysqld.cnf mysql:./etc/mysql/mysql.conf.d/mysqld.cnf

重启容器

docker restart mysql

基于 Docker 搭建 MySQL 一主两从复制

[推荐]mysql数据库的主从同步,实现读写分离
参考URL: https://blog.csdn.net/qq_15092079/article/details/81672920
Mysql主从配置
参考URL: https://blog.csdn.net/lovektm/article/details/79145279
mysql主从同步配置
参考URL: https://www.cnblogs.com/zhoujie/p/mysql1.html

mysql主从配置
MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致有3个步骤
1)主将更改操作记录到binlog里
2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog(中继日志)里
3)从根据relaylog里面的sql语句按顺序执行
主上有一个log dump线程,用来和从的I/O线程传递binlog
从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地

环境:
主master : 192.168.130.20
从slave : 192.168.130.21

  1. 配置主库

1) 修改主库配置文件,开启binlog,并设置server-id,每次修改配置文件后都要重启mysql服务才会生效

[mysqld]
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test

配置说明
log-bin 使用binary logging
server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复
binlog-do-db:要同步的数据库名
binlog-ignore-db = xxx不同步xxx库

2) 启动myisql,创建从服务器的用户和权限
docker 使用新配置启动mysql容器:

docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql_master -v e:/home/docker/mysql_master/my.cnf:/etc/mysql/my.cnf -v /home/docker/mysql_master/data:/var/lib/mysql  --network mynetwork --ip 192.168.130.20 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7

#创建从数据库的masterbackup用户和权限
mysql> grant replication slave on . to masterbackup@‘192.168.130.%’ identified by ‘123456’;
#备注
#192.168.130.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.130.% 改为 %,则任何ip均可作为其从数据库来访问主服务器

  1. 查看主服务器当前二进制日志名和偏移量,这个操作的目的是为了在从数据库启动后,从这个点开始进行数据的恢复。从库等会需要执行命令配置这两个信息。
    在这里插入图片描述
  1. 配置从库

[mysqld]
server-id=2
master-host=192.168.130.20
master-user=masterbackup
master-password=123456
master-port=3306
##replicate-do-db=cmdb

从库my.cnf配置如下
···
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
···

MySQL5.7 主从同步报错 unknown variable ‘master-host=xxx.xxx.xxx.xxx
MYSQL版本从5.1.7以后开始就不支持“master-host”类似的参数 在从库上执行如下命令;

CHANGE MASTER TO MASTER_HOST = '192.168.130.20',
MASTER_PORT = 3306,
MASTER_USER = 'masterbackup',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'master-bin.000004',
MASTER_LOG_POS = 846;

根据从库my.cnf,启动从库mysql

docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql_slave1 -v e:/home/docker/mysql_slave1/my.cnf:/etc/mysql/my.cnf -v /home/docker/mysql_slave1/data:/var/lib/mysql  --network mynetwork --ip 192.168.130.21 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7
  1. 启动slave进程
    mysql> start slave;
    Query OK, 0 rows affected (0.04 sec)

在MySQL配置主从关系时,会用到start slave, stop slave命令:

start slave
mysql> start slave
不带任何参数,表示同时启动I/O 线程和SQL线程。
I/O线程从主库读取bin log,并存储到relay log中继日志文件中。
SQL线程读取中继日志,解析后,在从库重放。

stop slave
类似的,
mysql> stop slave
完成停止I/O 线程和SQL线程的操作。

  1. 验证是否成功
    用 show variables like ‘%log_bin%’;查看状态:
    进入mysql,后输入命令:
show slave status

如果slave_io_running和slave_sql_running都为yes,那么表明可以成功同步了 。

问题总结

导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
1、网络不通
2、密码不对
3、pos不对

常见问题总结

docker 启动mysql报错error: database is uninitialized and password option is not specified

mysql启动不起来
查看日志
docker logs 10

error: database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

启动加入-e MYSQL_ROOT_PASSWORD=my-secret-pw 设置root用户密码
docker run -d -P -e MYSQL_ROOT_PASSWORD=root mysql

猜你喜欢

转载自blog.csdn.net/inthat/article/details/84668868