容器数据卷
-
容器卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,容器卷的设计目的就是
数据的持久化
,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷 -
有点类似Redis里面的
rdb
和aof
,将docker容器里面数据保存进宿主机 磁盘中 -
Docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了。
-
为了能保存数据在docker中我们使用卷。
-
大致公式:docker run -it –privileged=true -v /宿主机绝对路径目录: / 容器内目录 镜像名
-
特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
-
Docker挂载主机目录访问如果出现cannot open directory.:Permission denied
- 解决办法:在挂载目录后多加一个
--privileged-=true
(CentOS7安全模块会比之前系统版本加强,所以目录挂载的情况
被默认为不安全的行为,--privileged-=true
为扩大容器的权限解决挂载目录没有权限的问题
)
- 解决办法:在挂载目录后多加一个
-
查看数据卷是否挂载成功:docker inspect 容器ID (Mounts[“Source”: “目的地址”, “Destination”: “源地址”])
-
读写规则
rw
(读写)和ro
(只读)- 读写(默认):docker run -it –privileged=true -v /宿主机绝对路径目录: /容器内目录:rw 镜像名
- 只读(容器实例只能读取,不能
写入
):docker run -it –privileged=true -v /宿主机绝对路径目录😕容器内目录:ro 镜像名
-
容器卷间的继承
- docker run -it –privileged=true -volumes-from 父类 --name=容器名(子类) 镜像名
- 子类容器继承了父类容器的数据卷(规则),当父类 挂了不影响 子类与宿主机间的数据共享,当父类再次运行时还是可以共享数据卷中内容
Docker安装Mysql5.7
#启动容器
1. docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2. docker run -d -p 3306:3306 --privileged=true \
-v /zzyyuse/mysql/log:/var/log/mysql \
-v /zzyyuse/mysql/data:/var/lib/mysql \
-v /zzyyuse/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
mysql:5.7
#查看容器状态
docker ps
#进入容器
docker exec -it 6a76da3ddcf5 /bin/bash
#进入 Mysql
mysql -uroot -p
-
插入中文如下图报错(docker 上默认字符集编码 隐患)
-
进mysql 容器里执行:
SHOW VARIABLES LIKE 'character%';
-
docker run -d -p 3306:3306 --privileged=true \ -v /zzyyuse/mysql/log:/var/log/mysql \ -v /zzyyuse/mysql/data:/var/lib/mysql \ -v /zzyyuse/mysql/conf:/etc/mysql/conf.d \ -e MYSQL_ROOT_PASSWORD=123456 \ --name mysql \ mysql:5.7 #直接进入到/zzyyuse/mysql/conf 创建一个 my.cnf 的文件写入内容如下 [client] default_character_set=utf8 [mysqld] collation_server=utf8_general_ci character_set_server=utf8
-
变为UTF8,就可以正常插入中文了, 因为挂载了数据卷(/zzyyuse/mysql/data:/var/lib/mysql), 当容器被删除时,在重新创建一个新容器,挂载与被删除容器一样的数据卷可达到还原数据的效果
MySQL主从搭建过程
-
新建主服务器容器实例(3307)
-
docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql-master/log:/var/log/mysql \ #日志 -v/mydata/mysql-master/data:/var/lib/mysql \ #数据 -v/mydata/mysql-master/conf:/etc/mysql \ #配置文件 -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7
-
-
进入**/mydata/mysqI-master/conf** 目录下新建my.cnf (vim my.cnf)
-
[mysqld] ##置server_id, 同一局域网中需要唯一 server_id=101 ##定不需要同步的数据库名称 binlog-ignore-db=mysql ##启二进制日志功能 log-bin=mall-mysql-bin ##置二进制日志使用内存大小(事务) binlog_cache_size=1M ##置使用的二进制日志格式(mixed,statement,row) binlog_format=mixed ##二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
-
-
修改完配置后重启master实例
- docker restart mysql-master
-
进入mysql-master 容器
- docker exec -it mysql-master /bin/bash
- mysql -uroot -proot
-
master容器实例内创建数据同步用户
- CREATE USER ‘slave’@‘%’ IDENTIFIED BY ‘123456’; #创建用户
- GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘slave’@‘%’; #授权
-
新建从服务器容器实例(3308)
-
docker run -p 3308:3306 --name mysql-slave \ -v /mydata/mysql-slave/log:/var/log/mysql \ -v /mydata/mysql-slave/data:/var/lib/mysql \ -v /mydata/mysql-slave/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7
-
-
进入**/mydata/mysqI-slave/conf** 目录下新建my.cnf (vim my.cnf)
-
[mysqld] ## 设置server_id,同一局域网中需要唯一 server_id=102 ## 指定不需要同步的数据库名称 binlog-ignore-db=mysql ## 开启二进制日志功能,以备Slave作为其它数据库实例的Mastert时使用 log-bin=mall-mysql-slave1-bin ## 设置二进制日志使用内存大小(事务) binlog_cache_size=1M ## 设置使用的二进制日志格式(mixed,statement,row) binlog_format=mixed ## 二进制日志过期清理时间。默认值为0,表示不自动清理。 expire_logs_days=7 ##跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ## relay_Llog配置中继日志 relay_log=mall-mysql-relay-bin ## log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 ## slave设置为只读(具有super权限的用户除外) read_only=1
-
-
修改完配置后重启master实例
- docker restart mysql-slave
-
在主数据库中查看主从同步状态
- show master status;
-
进入从数据库(mysql-slave容器)
- docker exec -it mysql-slave /bin/bash
- mysql -uroot -proot
-
在从数据库中配置主从复制
-
相关参数: master_host: 主数据库的lP地址; master_port: 主数据库的运行端口; master_user: 在主数据库创建的用于同步数据的用户账号; master_password:在主数据库创建的用于同步数据的用户密码; master_log_fle:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数; master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数; master_connect_retry:.连接失败重试的时间间隔,单位为秒。 具体命令:change master to master_host='宿主机IP',master_port=3307(主库端口号),master_user='slave(主库创建的用户)',master_password='123456',master_log_file='mall-mysql-bin.000002(show master status; 查看的相关刻度)',master_log_pos=154,master_connect_retry=30;
-
-
在从数据库中查看主从同步状态
- show slave status \G; #show slave status;
-
在从数据库中开启主从同步
- start slave;
-
查看从数据库状态有没有同步
-
show slave status \G;
-
可能出现Slave_SQL_Running: No(一般是事务回滚造成的)
-
结局方法:1.stop slave ; 2. set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 3. start slave ;
-
-
主从测试,主库建表插数据,从库查看
-
主库
-
从库
-