• Docker 网络


    五、Docker 网络


    Docker0

    清空所有环境

    # 移除所有容器
    [root@vinjcent ~]# docker rm -f $(docker ps -aq)
    # 移除所有镜像
    [root@vinjcent ~]# docker rmi -f $(docker images -aq)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    测试

    在这里插入图片描述

    三个网络分别代表三种不同的环境

    # 问题: docker 是如何处理容器网络访问
    
    
    [root@vinjcent ~]# docker run -d -P --name tomcat01 tomcat
    [root@vinjcent ~]# docker exec -it tomcat01 /bin/bash
    # 由于没有ip命令,进入容器中执行
    apt-get update && apt-get install -y iproute2
    
    
    # 查看容器的内部网络地址 ip addr		发现容器启动的时候会得到一个 eth0@if33 ip地址,由docker分配
    root@079b99b77cc9:/usr/local/tomcat# 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
    32: eth0@if33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    
    
    ### 思考: Linux 能不能ping通容器内部
    # 可以看到能够ping通 docker 内部
    [root@vinjcent ~]# ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.295 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.103 ms
    64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.155 ms
    64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.153 ms
    64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.149 ms
    64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.150 ms
    64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.207 ms
    64 bytes from 172.17.0.2: icmp_seq=8 ttl=64 time=0.172 ms
    64 bytes from 172.17.0.2: icmp_seq=9 ttl=64 time=0.148 ms
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    原理

    192.168.0.1 路由器

    192.168.0.3 比如连到 WIFI 的到这个网络地址

    由于属于同一网段,能够ping通

    1. 每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0

    桥接模式:使用的是 evth-pair 技术

    再次在 Linux 本地测试命令ip addr

    在这里插入图片描述

    # 发现这个容器带来的网卡,都是一对对的  如上面的32-33
    # evth-pair 即使一对的虚拟设备,是成对出现的,一段连接着协议,一段彼此相连
    # 正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备
    
    • 1
    • 2
    • 3
    1. 测试下 tomcat01 和 tomcat02
    # 创建 tomcat02 容器
    [root@vinjcent ~]# docker run -d -P --name tomcat02 tomcat
    [root@vinjcent ~]# docker exec -it tomcat01 /bin/bash
    # 由于没有ip、ping命令,进入容器中执行
    apt-get update && apt-get install -y iproute2 && apt install iputils-ping
    
    # 查看正在运行的容器
    [root@vinjcent ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
    29f50ce3b3d7   tomcat    "catalina.sh run"   17 minutes ago   Up 17 minutes   0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat02
    079b99b77cc9   tomcat    "catalina.sh run"   2 hours ago      Up 2 hours      0.0.0.0:49157->8080/tcp, :::49157->8080/tcp   tomcat01
    # 进入 tomcat02 容器
    [root@vinjcent ~]# docker exec -it 29f50ce3b3d7 /bin/bash
    # ping 一下 tomcat01
    root@29f50ce3b3d7:/usr/local/tomcat# ping 172.17.0.2
    PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.128 ms
    64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.189 ms
    64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.251 ms
    64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.168 ms
    64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.391 ms
    64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.205 ms
    64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.187 ms
    # tomcat02 的ip地址
    root@29f50ce3b3d7:/usr/local/tomcat# 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
    34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    
    
    # 这说明,容器与容器之间是可以互相ping的
    33: veth2e18f67@if32
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    绘制一个网络模型图

    在这里插入图片描述

    结论:tomcat01 和 tomcat02 是公用的一个路由器,docker0

    所有的容器不指定网络的情况下,都是 docker0 路由的,docker 会给我们的容器分配一个默认的可用 IP

    小结

    Docker 使用的是 Linux 桥接,宿主机中是一个 Docker 容器的网桥 docker0

    在这里插入图片描述

    只要容器删除,对应的一对网桥也就消失了

    思考:由于每次容器启动都会为容器分配id,在实现 database url = ip 时,需要更换数据库的 ip,我们希望通过如微服务中的 Feign 技术,通过服务名来进行访问容器

    5.1 --link

    [root@vinjcent ~]# docker exec -it tomcat02 ping tomcat01
    ping: tomcat01: Name or service not known
    [root@vinjcent ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
    # 进入 tomcat03 容器执行以下命令
    apt-get update && apt install iputils-ping
    
    # 发现通过 --link 就可以解决网络连通问题
    [root@vinjcent ~]# 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.128 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.101 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.119 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.102 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.089 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=6 ttl=64 time=0.084 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=7 ttl=64 time=0.144 ms
    
    # 反向可以ping通吗?
    [root@vinjcent ~]# docker exec -it tomcat02 ping tomcat03
    ping: tomcat03: Name or service not known
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    在这里插入图片描述

    [root@vinjcent ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                         NAMES
    e680055e32f3   tomcat    "catalina.sh run"   40 minutes ago   Up 40 minutes   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat03
    29f50ce3b3d7   tomcat    "catalina.sh run"   3 hours ago      Up 3 hours      0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat02
    079b99b77cc9   tomcat    "catalina.sh run"   5 hours ago      Up 5 hours      0.0.0.0:49157->8080/tcp, :::49157->8080/tcp   tomcat01
    # 查看具体的某一个容器
    [root@vinjcent ~]# docker inspect 29f50ce3b3d7
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    ### 实质上 tomcat03 就是在本地配置了 tomcat02 的配置 (不推荐使用)
    # 查看 hosts 文件配置
    [root@vinjcent ~]# 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 29f50ce3b3d7		# 这就是配置的地方
    172.17.0.4	e680055e32f3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.2 自定义网络

    查看所有的docker网络

    [root@vinjcent ~]# docker network ls
    NETWORK ID     NAME      DRIVER    SCOPE
    9b203b4a0922   bridge    bridge    local
    b062cd1dc605   host      host      local
    a956759ec7df   none      null      local
    
    • 1
    • 2
    • 3
    • 4
    • 5

    几种网络模式

    bridge:桥接

    none:不配置网络

    host:和宿主机共享网络

    container:容器网络连通(用的较少,局限性很大)

    测试

    # 直接启动的命令  --net bridge,而这个就是docker0
    docker run -d -P --name tomcat01 --net bridge tomcat
    
    # docker0特点: 默认的,域名不能访问,--link可以打通连接
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    自定义一个网络

    # 帮助命令
    [root@vinjcent ~]# docker network --help
    
    # --driver [网络模式]
    # --subnet [子网地址]
    # --gateway [网关]
    
    # 自定义一个网络
    [root@vinjcent ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 div_network
    # 查看docker网络列表
    [root@vinjcent ~]# docker network ls
    NETWORK ID     NAME          DRIVER    SCOPE
    9b203b4a0922   bridge        bridge    local
    fc77c0d825eb   div_network   bridge    local
    b062cd1dc605   host          host      local
    a956759ec7df   none          null      local
    # 查看自定义的网络配置信息
    [root@vinjcent ~]# docker network inspect div_network
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

    根据自定义的网络,开启两个容器

    ### 由于从docker拉下来的镜像没有ping命令,并且在自定义的网络下,容器不能安装apt-get update、apt-get install iputils-ping
    ### 需要手动创建一个dockerfile镜像,创建的docekrfile文件内容如下
    # =====================================文件内容=============================================
    FROM centos:7
    MAINTAINER vinjcent<2573552788@qq.com>
    
    COPY readme.txt /url/local/readme.txt
    
    ADD jdk-8u202-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.62.tar.gz /usr/local/
    
    RUN yum -y install vim
    RUN yum -y install iputils
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_202
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
    # =====================================文件内容=============================================
    # 创建镜像命令
    [root@vinjcent vinjcent]# docker build -f div_tomcat_dockerfile -t div_tomcat .
    # 查看镜像
    [root@vinjcent vinjcent]# docker images
    REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
    div_tomcat   latest    cb339a54a2c5   4 minutes ago   1.02GB
    tomcat       latest    52b67ab29b74   5 days ago      680MB
    centos       7         eeb6ee3f44bd   9 months ago    204MB
    # 运行自定义的两个镜像容器
    [root@vinjcent vinjcent]# docker run -d -P --name tomcat-net-01 --net div_network div_tomcat
    b0954fddd39611f4747dd89f8cc1955c20fbb9105bab8cebf16e2d5b4c32be00
    [root@vinjcent vinjcent]# docker run -d -P --name tomcat-net-02 --net div_network div_tomcat
    255128d366209e541a05789676af3da3c3da008c1d43e3b835bb0c9678dd89b9
    
    # 查看自定义网络配置信息
    [root@vinjcent ~]# docker network inspect div_network
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    ### 测试在自定义网络下ping命令操作两个容器
    # 不使用 --link 也可以ping名字了
    [root@vinjcent vinjcent]# docker exec -it tomcat-net-01 ping tomcat-net-02
    PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
    64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=1 ttl=64 time=0.070 ms
    64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=2 ttl=64 time=0.193 ms
    64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=3 ttl=64 time=0.092 ms
    64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=4 ttl=64 time=0.213 ms
    64 bytes from tomcat-net-02.div_network (192.168.0.3): icmp_seq=5 ttl=64 time=0.117 ms
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    自定义的网络docker已经维护好了对应的关系,推荐使用这样的网络

    好处

    • redis:不同的集群使用不同的网络,保证集群是安全健康的
    • mysql:不同的集群使用不同的网络,保证集群是安全健康的

    5.3 网络连通

    假设有这种情形,如下图所示

    在这里插入图片描述

    # 准备的不同容器,带有-net名字的是自定义的网络,而没有的则是docker01下的网络
    [root@vinjcent /]# docker run -d -P --name tomcat01 tomcat
    dd168102688c2d59379092ab6d8aca21ed57bb4286fa92eab0d7138c6e3489b1
    [root@vinjcent /]# docker run -d -P --name tomcat02 tomcat
    b377880ad622e9a05d15b50a43733e155957e2e7abb709c2bf5c7182815ea072
    [root@vinjcent /]# docker ps
    CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                         NAMES
    b377880ad622   tomcat       "catalina.sh run"        4 seconds ago    Up 4 seconds    0.0.0.0:49161->8080/tcp, :::49161->8080/tcp   tomcat02
    dd168102688c   tomcat       "catalina.sh run"        7 seconds ago    Up 7 seconds    0.0.0.0:49160->8080/tcp, :::49160->8080/tcp   tomcat01
    255128d36620   div_tomcat   "/bin/sh -c '/usr/lo…"   15 minutes ago   Up 15 minutes   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat-net-02
    b0954fddd396   div_tomcat   "/bin/sh -c '/usr/lo…"   15 minutes ago   Up 15 minutes   0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat-net-01
    
    # 由于从dockhub上拉下来的容器没有ping命令,需要手动安装
    # 进入tomcat01容器,执行以下命令
    [root@vinjcent /]# docker exec -it tomcat01 /bin/bash
    root@dd168102688c:/usr/local/tomcat# apt-get update && apt install iputils-ping
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    ping测试

    [root@vinjcent /]# docker ps
    CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                         NAMES
    b377880ad622   tomcat       "catalina.sh run"        15 minutes ago   Up 15 minutes   0.0.0.0:49161->8080/tcp, :::49161->8080/tcp   tomcat02
    dd168102688c   tomcat       "catalina.sh run"        15 minutes ago   Up 15 minutes   0.0.0.0:49160->8080/tcp, :::49160->8080/tcp   tomcat01
    255128d36620   div_tomcat   "/bin/sh -c '/usr/lo…"   30 minutes ago   Up 30 minutes   0.0.0.0:49159->8080/tcp, :::49159->8080/tcp   tomcat-net-02
    b0954fddd396   div_tomcat   "/bin/sh -c '/usr/lo…"   30 minutes ago   Up 30 minutes   0.0.0.0:49158->8080/tcp, :::49158->8080/tcp   tomcat-net-01
    [root@vinjcent /]# docker exec -it tomcat01 ping tomcat-net-01
    ping: tomcat-net-01: Name or service not known
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    查看docker network [options]命令

    [root@vinjcent vinjcent]# 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.
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    测试

    # 测试打通 tomcat01(容器) --- div_network(网络)
    
    # 将 tomcat01容器与div_network网络相连
    [root@vinjcent /]# docker network connect div_network tomcat01
    # 查看div_network的网络信息
    [root@vinjcent /]# docker network inspect div_network 
    
    
    # 实现了一个容器两个ip地址
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    # 再次尝试使用tomcat01容器 "ping" tomcat-net-01容器
    [root@vinjcent /]# 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.div_network (192.168.0.2): icmp_seq=1 ttl=64 time=0.108 ms
    64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=2 ttl=64 time=0.156 ms
    64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=3 ttl=64 time=0.120 ms
    64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=4 ttl=64 time=0.136 ms
    64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=5 ttl=64 time=0.086 ms
    64 bytes from tomcat-net-01.div_network (192.168.0.2): icmp_seq=6 ttl=64 time=0.117 ms
    
    # tomcat02依旧是打不通的
    [root@vinjcent /]# docker exec -it tomcat02 ping tomcat-net-01
    ping: tomcat-net-01: Name or service not known
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.4 实战:部署Redis集群

    在这里插入图片描述

    # 创建redis网络
    [root@vinjcent /]# docker network create redis --subnet 172.38.0.0/16
    5c0197bc1160253f042c2a5dda30ccebc499741c04a82a7fe4e02eeea091a668
    [root@vinjcent /]# docker network ls
    NETWORK ID     NAME          DRIVER    SCOPE
    efedc44687a5   bridge        bridge    local
    4e896df003be   div_network   bridge    local
    b062cd1dc605   host          host      local
    a956759ec7df   none          null      local
    5c0197bc1160   redis         bridge    local
    
    # 循环创建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 node.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
    
    # 模板
    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.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \
    
    # redis-1
    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
    
    # redis-2
    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
    
    # redis-3
    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
    
    # redis-4
    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
    
    # redis-5
    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
    
    # redis-6
    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@vinjcent /]# docker ps
    CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
    9e628dabd1b2   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   6 seconds ago    Up 5 seconds    0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
    7faf314737da   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   11 seconds ago   Up 10 seconds   0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
    d4aa7e9995a4   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   18 seconds ago   Up 17 seconds   0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
    a7047f1c2eb8   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   23 seconds ago   Up 22 seconds   0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
    0b62f39e1464   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   28 seconds ago   Up 27 seconds   0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
    59c162616b22   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   33 seconds ago   Up 32 seconds   0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    # 创建集群
    /data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6
    379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在这里插入图片描述

    # 进入redis控制台命令窗口
    /data # redis-cli -c
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    # 设置键值对
    127.0.0.1:6379> set a b
    -> Redirected to slot [15495] located at 172.38.0.13:6379
    OK
    # 可以看到直接跟 redis-3相连
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    测试

    # 将redis-3这个容器停止
    [root@vinjcent /]# docker ps
    CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES
    9e628dabd1b2   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp   redis-6
    7faf314737da   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp   redis-5
    d4aa7e9995a4   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp   redis-4
    # 这里
    a7047f1c2eb8   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp   redis-3
    0b62f39e1464   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp   redis-2
    59c162616b22   redis:5.0.9-alpine3.11   "docker-entrypoint.s…"   17 minutes ago   Up 17 minutes   0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp   redis-1
    
    [root@vinjcent /]# docker stop a7047f1c2eb8
    
    
    # 在redis-1重新进入redis-cli命令窗口
    /data # redis-cli -c
    127.0.0.1:6379> get a
    -> Redirected to slot [15495] located at 172.38.0.14:6379
    "b"
    # 可以发现redis-4变成了ma
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

  • 相关阅读:
    Mysql索引的创建与设计原则
    springboot流浪狗领养管理系统毕业设计源码260839
    Shiro笔记02-基本使用
    能把SAP系统玩成鸡肋的公司,太有才了!
    CountDownLatch使用错误+未最终断开连接导致线程池资源耗尽
    自动化测试文档
    Docker容器管理
    AVL树四种旋转的详细图解
    mysql5.7离线安装
    Java 应该怎么学
  • 原文地址:https://blog.csdn.net/Wei_Naijia/article/details/125544405