赞
踩
什么是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盘,修改启动参数,再启动就好了。
总结:常用命令行demo(可复制修改),修改文件目录mysql_13306,容器名mysql_13306,指定mysql从宿主机读取配置文件、数据文件,修改端口映射(注意左边是你宿主机端口,右边是容器内部端口)。
命令模板(端口映射、mysql配置文件映射、mysql数据文件映射):
docker run -d -e MYSQL_ROOT_PASSWORD=root --name mysql_13306 -v e:/home/docker/mysql_13306/my.cnf:/etc/mysql/my.cnf -v e:/home/docker/mysql_13306/data/:/var/lib/mysql -p 13306:3306 registry.cn-hangzhou.aliyuncs.com/shepf/mysql:5.7
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就不能识别。
参考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
[推荐]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) 修改主库配置文件,开启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均可作为其从数据库来访问主服务器
[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
在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线程的操作。
show slave status
如果slave_io_running和slave_sql_running都为yes,那么表明可以成功同步了 。
docker pull mysql:5.7
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 镜像名称
docker exec -it mysql bash
mysql -u root -p"root"
进行授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
重载授权表
FLUSH PRIVILEGES;
退出
exit;
这里主要是把官方镜像,运行后,加入开启远程连接的配置,再次打包镜像到自己私库,方便自己使用。
导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
1、网络不通
2、密码不对
3、pos不对
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
报错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": []
}
或者百度修改为阿里docker镜像加速器
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。