docker的网络介绍
Docker有三种网络模式,bridge、host、none,在你创建容器的时候,不指定--network默认是bridge。
bridge:为每一个容器分配IP,并将容器连接到一个docker0虚拟网桥,通过docker0网桥与宿主机通信。
也就是说,此模式下,你不能用宿主机的IP+容器映射端口来进行Docker容器之间的通信。
host:容器不会虚拟自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。这样一来,Docker容器之间的
通信就可以用宿主机的IP+容器映射端口
none:无网络。
此处我们使用host模式,进行redis集群的配置。
拉取redis:5.0的镜像到本地
docker pull redis:5.0 # 拉取tag为5.0的redis镜像。
虽然我们拉取的时5.0,但是redis的版本不是真的就是5.0
这时我们可以使用命令:
docker inspect redis:5.0
查看镜像的详情,会以json的形式展示。从中可以看到具体的redis版本号。
redis的5.0版本以上安装集群不需要ruby了。为了方便,我们选取5.0版本redis进行集群配置
创建存放redis集群相关配置文件和数据的文件夹
mkdir /home/docker/redis-cluster # 创建redis集群文件根目录
下面是配置文件模板,我们后续要写入到各个节点的配置文件中
port 6601
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.97
cluster-announce-port 6601
cluster-announce-bus-port 16601
appendonly yes
解释:
cluster-announce-ip 这个必须要改成你自己主机的ip
根据刚才生成的配置文件模板生成各个节点的文件夹以及文件
在刚才创建的/home/docker/redis-cluster文件夹内
根据上面模板写一个自动生成所需文件夹以及文件的命令,把ip改成自己的
输入以下命令:
for port in `seq 6601 6606`; do
mkdir -p ./${port}/conf
touch ./${port}/conf/redis.conf
mkdir -p ./${port}/data
echo "port ${port}" >>./${port}/conf/redis.conf
echo "protected-mode no" >>./${port}/conf/redis.conf
echo "cluster-enabled yes" >>./${port}/conf/redis.conf
echo "cluster-config-file nodes.conf" >>./${port}/conf/redis.conf
echo "cluster-node-timeout 5000" >>./${port}/conf/redis.conf
echo "cluster-announce-ip 192.168.1.97" >>./${port}/conf/redis.conf
echo "cluster-announce-port ${port}" >>./${port}/conf/redis.conf
echo "cluster-announce-bus-port 1${port}" >>./${port}/conf/redis.conf
echo "appendonly yes" >>./${port}/conf/redis.conf
done
解释:
mkdir -p :递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
创建6601文件夹,并且创建6601/conf文件夹
把当前目录的redis-cluster.conf 复制到6601/conf文件夹下并改名为redis.conf
在/home/docker/redis-cluster目录下输入命令:
ls -l
查看相应的文件夹是否已经生成,查看文件内容是否正确
例如6602文件夹内配置文件的内容用为:
port 6602
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.97
cluster-announce-port 6602
cluster-announce-bus-port 16602
appendonly yes
根据已经生成文件,启动容器
for port in `seq 6601 6606`; do \
docker run -d --net host --privileged=true \
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v $PWD/${port}/data:/data \
--restart always --name redis-${port} \
redis:5.0 redis-server /usr/local/etc/redis/redis.conf; \
done
解释:
--net host #指定容器使用host网络模式启动
-v $PWD/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf # 把对应的配置文件映射到容器内
--privileged=true #使容器内的root拥有真正的root权限
redis-server /usr/local/etc/redis/redis.conf # 使用配置文件启动redis
启动完所需要的redis服务,需要关闭防火墙或者开放对应的端口号,才能顺利的进行集群设置
可以选择下面的命令直接关闭防火墙或者开放对应端口号
直接关闭防火墙的命令:
systemctl stop firewalld # 关闭
systemctl disable firewalld #禁止开机启动
如果选择关闭防火墙需要重启docker服务
对防火墙开放对应的端口号
for port in `seq 6601 6606`; do
firewall-cmd --zone=public --add-port=${port}/tcp --permanent
done
重启防火墙使生效
firewall-cmd --reload
随意进入一个容器进行集群配置
docker exec -it redis-6601 /bin/bash
cd /usr/local/bin
redis-cli --cluster create 192.168.1.97:6601 192.168.1.97:6602 192.168.1.97:6603 192.168.1.97:6604 192.168.1.97:6605 192.168.1.97:6606 --cluster-replicas 1
把对应IP换成你主机IP
登录集群
docker exec -it redis-7003 /bin/bash
cd /usr/local/bin
以集群模式登录
redis-cli -c -p 7003
解释:
-c # 以集群模式登录
-h # 指定要登录的ip地址
-p # 指定要登录的端口号
这里需要-c 没有这个不能进行集群的正常操作
可以在一个里面set一个值,在其他的里面进行get测试