mysql主从复制
- 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
redis集群算法
- 哈希取余算法:通过hash(key)%n个机器数,让固定的一部分请求落到同一台机器上,扩容或缩容,映射关系需要重新计算。
- 一致性哈希算法:将节点通过hash函数计算后放在一个环上值为[0,2^32-1],值在hash计算后存储在顺时针的下一个节点,当这个节点宕机就存放到顺时针的下一个。
在这里插入代码片
- 哈希槽算法:在数据存放在槽中,槽会分配给集群中的所有主节点,分配策略没有要求,可以指定哪些编号分配给那个主节点。集群会记录节点与槽之间的对应关系,对key求hash值,然后对16384求余,余数是几key就落入对应的槽里。slot=CRC16(key)%16384(内置16384个哈希槽)。以槽为单位移动数据,redis会根据节点数量大致均等的将哈希槽分配给不同的节点。
redis集群配置
- docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enable yes --appendonly yes --port 6381 (运行容器)
- redis-cli --cluster create 172.30.28.12:6381 172.30.28.12:6382 172.30.28.12:6383 172.30.28.12:6384 172.30.28.12:6385 172.30.28.12:6386 --cluster-replicas 1 (分配3主3从,分配均等的三个哈希槽)
- cluster info (集群的基本信息)、cluster nodes (集群的节点)、redis-cli -p 6381 (单机环境连接redis)、redis-cli -p 6381 -c (集群环境连接redis)
- redis-cli --cluster check ip地址:端口 (集群环境)
redis主从容错
- 暂停一个redis主机,从机就会变成主机,从新启动后还是原来暂停的那个主机会变成从机
redis主从扩容
- docker exec -it redis-node-7 /bin/bash (进入redis)
- redis --cluster add-node 172.30.28.12:6387 172.30.28.12:6381 (6387作为master新增节点,6381作为原来节点的领路人)
- redis-cli --cluster check 172.30.28.12:6381 (查看不同节点分配到的哈希槽范围)
- redis-cli --cluster reshard 172.30.28.12:6381 (重新分配哈希槽)
- redis-cli --cluster add-node 172.30.28.12:6388 172.30.28.12:6387 --cluster-slave --cluster-master-id 0bab8e058fa0eb7d919256fb33ee9e3d32bb8973 (分配主机从机)
redis主从缩容
- redis-cli --cluster check 172.30.28.12:6381
- redis-cli --cluster del-node ip地址:6388 从机6388的节点id (删除从机6388节点)
- redis-cli --cluster reshard 172.30.28.12:6381 (重新分配哈希槽)
- 输入分配的哈希槽数量–>输入分配给那个节点–>输入缩容的节点–>输入done
- redis-cli --cluster del-node ip地址:6388 从机6388的节点id (删除主机6387节点)
DockerFile
dockerfile面向开发,docker镜像成为交付标准,docker容器则涉及部署和运维
- dockerfile是用来构建docker镜像的文本文件,是由一条条构建镜像的所需的指令和参数构成的脚本。
- 每条保留字指令都必须为大写字母且后面至少要跟随一个参数
- 指令按照从上到下顺序执行
- #表示注释
- 每条指令都会构建新的镜像层并对镜像进行提交
DockerFile常用保留字
- FROM:基础镜像,当前新镜像是基于哪个镜像的,指定一个已存在的镜像作为模板,第一条必须是FROM
- MAINTAINER:镜像维护者的姓名和邮箱地址
- RUN:容器构建时需要运行的命令 (shell:RUN<命令行运行> 如 RUN yum -y install vim;
第二种exec:RUN [“可执行文件”,”参数1“,”参数2“] 如RUN[“./test.php”,“dev”,“offline”]等价于RUN ./test.php dev offline) - EXPOSE:当期容器对外暴漏的端口
- WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点(指定登录到容器终端的目录)
- USER:指定该镜像以什么样的用户去执行,如果不指定,默认是root
- ENV:这个环境变量可以在后续任何RUN指令中使用,这就如同在命令前面指定了环境变量的前缀一样:也可以在其它指令中直接使用这些环境变量(ENV MY_PATH /user/mytest;当使用WORKDIR $MY_PATH时指向/user/mytest)
- VOLUME:容器数据卷,用于数据保存和持久化工作(-v)
- ADD:将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中。(将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内<目标路径>位置;如COPY src dest;COPY[“src”,“dest”];src指代源文件或目录,dest指代目标路径)
- CMD:指定容器启动后要干的事情和RUN指令一样有两种格式shell和exec,在指定ENTRYPOINT指令后用CMD指定具体参数。dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换(docker run -it -p 8080:8080 容器ID /bin/bash)。CMD是在docker run 时运行 , RUN 实在docker build时运行。
- ENTRYPOINT:启动容器时要运行的命令,但是ENTRYPOINT不会被docker run 后面的命令覆盖,而且这些命令参数会被当作参数传送给ENTRYPOINT指令指定的程序。
13. docker build -t 镜像名字:版本 (安装新的自定义镜像)
14. docker run -it 镜像名字:版本 /bin/bash
虚悬镜像
- 在构建或删除镜像时出现错误,导致镜像仓库名字和tag为
- docker image ls -f dangling=true (查找出全部虚悬镜像)
- docker rmi $(docker images -q -f dangling=true) (删除全部虚悬镜像)
Docker network
容器间的互联和通信以及端口映射,容器IP变动时侯可以通过服务名直接网络通信而不受到影响
- docker network ls (查看网络连接方式)
- docker network create aa_network (创建新的网络)
- docker network inspect xxx(查看网络源数据)
- docker network rm xxx (删除网络)
网络模式
-
bridge: 为每一个容器分配、设置ip等,并将容器连接到docker0虚拟网桥,默认为该模式。docker服务默认会创建一个docker0网桥,该桥接网络名称为docker0,它在内核层连同了其他物理或虚拟网卡,这就是将所有容器和本地主机都放在同一物理网络。Docker默认制定了docker0接口和IP地址和子网掩码,让主机和容器间可以通过网桥相互通信。
-
host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
-
none:容器有独立的network namespace,但并没有对其进行任何的网络设置,如分配veth pair和网桥连接,IP等
-
container:新创建的容器不会创建自己的网卡和配置的IP地址,而是和一个指定的容器共享IP、端口范围
-
自定义网络:docker network create zzyy_network;(创建自定义网络,默认桥接模式)docker network ls;
(查询网络)docker run -d p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8;
docker run -d p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8;(可以写死服务名,不能写死ip地址)
Docker-compose
compse是docker公司推出的工具软件,可以管理多个docker容器组成一个应用。你需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器间的调用关系。然后,只要一个命令,就能同时启动和关闭这些容器。(多服务部署工具)
- 核心概念:文件docker-compose.yml。服务:一个个应用容器实例,比如订单微服务、mysql容器等。工程:由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义。