docker随笔
- 安装docker
- Docker 命令
- Docker 容器打tar包 加载tar包为镜像
- Mysql
- 使用mysql
- 配置mysql 8.0主从复制
- 开始配置
- 遇到的问题
- navicat链接mysql报错
- mysql8.0忘记密码
- 查看错误日志
- 查看授权
- 查看主从配置相关信息
- Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file
- you are not allowed to create a user with GRANT' on query
- 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).![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e67995ae742df20cda4cf11e90f24e07.png)
- 其他
- docker使用redis配置集群
- docker使用rabbitmq
- docker小知识
安装docker
docker最低要求centOS7 内核3.10以上
uname -r 查看内核版本
yum install docker 安装docker
ps:配置阿里云镜像加速(免费)
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
Docker 命令
基本
systemctl start docker 启动docker
systemctl enable docker 设置开机自启docker
systemctl stop docker 停止docker
systemctl restart docker 重启docker
systemctl status docker 查看docker状态
镜像相关
dockers search +关键字 查找镜像
docker pull 镜像名:tag tag可选,不选默认最新latest
docker images 查看已下载的镜像
docker rmi id 删除镜像
容器相关
docker run -d -p 8888:8080 --restart=always tomcat
(启动镜像名为tomcat的容器 -d 后台运行 ip linux和容器端口映射,- -restart=always 表示docker启动该容器启动,后面可以通过 docker update --restart=no tomcat 来停止自动启动)
docker start id 启动id为id的容器
(启动上一个步骤启动的容器,但是上一个步骤已经启动了该容器,改命令用于该容器停止后,再次启动)
docker ps 查看运行中的容器
docker ps -a 查看所有容器
docker stop id/name 停止容器(容器的id或者自定义的名字)
docker rm id 删除该id 的容器(并没有删除镜像)
docker rename 容器id 新的容器名字 修改已有容器的名称
启动指定网络方式
表示直接使用宿主机的6380访问
docker run -itd --name redis2 --net host redis --port 6380
我们在使用docker run创建Docker容器时,可以用–network标志 选项指定容器的网络模式,Docker有以下4种网络模式:
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定。
host模式介绍
Docker 容器打tar包 加载tar包为镜像
将docker容器保存为 tar 包
1、docker commit <容器id> <镜像名>:<tag> ---- 将容器保存成镜像
保存后 docker images 便可以看到镜像
2、docker save -o <tar包名>.tar <镜像名>:<tag> ---- 将镜像保存为.tar文件,默认保存在当前目录
从 tar 包导入docker镜像
1、docker load -i <tar包名>.tar ---- 从 tar 包导入镜像
导入镜像后,通过 docker images 便可看到导入的镜像。
2、docker run -itd -p <本地端口>:<容器端口> <镜像名>:<tag> ---- 通过镜像起容器
案例
1、docker commit 294oajfhfnci abcdef:latest ---- 将294oajfhfnci容器保存为镜像abcdef
2、docker save -o abcdef.tar abcdef:latest ---- 将镜像abcdef保存为abcdef.tar
3、docker load -i abcdef.tar ---- 从 abcdef.tar 导入镜像
4、docker run -itd -p 8888:80 --restart=always abcdef:latest ---- 通过abcdef镜像启动容器
迁移容器
由于个人公司内网限制,docker配置代理一直无法生效所以采用外网下下载容器后迁移到内网机
1.保存容器镜像到tar包 docker save -o tar_name id (tar_name 自定义 ,id 要迁移的容器id)
2.传到内网机linux机器内,然后使用命令
docker load -i path (path,tar包的位置 ,比如/home/gqs/mysql01.tar)
3.镜像重命名 docker tag id mysql:8.0 (例,id 迁移的容器id mysql:8.0命名为mysql:8.0版本,因为迁移后默认名字tag都是none)
查看日志
docker logs id 可以查看该容器的运行日志
docker logs -f bf08b7f2cd89
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
Mysql
使用mysql
1.仓库查找mysql
docker search mysql
2.根据搜索结果选择要下载的版本号
docker pull mysql:8.0 8.0表示版本号
3.启动mysql
docker run --name mysql01 -p 8888:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
- -name 自定义容器名
-p 表示端口映射将linux8888端口和mysql3306映射起来(前提,linux防火墙改端口号已放开,也可直接关闭防火墙)
-d 表示后台运行
-e 配置环境变量指定mysql密码 (账号:root)
但是我们一般情况下不会将数据放在容器中,删了容器数据便会丢失,一般采用数据挂载的方式,将mysql数据保存在linux本地
创建挂载目录 /var/mysql01/data
然后启动数据挂载
docker run -d -p 8888:3306 --name mysql01 -v /var/mysql01/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
这样当mysql01容器挂掉,我们可以启动mysql02挂载这个目录,就会是相同数据,我们还可以挂载自己配置文件。(个人测试:只能由一个启动中的容器指向这一目录,我启动两个,会有一个无法访问)
4.进入mysql容器
docker exec -it mysql01 bash
mysql01 :启动时自定义的容器名
ctrl +p+q 退出mysql容器,并让mysql后台运行
5.放开linux端口,外界连接容器内mysql
1.放开端口
1.systemctl stop firewalld.service 直接关闭防火墙
禁止开机自启动 systemctl disable firewalld.service
2.firewall-cmd --add-port=8888/tcp --permanent 永久放开端口号8888(根据自己使用选择放开)
2.放开root用户仅本地连接权限
1.ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123456’;
2.flush privileges;
ps: %表示不限制ip访问 localhost表示本机使用
配置mysql 8.0主从复制
开始配置
1.创建主从数据库文件夹-配置配置/数据挂载
mkdir -p /usr/local/mysql/master1/conf
mkdir -p /usr/local/mysql/master1/data
mkdir -p /usr/local/mysql/slave1/conf
mkdir -p /usr/local/mysql/slave1/data
2.初始化主数据库配置文件
cd /usr/local/mysql/master1/conf
touch my.cnf
vi my.cnf
粘贴以下内容
[mysqld]
character-set-server = utf8
lower-case-table-names = 1
#主从复制-主机配置
#主服务器唯一ID
server-id = 1
#启用二进制日志
log-bin=mysql-bin
#设置logbin格式
binlog_format = STATEMENT
3.初始化从数据库配置文件
cd /usr/local/mysql/slave1/conf
touch my.cnf
vi my.cnf
粘贴以下内容
[mysqld]
character-set-server = utf8
#主从复制-从机配置
#从服务器唯一ID
server-id = 2
#启用中继日志
relay-log = mysql-relay
文件夹授权
chmod -R 777 /usr/local/mysql
设置所有用户对 /usr/local/mysql目录下所有子目录具有读写执行权限
改操作会导致mysql配置挂载不生效(配置文件也在该目录下)
权限777,任何一个用户都可以改my.cnf,存在很大的安全隐患.
改正:chmod 644 my.cnf
my.cnf设置为用户可读写,其他用户不可写.
docker部署mysql8.0
#拉取镜像
>docker pull mysql:8.0.20
>#查看镜像
docker images
>#构建主数据库容器
docker run --name=mysql-master-1 --privileged=true -p 3306:3306 -v /usr/local/mysql/master1/data/:/var/lib/mysql -v /usr/local/mysql/master1/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/master1/mysql-files/:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20 --lower_case_table_names=1
>#查询是否启动成功
docker ps
#验证是否可以登录
#交互式进入容器
docker exec -it mysql-master-1 /bin/bash
#登录
mysql -uroot -p123456
#退出
quit
exit
#构建从数据库容器
docker run --name=mysql-slave-1 --privileged=true -p 3307:3306 -v /usr/local/mysql/slave1/data/:/var/lib/mysql -v /usr/local/mysql/slave1/conf/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/slave1/mysql-files/:/var/lib/mysql-files/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20 --lower_case_table_names=1
#查询是否启动成功
docker ps
#验证是否可以登录
#交互式进入容器
docker exec -it mysql-slave-1 /bin/bash
#登录(使用构建时指定的密码:123456)
mysql -uroot -p
#退出
exit
#关闭防火墙
#查看防火墙状态
systemctl status firewalld
#关闭防火墙
systemctl stop firewalld
配置主从复制
# 进入主数据库
mysql -uroot -p123456
- 主数据库创建用户slave并授权
# 创建用户
create user 'slave'@'%' identified with mysql_native_password by 'password';
# 授权
grant replication slave , select on *.* to 'slave'@'%';
# 刷新权限
flush privileges;
# 查询server_id值
show variables like 'server_id';
# 指定server_id的值(如果不是1,主从数据库的server_id不能相同)
set global server_id = 1;
# 查询Master状态,并记录File和Position的值
show master status;
# 注意:执行完此步骤后退出主数据库,防止再次操作导致File和Position的值发生变化
!!!!!!!!!!!!验证slave用户是否可用!!!!!!!!!!!!!
mysql -uslave -p -h192.168.10.234 -P3306
# 进入从数据库
mysql -uroot -p -h192.168.10.234 -P3307
# 查询server_id值
show variables like 'server_id';
# 指定server_id的值(如果不是2,主从数据库的server_id不能相同)
set global server_id = 2;
# 若之前设置过同步,请先重置
stop slave;
reset slave;
# 设置主数据库
change master to master_host='172.17.0.2',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=156;
# 开始同步
start slave;
# 若出现错误,则停止同步,重置后再次启动
stop slave;
reset slave;
start slave;
# 查询Slave状态
show slave status\G
# 查看是否配置成功
# 查看参数 Slave_IO_Running 和 Slave_SQL_Running 是否都为yes,则证明配置成功。若为no,则需要查看对应的 Last_IO_Error 或 Last_SQL_Error 的异常值。
参考链接: https://www.cnblogs.com/cao-lei/p/13606945.html
遇到的问题
navicat链接mysql报错
mysql8.0忘记密码
查看错误日志
select * from performance_schema.replication_applier_status_by_worker;
查看授权
select host ,user from mysql.user;
查看主从配置相关信息
show slave status \G;
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000008 | 154 | | | |
+------------------+----------+--------------+------------------+-------------------+
mysql> stop slave;
mysql> change master to
-> master_host='192.168.8.57',
-> master_port=3306,
-> master_user='repl',
-> master_password='mysql',
-> master_log_file='mysql-bin.000008',
-> master_log_pos=154;
mysql> start slave;
you are not allowed to create a user with GRANT’ on query
忘记怎么解决的了,好像是有两个root用户,一个只能localhost使用,用了这个?把这个账户删了。后续出现在验证吧。
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).
其他
1,配置从数据库的主数据库时,要根据自己的来配,比如master_host,master_log_file
2, 查询相关技术文档时,要带上版本,比如mysql8.0配置主从复制
docker使用redis配置集群
安装redis
docker search redis
docker使用redis
配置集群
https://zhuanlan.zhihu.com/p/397189777
集群中都是master,修改任一个,其他也会改变
redis 连接命令
1. 生成3个容器
docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6379
docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6380
docker create --name redis-node3 --net host -v /data/redis-data/node3:/data redis:5.0.5 --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6381
配置数据挂载好像如果不需要事先进行配置不需要提前创建目录,会自动生成
2.配置集群
# 启动命令
docker start redis-node1 redis-node2 redis-node3
# 进入某一个容器
docker exec -it redis-node1 /bin/bash
# 组建集群,10.211.55.4为当前物理机的ip地址
redis-cli --cluster create 10.211.55.4:6379 10.211.55.4:6380 10.211.55.4:6381 --cluster-replicas 0
3.查看集群信息
root@CentOS7:/data# redis-cli
127.0.0.1:6379> cluster nodes
72c291c32815194b64d1f6d0fdf771f5cc04e14a 10.211.55.4:6380@16380 master - 0 1590905997358 2 connected 5461-10922
6a595b67bbff15c94e5874c2d2cd556d6a6a6c17 10.211.55.4:6381@16381 master - 0 1590905998362 3 connected 10923-16383
4e3dbdc8f835dcbc38291c88f08165ee51d53d3d 10.211.55.4:6379@16379 myself,master - 0 1590905997000 1 connected 0-5460
127.0.0.1:6379>
4.使用 redis-cli -c 连接到集群上,set一个值,然后从其他节点再获取值查看是否成功
单配置集群并不完全高可用,一个服务挂了,所有都不可以使用了
redis相关配置截图,不研究了
spring boot主从集群配置读写分离?
不推荐redis读写分离?
什么是redis高可用?
docker使用rabbitmq
1.同样方法安装rabbitmq镜像
2.运行rabbitmq
docker run -d --name rabbitmq01 -p 4396:4396 -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 -p 25672:25672 30aac3e715ba
3.配置管理界面
docker exec -it id bash
rabbitmq-plugins enable rabbitmq_management
访问地址: ip:15672
这样已经可以linux内访问了,外网访问参考上面开放端口就行了
docker小知识
windows docker不生效?
在Windows家庭版下安装了docker,并尝试在其中运行jupyter notebook等服务,但映射完毕之后,在主机的浏览器中,打开localhost:port无法访问对应的服务。?
答: 因为docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows。
可以将自己镜像推送到docker仓库
https://www.runoob.com/docker/docker-repository.html