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

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

在这里插入图片描述

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的网络配置信息
请添加图片描述

这就是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.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.11${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

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

查看集群信息

redis-cli -c
cluster info

请添加图片描述

三主三从都没问题。

请添加图片描述

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

请添加图片描述

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

请添加图片描述

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

写在最后

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

猜你喜欢

转载自blog.csdn.net/qq_45400861/article/details/125259386
今日推荐