linux8 redis集群槽+docker
docker pull hello-world #不能推送,要把名字改一下
错误1 :
私有仓库搭建:
刚开始 : 报错: server gave http response to https client #只支持https的格式,不支持http的,要改一下http的 ![http的不支持默认支持https的](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\http的不支持默认支持https的.png)
改一下 :
vim /etc/docker/daemon.json
2.写入如下信息,地址改成你自己的ip
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries":["192.168.16.142:5000"]
}
正确:
[root@liu ~]# docker push 192.168.230.132:5000/s20-hello-world
The push refers to a repository [192.168.230.132:5000/s20-hello-world]
af0b15c8625b: Pushed
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524
linux第八天笔记
学习python的第86天
1.redis-cluster集群
背景
1 并发问题
2 数据另太大
新浪微博 这么大的数据 ,去哪买内存条,
思想: 数据分片存储在多个redis中
集群: twitter 开源
codis 豌豆荚 开发c 和 go开发
不好的: 一台机器,超载了
正确的是 分布式,加机器,分摊集中式压力,一堆机器做一件事(计算机是跟生活中的东西非常相似的),分了马鞍,马背上
按key分片,实例化多个马
节点取余分类
虚拟槽分区(官方)
![槽分类](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\槽分类.png)
redis-cluster集群搭建
1.环境准备,6个redis数据库节点
也就是准备6个配置文件,6匹马
redis-7000.conf
redis-7001.conf
redis-7002.conf
redis-7003.conf
redis-7004.conf
redis-7005.conf
#每个配置文件的内容,仅仅是端口的不同7000~7005
#内容如下
port 7000
daemonize yes
dir "/opt/redis/data/7000"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes #开启集群模式
cluster-config-file nodes-7000.conf #集群内部的配置文件
cluster-require-full-coverage no
#redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
2.快速生成6个节点的配置文件
mkdir -p /opt/redis/data/{7000,7001,7002,7003,7004,7005}
sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf
.....
3.启动6个redis节点(准备好了6匹马)
redis-server redis-7000.conf
.....
4.马儿准备好了,分配槽位,开始放入数据,查看数据流向
开启redis-cluster的集群功能,以及分配redis的slot槽位,基于ruby语言的脚本工具自动分配
1.下载ruby的解释器
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
2.解压缩ruby的源码包
tar -zxvf ruby-2.3.1.tar.gz
3.进入ruby的源码包目录,编译三部曲
cd ruby-2.3.1
./configure --prefix=/opt/ruby231
make && make install
3.配置ruby的环境变量
vim /etc/profile
写入PATH=""
4.读取这个/etc/profile
source /etc/profile
5.下载ruby操作redis的模块
wget http://rubygems.org/downloads/redis-3.3.0.gem
#安装ruby操作redis的模块
gem install -l redis-3.3.0.gem (ruby 解释器 gem 类似于pip 包管理工具)
6.一键分配redis集群的槽位
#查找一下这个命令的绝对路径
find / -name redis-trib.rb
#这个数字 1 代表,每个redis主库,只有一个redis从库
/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 #(如果害怕主从都挂了的话就把那个1 设置为多个从)![杀死主进程奴进程上位](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\redis-cluster\杀死主进程奴进程上位.png)
7.开启了集群状态功能后,登录数据库,查看数据写入流向
/opt/redis-4.0.10/src/redis-trib.rb add-node --slave 127.0.0.1:7003 127.0.0.1:7000
8.防止redis-cluster主节点故障,可以搭配 redis-cluster + redis-sentinel ,用哨兵检测主节点状态,当主节点宕机,自动切换从节点为新的主库
1.redis-sentinel配置方式如下,检测三个主节点7000 7001 7002
port 27379
dir "/var/redis/data"
logfile "26379.log"
sentinel monitor master1 127.0.0.1 7000 2
sentinel monitor master2 127.0.0.1 7001 2
sentinel monitor master3 127.0.0.1 7002 2
sentinel down-after-milliseconds master1 30000
sentinel down-after-milliseconds master2 30000
sentinel down-after-milliseconds master3 30000
sentinel parallel-syncs master1 1
sentinel parallel-syncs master2 1
sentinel parallel-syncs master3 1
sentinel failover-timeout master1 180000
sentinel failover-timeout master2 180000
sentinel failover-timeout master3 180000
2.启动哨兵,检测cluster的主节点
redis-sentinel redis-26379.conf
3.杀死redis-cluster的主节点,查看从节点状态(是否自动重启),可以运行多个从节点,保证数据安全
查看集群状态
redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes #等同于查看nodes-7000.conf文件节点信息 (主仆关系
查看一组的所有的状态)
![查看主仆命令,长的码对应三对主仆](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\redis-cluster\查看主仆命令,长的码对应三对主仆.png)
在进入redis-cli
输入:ping
回复:pong --->连接成功(不是在外面(是ping baidu.com))
问题1:
CLUSTERDOWN Hash slot not served
未提供clusterdown哈希槽
当给redis-cli -c -p 7005 get name时,出现的错误,发现当redis-cli -p 7005 cluster nodes 时,只有一个 7005master的信息(0 connected),没有别的,而且,查看别的服务器信息时,发现有一个salve fail(未连接)
当没给他写值却读取值是就显示这个错误
/opt/redis-4.0.10/src/redis-trib.rb fix 127.0.0.1:7005 执行这条命令之后便可以get 数据,说明给了哈希槽了,但是还是没有连接 到大部队
问题2 :
error
操作不知哪儿出错了 master.fail (not connected) 把dphp.rdb 存放数据的删除了,但是还是不行
老师让: 重新定义了端口,把六个端口都改了才可以的
![错误虚拟不分配了不连接](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\redis-cluster\错误虚拟不分配了不连接.png)
琐碎的知识点
cat /etc/os-release #查看当前版本
docker rmi fce
Error response from daemon: conflict: unable to delete fce289e99eb9 (must be forced) - image is being used by stopped container 812abef0cef8
有依赖关系 : docker rm 812
(一层层删除)
问题3 :
创建容器的时候报错WARNING: IPv4 forwarding is disabled. Networking will not work.
# docker run -it -p 30001:22 --name=centos-ssh centos /bin/bash
WARNING: IPv4 forwarding is disabled. Networking will not work.
解决办法:
# vim /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
查看是否开启了
[root@liu ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
## 完成以后,删除错误的容器,再次创建新容器,就不再报错了。
# 作者:Locutus
来源:CSDN
原文:https://blog.csdn.net/yjk13703623757/article/details/68939183
版权声明:本文为博主原创文章,转载请附上博文链接!
错误 3:
/usr/bin/docker-current: Error response from daemon: oci runtime error: container_linux.go:235: starting container process caused "exec: "python.app.py": executable file not found in $PATH".
docker run -d -P training/webapp python.app.py
docker run -d -P training/webapp python app.py
多写了个一个点
现象1
会变得啊
[root@liu ~]# docker port 85f
5000/tcp -> 0.0.0.0:32769
[root@liu ~]# docker stop 85f
85f
[root@liu ~]# docker start 85f
85f
[root@liu ~]# docker port 85f
5000/tcp -> 0.0.0.0:32770
执行 flask的程序 时,有文件的
root@85f2e9063034:/opt/webapp# ls
Procfile app.py requirements.txt tests.py
2 docker
vmare虚拟化内存俩个g, 数值是技术手段实现的假的
docker :也是通过虚拟化搭建的假的,轻量级的虚拟化
docker 和虚拟机对比
![docker对比](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\docker对比.png)
用途:
ali 多少万 很多
jidong 15万个docker业务全部实例化
由go所写,所以并发厉害
:开源 由go写的 ,所以 go为什么火 还有区块链
python 之前16 shi openstack 现在ai tensflow
: 对linux的封装 ,
: 简单开发
之前部署 :
app <---> os <---> 物理
虚拟化 hypervisor appliaca(centos)
: 虚拟机是完整的操作系统 ,要分配系统资源,卡
一栋楼一户人家 一个楼房一户人家 胶囊房
物理机 虚拟机 容器
![能用图不写字](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\能用图不写字.png)
容器是吧这个进程命令,文件放到一个docker镜像中取运行相当于在python3 manage.py runserver 这个镜像上,批了一个马甲
![docker容器](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\docker容器.png)
环境配置
每台计算机的环境不同,如何换一台机器能运行起来呢?
把配置完整的复制过去 到另一个
管理 - 克隆
笑话 : 开发和测试 开发和运维(环境问题)
解决方案二 linux容器
自从用上docker容器后,可以实现开发、测试和生产环境的统一化和标准化
iso 刻录 ,用此安装好,所有的是一样的
三个生命周期
镜像image # 相当于类,老板的光盘
容器container
仓库repository #存放镜像文件的,公共的仓库 dockerhub.com github.com
docker整个生命周期就是这三个概念
基于老板卖的dvd光盘,安装操作系统
基于镜像,运行容器实例
镜像 理解为python的class
容器 理解为python的类的实例化
容器也是可以自定义更改,在生成新的 镜像文件的
class foo():
def __init__(self):
self.name ='他大舅。。。'
f1 = foo()
面试(太白,大金链子)
敲门的礼仪,技术水平,都要,合作伙伴,
技术好,人又谦虚,不太狂(也不要,相处共事因为)
阿里源 可能版本低
性格:
不走进去,出不来,出错随时(以前的缺点弱点),但是不要沉溺堕落。知来者只可追、
2. 1.docker的安装方式
ce 社区版
ee 企业版
安装方式
1.选择官方的docker yum源,网速太慢
2.由于网速问题,选择阿里云的docker软件
yum install docker -y
3.启动docker
systemctl start docker
4.检查docker运行状态,以及版本信息
docker version
5.配置docker加速器
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
这个命令是修改/etc/docker/daemon.json文件,写入一个json数据如下
[root@s20 ~]# cat /etc/docker/daemon.json
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
配置好了docker加速器,下载镜像就快很多了
6.下载centos的docker镜像
docker pull centos #是取dockerhub 下载cnetos镜像的
7.学习管理容器,镜像,仓库的增删改查
容器
docker run 镜像名/镜像id #运行处容器进程实例
docker ps #查看正在运行的容器进程
docker ps -a #显示所有运行过的容器进程(正在运行的,以及挂掉的容器进程)
docker container ls -a #同上,旧的命令
容器管理的重要点!!!
容器管理的重要点!!!
容器管理的重要点!!!
容器管理的重要点!!!
docker容器中必须有进程在后台运行,否则容器挂掉!!!
docker镜像每次运行 都会生成新的容器id记录
docker run hello-world 运行三次,出现三次容器新的记录
docker run hello-world
docker run hello-world
运行一个交互式的ubuntu容器实例
docker run -it ubuntu /bin/bash #参数解释 -i 交互式的命令操作 -t 开启一个终端界面 /bin/bash 指定linux的解释器 (这页面)
![docker运行变化unbtun页面](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\docker运行变化unbtun页面.png)
交互式的运行一个centos容器
docker run -it centos /bin/bash
docker rm 容器id #删除容器id记录,只能删除挂掉的容器
docker rm docker ps -aq
#批量删除挂掉的容器记录
在容器的后台运行一个进程,运行出活着的容器
docker run -d centos /bin/sh -c "while true;do echo '佳增你真棒'; sleep 1;done"
-d 就是daemonize 后台运行的意思
centos 指定哪个镜像
/bin/sh 指定linux的解释器
-c 指定一段shell代码
"while true;do echo '佳增你真棒'; sleep 1;done" 每秒打印一个
进入容器空间内
docker exec -it 运行着的容器id /bin/bash
查看容器日志
docker logs 容器id
docker logs -f 容器id #检测容器内的日志
dockerfile 的学习
docker ps 查看容器id
2.2 自定义docker镜像
shell默认的解释器
/bin/bash
/bin/sh
1.获取一个centos基础镜像,运行处容器后
docker run -it centos /bin/bash
2.进入容器空间内,默认没有python3 和其他软件
进入之后,安装一个vim
yum install vim -y
3.自定义软件后,退出容器,提交这个容器,成为一个新的镜像 exit退出容器
docker
4.此时这个镜像文件,可以发送给其他同事了
docker commit 容器id 新的镜像的名字
docker commit 5c2 s20/centos-vim
5.查看提交的镜像文件
docker images
6.导出这个镜像文件,指定导出的文件名和后缀
docker save 镜像名/id > /opt/s20-centos-vim.tar.gz
7.在本地测试导入这个镜像
可以测试在本地,先删除原本的镜像
导入命令
docker load < /opt/s20-centos-vim.tar.gz
8.给导入的镜像,修改tag别名
docker tag 旧的镜像名 以dockerhub仓库id开头的/新的镜像名
docker tag 621 liuyang/s20-centos-vim
9.执行这个docker镜像,运行处容器后,查看是否携带了vim
关键字 关键字 参数 镜像名 你要执行的命令
docker run -it liuyang/s20-centos-vim /bin/bash
镜像
docker search centos #去docker hub 搜索有关centos的镜像文件
docker pull centos #下载docker镜像 centos
docker pull hello-world #获取一个hello-world镜像
docker images #查看本地有哪些docker镜像
docker image ls #命令同上
docker rmi 镜像id或者镜像名 #删除本地docker镜像
docker rmi -f 镜像id #强制删除镜像文件
docker pull ubuntu #获取一个ubuntu镜像
仓库
2.3 运行一个web容器的操作
1.获取一个python的flask的镜像
#docker run的特点是,如果镜像不存在,会自动的先去docker pull
docker run -d -P training/webapp python app.py
-d 后台运行
-P 端口映射,随机映射
training/webapp 镜像名
python app.py 你要执行的命令
(没有自动会去pull)
docker容器的端口映射
docker port 容器id
![docker _ flask映射](E:\Download\qq_download\teacher_huatu_download\s20py\Linux\day86 linux8\docker _ flask映射.png)
容器的启停管理
docker start 容器id
docker stop 容器id
2.4 dockerfile的学习
这个文件就是定制docker镜像的一个脚本而已,学习里面的功能性的参数
获取docker镜像的方式
1.去docker仓库获取的方式,一个是公网仓库,一个是私有仓库
docker pull
2.获取别人发来的镜像,也就是自定义的镜像
3.通过dockerfile构建docker镜像
2.41 Dockerfile 参数
指定以哪个系统为基础
FROM scratch #制作base image 基础镜像,尽量使用官方的image作为base image
FROM centos #使用base image
FROM ubuntu:14.04 #带有tag的base image
定义dockerfile一些参数信息的指令
LABEL version=“1.0” #容器元信息,帮助信息,Metadata,类似于代码注释
LABEL maintainer=“yc_uuu@163.com"
对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令!
万能指令RUN
RUN yum update && yum install -y vim
Python-dev #反斜线换行
RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME”
WORKDIR /root #相当于linux的cd命令,改变目录,尽量使用绝对路径!!!不要用RUN cd
WORKDIR /test #如果没有就自动创建
WORKDIR demo #再进入demo文件夹
RUN pwd #打印结果应该是/test/demo
ADD添加的意思
ADD and COPY
语法
ADD 本地的资料 容器内的存放路径
ADD除了有添加的作用,还有解压缩的作用
ADD hello.txt / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录
ADD test.tar.gz / #添加到根目录并解压,自动的解压test.tar.gz 解压为test
# 再写RUN tar -zvcf ... 会报错(不知道 )
WORKDIR /root
ADD hello test/ #进入/root/ 添加hello可执行命令到test目录下,也就是/root/test/hello 一个绝对路径
COPY hello test/ #等同于上述ADD效果
copy就是把本地的文件,拷贝到容器空间内,没有解压作用
ADD与COPY
- 优先使用COPY命令
-ADD除了COPY功能还有解压功能
添加远程文件/目录使用curl或wget
ENV #环境变量,尽可能使用ENV增加可维护性
ENV MYSQL_VERSION 5.8 #设置一个mysql常量
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
RUN yum install -y mysql-server=“${MYSQL_VERSION}”
2.5 通过dockerfile定制一个python flask web程序,运行处容器
配置方法:
1.准备一个flask代码文件
touch s20flask.py
vim s20flask.py
coding:utf8
from flask import Flask
app=Flask(name)
@app.route('/')
def hello():
return "20期学的都很棒,很厉害"
if name=="main":
app.run(host='0.0.0.0',port=8080)
2.准备Dockerfile,写入如下内容
FROM centos
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all
RUN yum install python-setuptools -y
RUN easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
COPY s20flask.py /opt/
WORKDIR /opt
EXPOSE 8080 #暴露容器内的8080端口
CMD ["python","s20flask.py"] #让容器执行如下命令
copy 把本地的文件copy到容器空间内
拷贝一份文件到本文件夹
[root@liu s20docker]# cp /etc/yum.repos.d/CentOS-Base.repo .
[root@liu s20docker]# cp /etc/yum.repos.d/epel.repo .
有的 公司有python3 有的可能python2
3.准备好齐全的文件,开始构建docker镜像
[root@s20 s20docker]# ls
CentOS-Base.repo Dockerfile epel.repo s20flask.py
4.构建docker镜像的命令,这个命令得在Dockerfile的目录下执行
docker build .
5.构建镜像完成之后,查看镜像文件
docker images
docker tag 6f0 s20-flask-docker
6.运行这个镜像,
docker run -d -p 7777:8080 6f0
没有easy_install
[root@liu s20docker]# docker run -it centos
[root@668cbafcdde2 /]# easy_install
bash: easy_install: command not found
配置python的包管理,安装flask
easy_install -i https://pypi.tuna.tsinghua.edu.cn/simple flask
2.6 docker仓库的学习(共有仓库(不安全))
1.docker提供了一个类似于github的仓库dockerhub,
网址https://hub.docker.com/需要注册使用
2.注册docker id后,在linux中登录dockerhub
docker login #输入你的账号密码 就可以成功登录
注意要保证image的tag是账户名,如果镜像名字不对,需要改一下tag
docker tag 你的dockerhub账号名/你的docker镜像名 本地的镜像id或名
语法是: docker tag 仓库名 yuchao163/仓库名
3.推送docker image到dockerhub
docker push yuchao163/centps-cmd-exec:latest
4.在dockerhub中检查镜像
https://hub.docker.com/
5.删除本地镜像,测试下载pull 镜像文件
docker pull yuchao163/centos-entrypoint-exec
定制docker镜像的一个脚本而已
比如说:docker 一个centos 没有python 自定义就可以写进去了
2.7 docker的私有仓库搭建
配置方式
1.下载一个registry 私有仓库镜像
docker run -d
-p 5000:5000
-v /opt/data/registry:/var/lib/registry
registry
这个 \ 是换行符的意思
-v 是数据文件夹挂载 ,宿主机的数据文件夹:容器内的文件夹
5000 访问什么都没有,但是没有拒绝 # 不支持http方式的传送
2.可以查看私有仓库的api数据地址,如下
http://192.168.230.132:5000/v2/_catalog(我的ip)
3.但是此时的私有仓库还没法使用,它不支持http方式的推送,修改默认的配置文件即可(好像是这个错误:ERRO[0000] error getting events from daemon: net/http: request canceled )
1.编辑docker的配置文件
vim /etc/docker/daemon.json
2.写入如下信息,地址改成你自己的ip
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries":["192.168.16.142:5000"]
}
3.修改docker的配置文件
vim /lib/systemd/system/docker.service
第二步:添加如下配置,在[Service]的代码区域块中,添加如下参数
[Service]
EnvironmentFile=-/etc/docker/daemon.json
4.重新加载这个文件
systemctl daemon-reload
5.重启整个docker服务
systemctl restart docker
6.重新启动一个私有仓库
docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry
参数解释:
--privileged=true docker容器的安全机制:设置特权级运行的容器
7.推送本地的镜像,到私有仓库中去
docker push 192.168.230.132:5000/s20-hello-world
8.其他同事就可以通过这个私有仓库的镜像地址,获取拉
docker pull 192.168.230.132:5000/s20-hello-world
4.还得修改本地镜像的名字,以仓库地址为开头
docker tag 你要修改的镜像 修改之后的镜像名
docker tag fce 192.168.230.132:5000/s20-hello-world