【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群

该篇文章已经被专栏《从零开始学docker》收录

Docker网络与redis集群

  • Docker网络
    • (1)--link
    • (2)自定义网络
    • (3)网络联通
  • 实战:部署redis集群
    • (1)创建redis网络
    • (2)通过脚本创建redis配置
    • (3)启动redis
    • (4)创建集群
  • 写在最后

Docker网络

(1)–link

如何用名字而不用ip来访问容器,这个时候就要使用–link了! 因为上篇文章我们启动了两台tomcat,这里我们直接用这两台机子来测试一下。

docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
可以发现是ping不通的

如何解决两个容器直接用名字互通(把两个容器连接起来就行了)

docker run -d -P --name tomcat03 --link tomcat02 tomcat:7.0

我们新启一个tomcat,让他通过–link绑定tomcat02

docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.142 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.083 ms

直接链接就可以ping了!

docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

反向是不能ping通的,因为没有配置,然后我们使用命令查看一下所有网卡。

docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
3454234082a6   bridge    bridge    local
03fb70520a34   host      host      local
83eddbf8f273   none      null      local

ntwkid是本地的网卡(docker0),然后我们docker network inspect 3454234082a6查看bridge的网络配置信息【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维
这就是docker0 上面可以看到ip和网段
【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维 这是其他容器,如果启动服务不指定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

【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维
三主三从都没问题。
【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维
set a b之后是13处理的(master)数据也在里面,从机应该也有这个数据,就算主机挂了从机也可以顶上。这就是高可用
【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维
然后我们直接停了第三个主机,然后我们get a,因为高可用搭建成功了所以可以!
【云原生 | 从零开始学Docker八丶Docker网络与部署redis集群-每日运维
在14找到了,从机,没问题,故障转移了,14就变为master了。

写在最后

创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我! 目前正在更新的系列:从0开始的蓝桥杯省一之路,云原生系列。 感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~