【云原生 从零开始学Docker】八丶Docker网络与部署redis集群_docker部署redis集群需要再一个docker里吗

33 阅读7分钟

请添加图片描述
这是其他容器,如果启动服务不指定ip会随机分配一个ip,这个ip是docker启动的时候分配的,其实tomcat03就是在本地配置了tomcat02的配置。

请添加图片描述
说白了–link就是在hosts配置中增加了一个tomcat02的映射,可以通过tomcat03ping通。也可以互相绑定,我们不推荐使用,太笨了,我们需要自定义网络(不用docker0,因为很多局限 不支持容器名连接访问)

(2)自定义网络

我们来简单介绍一下四种常见的网络状态!
bridge:桥接,说白了就是在docker上面搭桥,比如之前一个路由器叫0.1,后面来了0203,但是他们不能互相访问,不过可以通过01作为一个桥就可以通过这个桥互相访问了。(默认)

none:不配置网络

host:主机模式(和宿主机共享网络)

container:容器内网络联通(用的少)

docker run -d -P --name tocmat01 --net bridge tomcat:7.0
docker run -d -P --name tocmat01 tomcat:7.0

这两条命令其实是一样的,因为默认的网络模式就是bridge
--net以及docker network就是我们的自定义网络模式了,服务在自定义网络下面使用。

然后我们看一下怎么用

docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

好的 可以看到增删查这种的基本操作,我们来试试体验一下。

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#--driver bridge 网络模式
#--subnet 192.168.0.0/16 子网
#--gateway 192.168.0.1 网关

docker network ls

请添加图片描述
可以看到我们设置的自定义网络。然后自己通过这个mynet启动两个tomcat,再次查看可以看到有两个新容器,ip也是自己分配的!

docker run -d -P --name tomcatzijide --net mynet tomcat:7.0

docker run -d -P --name tomcatzijide2 --net mynet tomcat:7.0

请添加图片描述

docker exec -it tomcatzijide ping tomcatzijide2 
PING tomcatzijide2 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp\_seq=1 ttl=64 time=0.118 ms
64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp\_seq=2 ttl=64 time=0.070 ms

是可以通过容器名字ping的!现在不用--link就可以ping名字了

那么我们为什么要自己搭建呢?好处在哪里?

我们自定义的网络docker都已经帮着维护好了对应的关系,docker0没有这个功能,所以推荐自定义网络!比如搭建redis或者mysql的集群,要搭网络,网络是隔离的,都有自己的子网,不同的集群使用不同的网络保证安全。

(3)网络联通

请添加图片描述
docker0和mynet是两个网段不能ping通,我们要把docker0的容器可以连接到mynet而不是把两个网络打通(两个网络打通出问题,整个网络就变了)可以使用下面的命令

docker network connect mynet tomcat01 

打通tomcat01到mynet

请添加图片描述
联通之后会把tomcat01加入到mynet网络下,两个打通了,也就是叫一个容器两个ip。腾讯服务也有两个:公网和私网ip

docker exec -it tomcat01 ping tomcatzijide
PING tomcatzijide (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcatzijide.mynet (192.168.0.2): icmp\_seq=1 ttl=64 time=0.124 ms
64 bytes from tomcatzijide.mynet (192.168.0.2): icmp\_seq=2 ttl=64 time=0.066 ms

此时就可以ping通了,02也可以被打通。 如果跨网络操作别人,就要用connect联通!

实战:部署redis集群

然后我们用上面学到的知识做一个redis集群来熟悉这些指令。

(1)创建redis网络

docker network create redis --subnet 172.42.0.0/16

(2)通过脚本创建redis配置

如果要自己弄的话要起好久,而脚本是帮助我们快速解决的工具!(直接复制到linux下就行)

for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379 
bind 0.0.0.0
cluster-enabled yes 
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

之后去目录查看一下

cd /mydata/
cd redis/
ls
node-1  node-2  node-3  node-4  node-5  node-6

(3)启动redis

脚本或者一个一个启动,脚本:

for port in $(seq 1 6); \
do
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.42.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
done

一个一个启动:

docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
    -v /mydata/redis/node-1/data:/data \
    -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.42.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

一个一个启动记得把redis-1挨个换成-2-3-4-5-6

启动成功之后查看一下

docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS              PORTS                                                                                      NAMES
a29639299648   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 seconds ago        Up 1 second         0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
1eac8739a31a   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 seconds ago        Up 2 seconds        0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
6ba5ef70d66f   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   3 seconds ago        Up 2 seconds        0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
e54c22dc5bc5   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   3 seconds ago        Up 3 seconds        0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
029f10e823d4   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   31 seconds ago       Up 30 seconds       0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
bdf03f1113f1   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   About a minute ago   Up About a minute   0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1

(4)创建集群

进入容器

docker exec -it redis-1 /bin/sh redis没有bash 是sh 进去之后默认的pwd是data目录

redis-cli --cluster create 172.42.0.11:6379 172.42.0.12:6379 172.42.0.13:6379 172.42.0.14:6379 172.42.0.15:6379 172.42.0.16:6379 --cluster-replicas 1

然后输入yes就开始创建集群了

查看集群信息

redis-cli -c
cluster info

请添加图片描述

三主三从都没问题。

请添加图片描述

set a b之后是13处理的(master)数据也在里面,从机应该也有这个数据,就算主机挂了从机也可以顶上。这就是高可用

请添加图片描述

然后我们直接停了第三个主机,然后我们get a,因为高可用搭建成功了所以可以!

请添加图片描述

在14找到了,从机,没问题,故障转移了,14就变为master了。

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!