Docker 基础(二) | 青训营

142 阅读6分钟

书接上回,本篇主要讲解

  • 搭建私有库
  • Docker 容器数据卷挂载
  • Docker 高级安装

三、搭建私有镜像库

  1. 下载镜像docker registry

docker pull registry

  1. 运行私有库Registry,相当于本地有个私有DockerHub

docker run -d -p 5000:5000 -v /zty/myregistry/:/tmp/registry --privileged=true registry

  1. curl验证一下私服库上有什么镜像

curl -XGET http://主机IP:私服开放的端口/v2/_catalog

  1. 将新镜像修改成适合私服的tag

docker tag [imagesName:version] 主机IP:私服映射端口/[imagesName:version]

  1. 修改配置文件使之支持http

没有daemon.json文件就创建一个

cd /etc/docker
vim daemon.json

# 然后输入
{
	"insecure-registried":[192.168.0.187:5050]	#主机IP:映射的端口
}

之后可以重启一下,确保生效,但是重启之后要再打开registry容器

docker run -d -p 5000:5000 -v /zty/myregistry/:/tmp/registry --privileged=true registry

【补充:

如果docker出现了问题,可以用sudo dockerd --debug查看debug 问题出在哪里 】

  1. 将镜像push推送到私服库中

docker push 主机IP:私服开放端口/[imageName:tag]

  1. 将镜像从私服库拉下来

docker pull 主机IP:私服开放端口/[imageName:tag]

这个标签是要记住的!

四、容器数据卷

是什么?

将容器的文件持久化挂载到主机。卷指的是目录或者文件,存在一个或多个容器中,不属于联合文件系统,绕过联合文件存储或共享数据

容器卷记得加一个参数 --privileged=true

查看挂载是否成功

docker inspect [ContainerID]

容器stop了 主机修改也能同步

ro和rw读写规则

默认就是可读可写rw的

只读:容器实例内部被限制,只能读取不能写 read only  容器内部不能写

docker run -it --privileged=true -v /宿主机绝对路径:/容器内路径:ro [imagesName] /bin/bash

卷的继承和共享

docker run -it --privileged=true --volume-from 父类 [imagesName] /bin/bash

五、Docker高级安装

5.1 mysql主从复制

  1. 新建主服务器
  2. 进入/mydata/mysql-master/conf目录下新建my.cnf

vim my.conf

改完重启

docker restart mysql-master

  1. 进入mysql-master容器 登陆

docker exec -it mysql-master /bin/bash

mysql -uroot -p

  1. master容器内创建数据同步用户

在mysql下输入命令:

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

  1. 新建从服务器3308,同1
  2. 在/mydata/mysql-slave/conf目录下改my.conf,同2

改完重启

  1. 在主数据库中查看主从同步状态

show master status;

  1. 进入mysql-slave容器,配置主从
  2. 在从数据库中查看主从同步状态

show slave status ; [表格排列] show slave status \G; [键值对排列]

Slave_IO_Running:NO     Slave_SQL_Running:NO 说明主从还未开启

  1. 在从数据库中开启主从同步状态

start slave

查看 show slave status \G;  看Slave_IO_Running和Slave_SQL_Running是不是Yes

【Slave_IO_Running 是Connecting 未解决】

5.2 存储算法-redis分布式存储为例

1. 哈希取余分区【小厂】

缺点在于:一旦有一个机器坏了 ,那算法就全部错乱了

2. 一致性哈希算法分区【中厂】

三大步骤:

1)算法构建一致性哈希环

将哈希值所产生的线性空间[0, -1],通过适当的算法将它首尾相连,逻辑上成为环形空间.

之前的取余一般是对机器取余,但是这个是对取余,所以0到-1会成为一个首尾相连环形。

之前是对机器数取余,现在是对取余,形成0~-1构成的圆环,称作Hash环

2)服务器IP节点

选择IP或者主机名作为关键字进行哈希映射

3)key落到服务器的落键规则

当我们需要存储一个kv键值对时,首先计算key的hash值,hash(key),将这个key使用相同的函数Hash计算出哈希值并确定此数据在环上的位置,从此位置沿环顺时针“行走”,第一台遇到的服务器就是其应该定位到的服务器,并将该键值对存储在该节点上。
如我们有Object A、Object B、Object C、Object D四个数据对象,经过哈希计算后,在环空间上的位置如下:根据一致性Hash算法,数据A会被定为到Node A上,B被定为到Node B上,C被定为到Node C上,D被定为到Node D

优点:

  • 容错性:有一个机器宕机了之后,只影响逆时针后一个机器
  • 扩展性:若增加节点,也只影响后一个机器

缺点:

  • 数据倾斜问题:节点不均匀,导致压力不同=》倾斜

3. 哈希槽分区【大厂】

是什么:为解决一致性哈希算法的数据倾斜问题,

哈希槽实质就是一个数组,数组[0,-1]形成hash slot空间

能做什么:解决均匀分配的问题,在数据和节点之间又增加了一层,把这层称为哈希槽(slot),用于管理数据和节点之间的关系,现在就相当于节点上放的是槽,槽里面放的是数据。

槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
哈希解决的是映射问题,使用key的哈希值来计算所在的槽,便于数据分配。

多少个hash槽:一个集群只能有16384个槽,编号0-16383(0-2^14-1)。这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。解决了节点和槽的关系后,接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384。以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

hash槽计算:Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上