【八、Docker网路模式详解】

作者简介: 在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢 c + + , g o , p y t h o n , 目前熟悉 c + + , g o 语言,数据库,网络编程,了解分布式等相关内容 \textcolor{orange}{在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++,go语言,数据库,网络编程,了解分布式等相关内容} 在读机器人研究生,目前研一。对计算机后端感兴趣,喜欢c++,go,python,目前熟悉c++go语言,数据库,网络编程,了解分布式等相关内容
个人主页: \textcolor{gray}{个人主页:} 个人主页: 小呆鸟_coding
支持 : \textcolor{gray}{支持:} 支持: 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 \textcolor{green}{如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦} 如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦 就是给予我最大的支持! \textcolor{green}{就是给予我最大的支持!} 就是给予我最大的支持!
本文摘要

本专栏将非常细致的讲解docker原理、安装、用docker部署相关服务器以及使用docker部署自己的镜像,非常简单易懂。 本文主要讲解docker四种网路模式以及部署Redis集群实战和相关的配置。

文章目录

    • 1.Docker网络模式介绍
      • 1.1 host模式
      • 1.2container模式
      • 1.3 none模式
      • 1.4 bridge 模式
    • 2.容器互联 --link
    • 3.自定义网络
    • 4.Docker网络互联
    • 5.实战:部署Redis集群

Docker系列文章:
一、Docker概述
二、Docker安装大全
三、Docker 命令大全
四、Docker容器部署
五、Docker镜像详解
六、Docker容器卷详解
七、 Dockerfile详解
八、Docker网路模式详解
笔记总结:https://www.bilibili.com/video/BV1og4y1q7M4
可面试可复习

1.Docker网络模式介绍

通过docker networt ls查看所有的Docker 网络

[root@VM-16-15-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
324f435b94c4   bridge    bridge    local
d8538eecf15e   host      host      local
47a7d135d87a   mynet     bridge    local
7f3b6ce07cbc   none      null      local
6e16e5ccf170   redis     bridge    local

Docker默认提供了四个网络模式

模式类型 概述 缺点
host 容器和宿主机共享Network namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 同一个端口只能同时被一个容器服务绑定
container 创建的容器不会创建自己的网卡,配置自己的IP容器网络连通。容器和另外一个容器共享Network namespace(共享IP、端口范围) 第一个以bridge方式启动的容器服务挂掉,后面依赖它的容器,都暂停服务
bridge 容器默认的网络是桥接模式(自己搭建的网络默认也是使用桥接模式,启动容器默认也是使用桥接模式)。此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 系统默认
none 不配置网络,容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 很少用

容器默认使用bridge网络模式,我们使用该docker run --network=选项指定容器使用的网络:

  • host模式:使用 --net=host 指定。
  • none模式:使用 --net=none 指定。
  • bridge模式:使用 --net=bridge 指定,默认设置。
  • container模式:使用 --net=container:NAME_or_ID 指定。

1.1 host模式

Namespaces简介

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。

特点

  • host模式,它没有独立的网络空间。

  • host模式下的容器,完全和宿主机共用一个网络空间(端口、IP等),所以该模式下的容器不会虚拟出容器自身的虚拟网卡,也不会配置自己的虚拟IP。

  • host模式下的容器,除了网络和宿主机共享,其他的资源,如文件系统、进程列表等,容器之间依然是相互隔离的。

缺点

同一个端口,比如宿主机的8080端口,只能被一个服务占用,如果被某个容器占用了,宿主机就不能用,后续的容器也不能用,直到优先抢到80端口的服务,停止提供服务(放弃80端口)。

【八、Docker网路模式详解】_第1张图片

结论

启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口和主机名(hostname -I)。

1.2container模式

特点

  • 新创建的容器,仅同前面已存在的容器,共享网络空间,不与宿主机共享网络。
  • 新创建的容器,不会有自己的虚拟网卡和IP,后面新创建容器的网络资源用的是上一个容器的。
  • 新创建的容器,仅仅是网络和第一个容器共享,其他资源彼此还都是相互隔离的。

缺点

第一个指定容器服务停止,则后续的容器也没有办法继续运行

【八、Docker网路模式详解】_第2张图片

1.3 none模式

特点

  • Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置
  • 这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
    【八、Docker网路模式详解】_第3张图片

1.4 bridge 模式

特点

  • 默认为每个容器分配单独的网络空间,彼此相互隔离。
  • 每个容器都单独的网卡、路由、IP等一些列基本的网络设施。
  • 每个容器启动后,都会被分配一个独立的虚拟IP。
  • 该模式会自动,将宿主机上的所有容器,都链接到 #ip a 看到的docker0的虚拟网卡上。
  • 外界主机不能直接访问宿主机内的容器服务,需要宿主机通过-p做端口映射后访问宿主的映射端口。

【八、Docker网路模式详解】_第4张图片
Docker容器完成bridge网络配置的过当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。Docker0使用到的技术是evth-pair技术。在默认bridge网络模式下,我们每启动一个Docker容器,Docker就会给Docker容器配置一个ip。

概述Docker容器进行bridge网络配置的过程:

1.在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
2.Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

(1)通过ip addr 查看网卡情况

【八、Docker网路模式详解】_第5张图片

三个网络,docker是如何处理容器的网络访问的??

【八、Docker网路模式详解】_第6张图片

(2)启动一个容器,进入容器使用ip addr查看网络设置

[root@VM-16-15-centos ~]# docker run -d -P --name tomcat01 tomcat

#查看容器的内部网络地址 ipaddr ,发现容器启动的时候会得到一个eth@if262ip地址,docker分配的!

[root@VM-16-15-centos ~]# docker exec-it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever

62: eth0@if263:<BROADCASTMULTICASTUPLOERUP> tu 1500 qdisc noqueue    			 state UP group default
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:fflink-netnsid O inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid 1ft forever preferred 1ft forever


# liunx 能 ping 通容器内部!
[root@VM-16-15-centos ~]#ping 172.18.0.2
PING 172.18.0.2(17218.0.2)56(84) bytes of data.
64 bytes from 17218.0.2:icmp_seq=1tt1=64 time=0.067 ms64 bytes from 172.18.0.2:icmp sea=2 tt1=64 time=0.055 ms

linux俩个容器之间可以Ping通吗???不能

(3)每启动一台容器,docker,就会给容器分配一个地址,而且这个地址是成对出现的

  • 每启动一台docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!!
    再次测试ip addr
    【八、Docker网路模式详解】_第7张图片
  • 在启动一个容器测试 ,ip addr 发现又多了一对网卡
    【八、Docker网路模式详解】_第8张图片
# 容器带来的网卡都是一对对的
# evth-pair 就是一对的虚拟设备接口,他们都是成对出现的一段连接着协议,一段彼此相连
# 正是因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网路设备的
# Openstac Docker容器之间的连接,OVS的连接,都是使用evth-pair技术

4.测试romcat01和tmcat02是否能ping通

[root@VM-16-15-centos ~] # docker exec -it tomcat02 ping  172.18.0.2

#可以ping通,这说明容器和容器之间可以互相 ping通的

结论:容器和容器之间可以ping通,容器与宿主机之间也可以ping通

5.绘图分析

【八、Docker网路模式详解】_第9张图片
结论:tomcat01和tomcat02是公用的一个路由器,docker0,所有的容器不指定网络的情况下,都是docker0 路由的,docker会给我们的容器分配一个默认的可用ip

【八、Docker网路模式详解】_第10张图片

  • Docker中的所有网络口都是虚拟的。因为虚拟的转发效率高!
  • 只要容器删除,对应的一对网桥就没了!

【八、Docker网路模式详解】_第11张图片

2.容器互联 --link

在微服务部署的场景下,注册中心是使用服务名来唯一识别微服务的,而我们上线部署的时候微服务对应的IP地址可能会改动,所以我们需要使用容器名来配置容器间的网络连接。使用–link可以完成这个功能。

(1)不设置- -link互联,查看tomcat02是否可以pin通tomcat01

[root@VM-16-15-centos ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

(2)启动tomcat03用–link绑定tomcat02,这样tomcat03就可以通过名字来ping通tomcat02

# 通过 --link解决网络连通问题
[root@VM-16-15-centos ~]# docker run  -d -P --name tomcat03 --link tomcat02 tomcat
8f9c9c943b0353c17553df9e9ada5655c69cff42356e40db4e6af64c1ce904ea

[root@VM-16-15-centos ~]# 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.076 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.046 ms

(3)但是反过来tomcat02不可以ping通tomcat03

# tomcat03 可以ping通tomcat02,但是反过来不一定可以ping通
[root@VM-16-15-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

(4)tomcat03中配置了tomcat02
--link的原理是在指定运行的容器上的/etc/hosts文件中添加容器名和ip地址的映射
·--link 就是在hosts配置中增加了一个172.17.0.3 tomcat02 a250252c5d58的映射

#查看 hosts 配置,能够发现在tomcat03绑定了tomcat02

[root@VM-16-15-centos ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	tomcat02 a250252c5d58
172.17.0.4	8f9c9c943b03

(5)Tomcat02中没有配置tomcat03

[root@VM-16-15-centos ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1	localhost
::1	localhost ip6-localhost ip6-loopback
fe00::0	ip6-localnet
ff00::0	ip6-mcastprefix
ff02::1	ip6-allnodes
ff02::2	ip6-allrouters
172.17.0.3	a250252c5d58

  • –link缺点:太麻烦,俩个容器都需要进行配置,才可以 通过名字进行访问
  • docker0问题:它不支持容器名的连接访问
  • 解决办法就是使用自定义网络

3.自定义网络

特点:

docker0默认情况下是容器之间通过容器名字是不能互相访问的,如果想访问只能通过–link,但是–link设置复杂,需要俩个容器都要配置,所以出现自定义网络,这样就可以通过容器名字来访问来个容器了

通过docker network ls查看所有的Docker网络:
【八、Docker网路模式详解】_第12张图片

(1)通过docker network --help查看网络相关命令

[root@VM-16-15-centos ~]# 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

(2)通过docker network inspect 容器Id查看详细信息

[root@VM-16-15-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
324f435b94c4   bridge    bridge    local
d8538eecf15e   host      host      local
7f3b6ce07cbc   none      null      local
[root@VM-16-15-centos ~]# docker network inspect 324f435b94c4 

【八、Docker网路模式详解】_第13张图片

(3)通过docker network create --help命令的查看创建自定义网络的相关参数
【八、Docker网路模式详解】_第14张图片

(4)自定义网络

# 平时直接启动的命令 --net bridge,而这个就是我们的docker0
# 下面俩个是等价的,只不过平是默认桥接模式
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

#dokcer0特点,默认,域名不能访问, --link可以打通连接

#自定义网络
[root@VM-16-15-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[root@VM-16-15-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
324f435b94c4   bridge    bridge    local
d8538eecf15e   host      host      local
47a7d135d87a   mynet     bridge    local
7f3b6ce07cbc   none      null      local

参数说明:

  • --driver bridge 指定bridge驱动程序来管理网络
  • --subnet 192.168.0.0/16 指定网段的CIDR格式的子网 , 192.168.02-192.168.255.255
  • --gateway 192.168.0.1 指定主子网的IPv4或IPv6网关,所有的网络都经过它与外界连接

(5)通过docker network inspect mynet查看自己配置的网络

此时自己的网络就创建好了

[root@VM-16-15-centos ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "47a7d135d87ad4f55d7780b79acef2be94ea17776cd0716d15a4ec6c2fb76e10",
        "Created": "2022-06-16T17:45:30.083091445+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

(6)测试通过自定义网络,来启动俩个容器,查看是否不需要 --link就可以容器名字可以ping通

[root@VM-16-15-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat 
[root@VM-16-15-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 
[root@VM-16-15-centos ~]# docker network inspect mynet

通过docker network inspect mynet查看到该网络上有俩个容器,而且ip地址是之前我们设置的

【八、Docker网路模式详解】_第15张图片

通过容器名来测试容器tomcat-net-01 和容器tomcat-net-02之间是否能正常网络通信

【八、Docker网路模式详解】_第16张图片

优点

  • 在自定义的网络下,容器之间能进行容器名来访问,也可以通过ip地址来访问。自定义的网络默认已经帮我们维护了容器间的对应关系(一般推荐自定义网络)
  • Redis - 不同集群使用不同的网络,保证集群的安全和健康。
  • MySQL -不同集群使用不同的网络,保证集群的安全和健康。
    【八、Docker网路模式详解】_第17张图片

4.Docker网络互联

  • 在没有设置网络互联的情况下,不同网络段的容器是不可以进行网络连接的
  • 如果想要打通这个连接,只能是容器与网卡连接,容器与容器和网卡与网卡是不能打通连接的
    【八、Docker网路模式详解】_第18张图片

(1)在默认docker0下启动tomacat01,tomcat02,尝试是否能连接mynet网络段

[root@VM-16-15-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED       STATUS          PORTS                                         NAMES
29861eb9992a   tomcat    "catalina.sh run"   2 hours ago   Up 2 hours      0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat-net-02
f660ed7e84cc   tomcat    "catalina.sh run"   2 hours ago   Up 2 hours      0.0.0.0:49157->8080/tcp, :::49157->8080/tcp   tomcat-net-01
a250252c5d58   tomcat    "catalina.sh run"   4 hours ago   Up 7 seconds    0.0.0.0:49160->8080/tcp, :::49160->8080/tcp   tomcat02
ed50a320e37d   tomcat    "catalina.sh run"   4 hours ago   Up 12 seconds   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat01

[root@VM-16-15-centos ~]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

(2)通过docker network --help查看网络所需命令

【八、Docker网路模式详解】_第19张图片

(3)通过docker network connect --help来查看容器与网络之间连接所需参数

【八、Docker网路模式详解】_第20张图片

(4) 通过docker network connect mynet tomcat01 测试打通 tomcat01 到 mynet

[root@VM-16-15-centos ~]# docker network connect mynet tomcat01

#连通之后,tomcat01就放在了 mynet网络下
#一个容器俩个ip地址!!
# 阿里云服务,公网ip和私网ip


(5)通过docker network inspect mynet查看详细网络情况,发现tomcat在该网段下

【八、Docker网路模式详解】_第21张图片

(6)在次验证tomcat01是否可以ping通mynet网段

#Tomcat01 连通了
[root@VM-16-15-centos ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.050 ms

# Tomcat02是依旧打不通的
[root@VM-16-15-centos ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

结论:假设要跨网络操作别人,就需要使用docker network connect 连通!!!

5.实战:部署Redis集群

【八、Docker网路模式详解】_第22张图片
(1)创建redis自定义网络`

[root@VM-16-15-centos ~]# docker network create redis --subnet 172.38.0.0/16
6e16e5ccf170f2745c2d95a478514f6ba9891f3e4ab3acd395598bf6a403a397

[root@VM-16-15-centos ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
324f435b94c4   bridge    bridge    local
d8538eecf15e   host      host      local
47a7d135d87a   mynet     bridge    local
7f3b6ce07cbc   none      null      local
6e16e5ccf170   redis     bridge    local

(2)通过以下脚本来实现redis集群的配置

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

运行结果如下

[root@VM-16-15-centos node-1]# cd /mydata/redis
[root@VM-16-15-centos redis]# ls
node-1  node-2  node-3  node-4  node-5  node-6

[root@VM-16-15-centos redis]# cd node-1
[root@VM-16-15-centos node-1]# ls
conf

[root@VM-16-15-centos node-1]# cat 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.11
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes

(3)启动6个redis容器,并且进行配置以及数据卷挂载

#启动第1个Redis容器
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.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
#启动第2个Redis容器
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
    -v /mydata/redis/node-2/data:/data \
    -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
#启动第3个Redis容器
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
    -v /mydata/redis/node-3/data:/data \
    -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
#启动第4个Redis容器
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
    -v /mydata/redis/node-4/data:/data \
    -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
#启动第5个Redis容器
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
    -v /mydata/redis/node-5/data:/data \
    -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
    
#启动第6个Redis容器
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
    -v /mydata/redis/node-6/data:/data \
    -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
    -d --net redis --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

查看6个redis是否都启动

[root@VM-16-15-centos node-1]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
a3dbc969106d   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   5 seconds ago    Up 4 seconds    0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
39597331b215   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   14 seconds ago   Up 13 seconds   0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
944925fd8e4d   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   22 seconds ago   Up 21 seconds   0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
170971643c6d   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   31 seconds ago   Up 30 seconds   0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
059068c63a32   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   42 seconds ago   Up 41 seconds   0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
2ea224fd4dab   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes    0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1

(4)进入redis-1容器中创建集群

redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1


/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0
.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 4af40ad4c77b6a4af023f89577423aae68778d3f 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: a3de843b9dbc260f3362bf16d9555d8d8e7a888f 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 17a5374149b8713b76e259d5738ae479e3f109e4 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 134cad22d16c459c225fde6fa3edabe8b2081669 172.38.0.14:6379
   replicates 17a5374149b8713b76e259d5738ae479e3f109e4
S: c6f4e412b0534067e2400d248637d64c91cd49dd 172.38.0.15:6379
   replicates 4af40ad4c77b6a4af023f89577423aae68778d3f
S: a0d18e93cf49112afc2c01faf2d26e01c3ae0b3a 172.38.0.16:6379
   replicates a3de843b9dbc260f3362bf16d9555d8d8e7a888f


(5)查看集群信息

redis-cli -c
cluster info

【八、Docker网路模式详解】_第23张图片

(6)测试redis主从复制,设置key和value,这个结果重定向到redis-3节点

127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK

新建一个会话,停止Redis-3,此时重新连接Redis-cli客户端,再次获取k1,重定向到了Redis-3节点的从节点Redis-4中处理。
在这里插入图片描述

在这里插入图片描述

你可能感兴趣的:(Docker,docker,容器,运维)