写点什么

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

作者:泡泡
  • 2022 年 9 月 18 日
    河北
  • 本文字数:3927 字

    阅读完需:约 13 分钟

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

Docker 网络

(1)--link

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


docker exec -it tomcat02 ping tomcat01ping: 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 tomcat02PING 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 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.068 ms64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.083 ms
复制代码


直接链接就可以 ping 了!


docker exec -it tomcat02 ping tomcat03ping: tomcat03: Name or service not known
复制代码


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


docker network lsNETWORK ID     NAME      DRIVER    SCOPE3454234082a6   bridge    bridge    local03fb70520a34   host      host      local83eddbf8f273   none      null      local
复制代码


ntwkid 是本地的网卡(docker0),然后我们docker network inspect 3454234082a6查看 bridge 的网络配置信息



这就是 docker0 上面可以看到 ip 和网段



这是其他容器,如果启动服务不指定 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.0docker 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 ms64 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 tomcatzijidePING 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 ms64 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}/conftouch /mydata/redis/node-${port}/conf/redis.confcat << EOF >/mydata/redis/node-${port}/conf/redis.confport 6379 bind 0.0.0.0cluster-enabled yes cluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 172.38.0.1${port}cluster-announce-port 6379cluster-announce-bus-port 16379appendonly yesEOFdone
复制代码


之后去目录查看一下


cd /mydata/cd redis/lsnode-1  node-2  node-3  node-4  node-5  node-6
复制代码

(3)启动 redis

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


for port in $(seq 1 6); \dodocker 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 psCONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS              PORTS                                                                                      NAMESa29639299648   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-61eac8739a31a   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-56ba5ef70d66f   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-4e54c22dc5bc5   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-3029f10e823d4   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-2bdf03f1113f1   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 -ccluster info
复制代码



三主三从都没问题。



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



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



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

写在最后

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


发布于: 刚刚阅读数: 3
用户头像

泡泡

关注

做最好的知识分享 云计算/云原生 2022.08.25 加入

CSDN万粉博主

评论

发布
暂无评论
【云原生 | 从零开始学Docker】八丶Docker网络与部署redis集群_Docker_泡泡_InfoQ写作社区