docker进阶篇

目录

一  容器数据卷

1.1使用数据卷

1.2部署MySQL

1.3具名和匿名挂载

1.4dockerfile

1.5数据卷容器

二  dockerfile详解

2.1 dockerfile的构建过程

2.2常用的指令

2.3 实战测试

2.4 命令区别

2.5 tomcat实战

2.6 小结

三 docker 网络

   3.1 理解网络docker0

3.2 网卡网络拓补图

3.3 自定义网络

3.4 网络连通

四 部署redis集群


一  容器数据卷

如果数据在容器中,一旦删除容器,则数据丢失 :  需求:数据可以持久化

容器之间有一个数据共享的技术,docker容器产生的数据同步到本地!

这就是卷技术,目录的挂载,将我们的容器挂载到linux上!

总结:容器持久化和同步操作!容器间也是可以数据共享的!

1.1使用数据卷

方式一 :直接使用命令来挂载 docker -v

docker run -it -v主机目录:/容器目录

[root@master ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

##将主机home/ceshi 挂在给容器的home

[root@master home]# docker inspect ae7eafb68bdb ##查看容器详细信息

        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",  ##/home/ceshi 和home相当于一个地址 一个存储
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

##在宿主机修改挂载点的文件,容器内文件依然是同步的
[root@ae7eafb68bdb home]# rm *
rm: cannot remove 'app': Is a directory

##容器内的文件不能删除 也就是映射关系 而不是同步关系

1.2部署MySQL

##获取镜像
[root@master ~]# docker pull mysql  ##下载最新版的mysql

##运行容器 需要数据挂载 ##安装mysql需要配置密码  可以在dockerhub查看官方配置
-d后台运行
-p端口映射
-v卷挂载
-e 环境配置
-name 容器名字
 
[root@master ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=1234     \
--name mysql01 mysql
a0cb263085b31f2acd549aea25c6fd493d648c1f6eef2794d16ed42d770779db

1.3具名和匿名挂载

##匿名挂载
-v 容器内路径
docker run -d --name tomcat01 -v /etc/tomcat tomcat 

[root@master mysql]# docker volume list ##查看所有卷的情况
DRIVER    VOLUME NAME
local     bab15bf96f32a57597f2ee09bbb18c8d4bf4bda64a5067ff1427351c6d6af9db
local     c0f70376371eaaed436633aab77089588ea34866f61d4bda2e8f32b8bec4c925
local     ed1647ae7801076cb84572c1f7b1314bda37264dd1d3cb637ed041b3ec8b080a
##每一个local就是一个真是存在的目录

[root@master mysql]# docker inspect 1e6604bea643

        "Mounts": [
            {
                "Type": "volume",
                "Name": "bab15bf96f32a57597f2ee09bbb18c8d4bf4bda64a5067ff1427351c6d6af9db",
                "Source": "/var/lib/docker/volumes/bab15bf96f32a57597f2ee09bbb18c8d4bf4bda64a5067ff1427351c6d6af9db/_data", ##未指定的路径
                "Destination": "/etc/tomcat",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }


具名挂载

 docker run -d --name nginx02 -v juming:/etc/nginx nginx
##-v 后面就是名字 juming

[root@master _data]# docker volume ls
DRIVER    VOLUME NAME
local     bab15bf96f32a57597f2ee09bbb18c8d4bf4bda64a5067ff1427351c6d6af9db
local     c0f70376371eaaed436633aab77089588ea34866f61d4bda2e8f32b8bec4c925
local     d2c148f0bc9ec81c17fdb65733d6f620c0be5985fcb8f8311212134ee58fe8e1
local     ed1647ae7801076cb84572c1f7b1314bda37264dd1d3cb637ed041b3ec8b080a
local     juming


[root@master _data]# docker volume inspect juming
[
    {
        "CreatedAt": "2022-09-28T21:51:30+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming/_data",
        "Name": "juming",
        "Options": null,
        "Scope": "local"
    }
]

##docker容器没有指定目录下的 时候目录就是挂在在mountpoint所对应的路径下

大多数情况是使用具名挂载

拓展:

rw 可读可写 ro只读

一旦这个设置容器权限 容器对我们挂载出来就有限定了!

 docker run -d --name nginx02 -v juming:/etc/nginx ro nginx

 docker run -d --name nginx02 -v juming:/etc/nginx rw nginx

ro只能通过宿主机来写

1.4dockerfile

dockerfile就是用来构建docker 镜像的构建文件!命令脚本!

通过脚本来生成一个镜像,镜像是一层层的,

##创建一个dockersfile文件
##文件中的内容(指令【大写】 参数)
##这里面的每一个命令都是一层

[root@master ~]# cat dockerfile 
FROM centos

VOLUME ["/volume01","/volume02"]  ##匿名挂载

CMD echo"******and*******"
CMD /bin/bash


[root@master ~]# docker build -f dockerfile -t huawei:1.0 .
Sending build context to Docker daemon  5.765MB
Step 1/4 : FROM centos
 ---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Using cache
 ---> 9ca99510472a
Step 3/4 : CMD echo"******and*******"
 ---> Using cache
 ---> 2e48d9d92bf0
Step 4/4 : CMD /bin/bash
 ---> Using cache
 ---> 474bed9878c1
Successfully built 474bed9878c1
Successfully tagged huawei:1.0

[root@master ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
huawei        1.0       474bed9878c1   4 minutes ago   231MB
tomcat01      1.0       2edf7393e8d1   47 hours ago    480MB
mysql         latest    43fcfca0776d   13 days ago     449MB
nginx         latest    2d389e545974   2 weeks ago     142MB


[root@master ~]# docker run -it 474bed9878c1  /bin/bash

[root@0f7d9eb397bc /]# ls -l
total 0
lrwxrwxrwx   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root 360 Sep 28 14:33 dev
drwxr-xr-x   2 root root   6 Sep 28 14:33 volume01 ## 这个就是生成镜像是自动挂载的目录 数据卷目录
drwxr-xr-x   2 root root   6 Sep 28 14:33 volume02 

 
[root@master ~]# docker inspect interesting_mirzakhani ##查看卷挂在的路径

      "Mounts": [
            {
                "Type": "volume",
                "Name": "a8d00958cab1013879e96fb1dc8048cc1fd242ec4382acdafd4fe0c283582dea",
                "Source": "/var/lib/docker/volumes/a8d00958cab1013879e96fb1dc8048cc1fd242ec4382acdafd4fe0c283582dea/_data",
                "Destination": "/volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""


这种方式使用会很多,未来会有很多自己构建镜像

假设构建镜像没有挂在卷 要手动镜像挂载 -v容器路径

1.5数据卷容器

多个mysql数据同步

 ##启动三个容器

[root@master ~]# docker run -it --name docker01 huawei:1.0 /bin/bash

[root@master ~]# docker run -it --name docker02 --volumes-from docker01 huawei:1.0 /bin/bash

[root@master ~]# docker run -it --name docker03 --volumes-from docker01 huawei:1.0 /bin/bash

##docker01的挂载的数据同步到了docker02上
## --volumes-from  通过实现容器间的文件共享
##数据共享 删除docker01 依然可以访问创建的文件夹 说明不是共享机制 而是一种备份机制 即拷贝

 多个mysql实现数据共享

#端口指定要不一样
#他们在/etc/mysql/conf.d /var/lib/mysql 文件相同

[root@master ~]# docker run -d -p 3310:3306 -v /home/mysql/conf/:/etc/mysql/conf.d -v /home/mysql/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 --name mysql1 mysql

[root@master ~]# docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123 --name mysql2 --volumes-from mysql1 mysql 


[root@master ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                                  NAMES
7c5ffb94314f   mysql     "docker-entrypoint.s…"   6 seconds ago   Up 5 seconds   33060/tcp, 0.0.0.0:3309->3306/tcp, :::3309->3306/tcp   mysql2
5fe135b20f1c   mysql     "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:3310->3306/tcp, :::3310->3306/tcp   mysql1

结论:

容器之间的配置信息的传递,容器的生命周期一直持续到没有容器使用为止

但是一旦持久化化了到了 这个时候本地的数据不会被删除

二  dockerfile详解

dockerfile 是用来构建docker镜像 命令参数参数

构建步骤:

1.编写一个dockerfile文件按

2.dockerbuild 构建成为一个镜像

3.docekr run 运行镜像

4.dockers push 发布镜像(dockerhub 阿里云镜像仓库)

查看官方 centos的镜像dockerfile文件

 很多官方镜像都是基础包,很多功能都是没有的,我们通常会自己搭建镜像


2.1 dockerfile的构建过程

基础知识:

1.每个保留关键字(指令)都必须是大写字母

2.执行是从上到下顺序执行

3.#表示注释

4.每一个指令都会创建提交一个镜像层,并提交

 dockerfile是面向开发的我们呢以后要发布项目,做镜像,就需要编写dockerfile文件 !

 docekr镜像 逐渐成为了企业交付的标准,必须要掌握!

 dockerfile:构建文件,定义了一切的步骤,源代码

dockerimages:同通过dockerfile构建的生成的镜像 最终发布和运行的产品

docker容器:容器就是镜像运行起来提供服务器

2.2常用的指令

FORM基础镜像  如centos 乌班图等等  一切从这里开始构建
MAINTAINER镜像是谁写的 姓名+邮箱
RUN 镜像构建的时候需要运行命令
ADD步骤,tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR镜像的工作目录
VOLUME        挂载主机目录
EXPOSE

暴露端口配置

CMD指定这个容器启动要运行的命令,只有最后一个生效,可被生效
ENTRYPOINT指定这个容器启动的是运行的命令,可以追加命令
OUBUILD当构建一个被继承dockerfile 这个时候就会运行onbuild的命令 触发指令
COPY               类似ADD,将我们文件拷贝到镜像
ENV构建的时候设置环境变量

2.3 实战测试

docker bub中99%的镜像都是从这个基础镜像过来的 FROM scratch,让不会配置需要的软件

##官方的镜像源
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /

LABEL \
    org.label-schema.schema-version="1.0" \
    org.label-schema.name="CentOS Base Image" \
    org.label-schema.vendor="CentOS" \
    org.label-schema.license="GPLv2" \
    org.label-schema.build-date="20201113" \
    org.opencontainers.image.title="CentOS Base Image" \
    org.opencontainers.image.vendor="CentOS" \
    org.opencontainers.image.licenses="GPL-2.0-only" \
    org.opencontainers.image.created="2020-11-13 00:00:00+00:00"

CMD ["/bin/bash"]

创建一个自己的centos

##step1 编辑dockerfile文件
[root@yunpc ~]# cat mydockerfile 
FROM centos7            
MAINTAINER huawei<jiushiniu@huawei.com>  ##邮箱姓名
ENV MYPATH /usr/local                    ##环境变量

RUN yum -y install vim                  ##运行命令

EXPOSE 80                               #暴露端口

CMD "/bin/bash"                         ##指定解释器


##step 2通过文件构建镜像
[root@yunpc ~]# docker build -f mydockerfile -t centos:1.0 .
                                ##文件路径       ##名称和标签  ##当前路径
Sending build context to Docker daemon  31.74kB
Step 1/6 : FROM centos7          ##下载镜像
 ---> 5d0da3dc9764
Successfully built 7884488c2aff ##成功返回successfully
Successfully tagged centos:latest

##修改docker镜像名子和版本号  用于无法删除镜像
[root@yunpc ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       0.1       55ed338c20e6   5 minutes ago   231MB
centos       <none>    5d0da3dc9764   13 months ago   231MB
[root@yunpc ~]# docker tag  5d0da3dc9764 centos:0.0

##step3 测试
[root@yunpc ~]# docker run -it centos:2.0 /bin/bash
[root@d49bf8005a16 local]# pwd   ##定义的工作目录
/usr/local
[root@d49bf8005a16 local]# 

##docker history 镜像id
可以查看镜像是如何构成的


2.4 命令区别

CMD ##指定这个容器启动的时候要运行的命令,只有最后一个才会生效,可被替代

CMD ["pwd"]

CMD["ls","-a”]

启动镜像就执行命令但是只会执行最后一个命令

 docker run -it centos:2.0 -l  ##运行l命令 不追加

ENTRYPOINT  ##指定这个容器起订时候要运行的命令。可以追加命令

ENTRYPOINT ["pwd"]

ENTRYPOINT["ls","-a”]

 docker run -it centos:2.0 -l

此输出命令则是为 ls -al 则是可以直接追加命令

2.5 tomcat实战

 1.准备tomcat和jdk的压缩包

 2.编写dockerfile 文件 官方命令Docekrfile ,build 会自动寻找这个文件 就不需要 -f了

[root@yunpc ~]# cat Dockerfile 
FROM centos:7
MAINTAINER huawei<jiushiniu@huawei.com>
ENV MYPATH /usr/local 

WORKDIR $MYPATH  ##默认工作路径

ADD  apache-tomcat-10.0.27.tar.gz /usr/local  ##解压tomcat包 并解压到目录
ADD  jdk15.tar.gz /usr/loacl 

ENV JAVA_HOME /usr/local/jdk15             ##添加环境变量
ENV CLASSPATH $JAVA_HOME/lie/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/loacl/apache-tomcat-10.0.27
ENV CATALINA_BASH /usr/loacl/apache-tomcat-10.0.27
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080                            ##暴露8080端口

CMD /usr/loacl/apache-tomcat-10.0.2/bin/startup.sh && tail -F /url/local//usr/loacl/apache-tomcat-10.0.2/bin/logs/cataline.out
##执行命令  可以&&无线叠加命令

3 测试

[root@yunpc ~]# docker run -d -p 9090:8080 --name tomcatceshi -v /root/tomcat/test:/usr/loacl/apache-tomcat-10.0.27/webapps/test -v /root/tomcat/tamcatlogs:/usr/local/apache-tomcat-10.0.27/logs tomcat:1.0

##后台运行 起名字  挂载

4.发布镜像

Dockerhub

[root@yunpc ~]# docker login --help

Usage:  docker login [OPTIONS] [SERVER]

Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.

Options:
  -p, --password string   Password
      --password-stdin    Take the password from stdin
  -u, --username string   Username

##首先注册dockehub账号 使用-u 登录

[root@yunpc ~]# docker push huawei/tomcat:1.0

2.6 小结

三 docker 网络

   3.1 理解网络docker0

[root@yunpc ~]# ip a
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 ##回环地址
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000  ##腾讯云内部地址
    link/ether 52:54:00:94:2b:45 brd ff:ff:ff:ff:ff:ff
    inet 10.0.4.15/22 brd 10.0.7.255 scope global eth0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default ##docker地址
    link/ether 02:42:74:77:40:ac brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

## docker 是如何处理容器网络访问的?

[root@yunpc ~]# docker run -d -P --name tomcat01 tomcat

##运行tomcat  

[root@yunpc ~]# docker exec -it tomcat01 hostname -i
172.17.0.2

##查看容器地址

##linux是否能ping通容器内部地址

[root@yunpc ~]# 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.075 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.049 ms

linux可以ping通容器内部地址

原理:每启动一个docker容器,docker容器都会分配一个ip,我们只要安装了docker,就会有一个网卡docker0。使用的evth-pair技术(evth-pair充当一个桥梁),连接各种网络设备。

3.2 网卡网络拓补图

 即所有的容器都是使用的docker0这一个路由器

[root@yunpc ~]# docker network list  ##查看docker所有网卡
NETWORK ID     NAME      DRIVER    SCOPE
b391e44eb09e   bridge    bridge    local
729ccc4a642b   host      host      local
77bbf460ea01   none      null      local
[root@yunpc ~]# docker network inspect b391e44eb09e  ##docker0网卡详细信息

                    "Gateway": "172.17.0.1"  ##网关地址
               
        "Containers": {
            "edacc7472abaf03c5f854e2786ef5152f2c94f535bd3d027f73a68a324353bf8": {
                "Name": "tomcat01",  ##tomcat01地址
                "EndpointID": "d4c28aec788c3ac6f0a337df82bb328d76cae5e5cd877c2e015685574287531d",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
         
            "fa28497d9bd9e873c89b2a03a391b187b801238a302124731a32dcb3ad6afe67": {
                "Name": "tomcat02", ##tomcat02地址
                "EndpointID": "505e68fee962e90ee2f9c6d086098e622dd584071d64f714c4a34e39db97eb0b",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address":

]

3.3 自定义网络

pc ~]# docker network list  ##查看docker所有网卡
NETWORK ID     NAME      DRIVER    SCOPE
b391e44eb09e   bridge    bridge    local
729ccc4a642b   host      host      local
77bbf460ea01   none      null      local
  •  bridge: 桥接 docker(默认 自己创建最好也用桥接)
  •  none: 不配置网络
  • host: 和宿主机共享网络
  • container: 容器内网络联通

##直接输入启动命令  --net bridge 而这是就是默认的docker0

[root@yunpc ~]# docker run -d -P --name python01 python

##docker0的特点是,默认 域名不能访问  --link可以打通连接(相当于写hosts文件)

[root@yunpc ~]# docker network create --help  ##查看帮助

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network
                             driver (default map[])
      --config-from string   The network from which to copy the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment

## 创建一个自定义的网络

[root@yunpc ~]# docker network create --driver bridge --subnet 8.0.0.0/8 --gateway 8.0.0.1 huawei
cd79b1586e6e0d55b7f2ba83c9479b20d425e4066f91bd791f847f898d92ead3

##工作模式为桥接,分配网段为8.0.0.0/8 网关地址为8.0.0.1  名称为huawei

[root@yunpc ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b391e44eb09e   bridge    bridge    local
729ccc4a642b   host      host      local
cd79b1586e6e   huawei    bridge    local
77bbf460ea01   none      null      local

[

## 测试

[root@yunpc ~]# docker run -dit --name centos01 --net huawei centos
[root@yunpc ~]# docker run -dit --name centos02 --net huawei centos

##指定启动huawei网卡分配


[root@yunpc ~]# docker exec -it centos01 ping centos02
PING centos02 (8.0.0.3) 56(84) bytes of data.
64 bytes from centos02.huawei (8.0.0.3): icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from centos02.huawei (8.0.0.3): icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from centos02.huawei (8.0.0.3): icmp_seq=3 ttl=64 time=0.060 ms

##自定义的网络 是修复docker0缺点的 是可以直接ping容器的名字

##推荐使用自定义使用网络 

不同的集群使用不同的网络,保证集群的健康,且高可用。

3.4 网络连通

##创建容器centos03  使用默认网卡即docker0  
##此时centos01 02 在8段 centos03 在172.17段不互通

[root@yunpc ~]# docker network connect huawei centos03
##连通网卡,centos3和huawei这个网卡连通


[root@yunpc ~]# docker network inspect huawei  
##查看网卡 发现centos03被分配了一个地址
        "Containers": {
                      "Name": "centos03",
                "EndpointID": "191542313d65f80d2e6be46f41ebcdd455e37ec08b99bb0a44a179d872ac4a08",
                "MacAddress": "02:42:08:00:00:04",
                "IPv4Address": "8.0.0.4/8",

}


[root@yunpc ~]# docker exec -it centos03 ip a  ##查看centos03地址
103: eth0@if104: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500  
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
105: eth1@if106: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet 8.0.0.4/8 brd 8.255.255.255 scope global eth1

[root@yunpc ~]# docker exec -it centos02 ping centos03
##测试连通性
PING centos03 (8.0.0.4) 56(84) bytes of data.
64 bytes from centos03.huawei (8.0.0.4): icmp_seq=1 ttl=64 time=0.072 ms


##一个容器 两个ip地址 解决不同网络内容器的连接问题

四 部署redis集群

step1 : 创建一张网卡名为reids

[root@yunpc ~]# docker network create redis --subnet 172.19.0.0/16 --gateway 172.19.0.1

step2: 创建redis集群脚本
 
[root@yunpc redis]# cat /root/redis.sh 
#!/bin/bash
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.19.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

--step3 :创建redis容器 端口映射 挂载卷 指定ip 启动配置文件

[root@yunpc conf]# docker run -d -p 6371:6379 -p 16371:16379 --name redis01 -v /mydata/redis/node-1/data:/data -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf --net redis --ip 172.19.0.11 redis redis-server /etc/redis/redis.conf
314cb775a12758f86d1739b73aa3547ce5c6c409a255532d914ad0e6aa39055a

--step4 : 创建集群

[root@yunpc ~]# cat docker_redis.sh   ##一键部署集群点
#!/bin/bash
for i in $(seq 1 6)
do
docker run -d -p 637${i}:6379 -p 1637${i}:16379 --name redis${i} -v /mydata/redis/node-${i}/data:/data -v /mydata/redis/node-${i}/conf/redis.conf:/etc/redis/redis.conf --net redis --ip 172.19.0.1${i} redis redis-server /etc/redis/redis.conf
done

##进入redis01
root@d45b4719c71d:/data# redis-cli --cluster create 172.19.0.11:6379 172.19.0.13:6379 172.19.0.14:6379 172.19.0.15:6379 172.19.0.16:6379 172.19.0.12:6379 --cluster-replicas 1

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

--step5 : 测试
进入redis1

root@3c4d3fed8012:/data# redis-cli -c
127.0.0.1:6379> CLUSTER nodes
67587dad8f210dc5da6857cf265a5dddb84be5c3 172.19.0.15:6379@16379 slave b7995e7acf2a044729118a41c193709f999255dd 0 1665932508589 3 connected
b7995e7acf2a044729118a41c193709f999255dd 172.19.0.14:6379@16379 master - 0 1665932509000 3 connected 10923-16383
2dfe471cf2b60fd79eb643cd8ab5fb35d30dc8ff 172.19.0.11:6379@16379 myself,master - 0 1665932508000 1 connected 0-5460
d5eb125081886366a13c6c10e236652d56c7e2bc 172.19.0.12:6379@16379 slave 6f251a3ab961c1c24057b2d442c461a1015cc4d2 0 1665932509091 2 connected
6f251a3ab961c1c24057b2d442c461a1015cc4d2 172.19.0.13:6379@16379 master - 0 1665932509592 2 connected 5461-10922
96619c6aea13ec26d3b0b9e1cc704e05662ef7eb 172.19.0.16:6379@16379 slave 2dfe471cf2b60fd79eb643cd8ab5fb35d30dc8ff 0 1665932510094 1 connected
127.0.0.1:6379> set a b ##输入值
-> Redirected to slot [15495] located at 172.19.0.14:6379
OK

##停止redis4 

root@3c4d3fed8012:/data# redis-cli -c
127.0.0.1:6379> get a ## 获取a值 
-> Redirected to slot [15495] located at 172.19.0.15:6379
"b"

##可以获取 所有15是一直的从机 集群则高可用



                                 使用docker之后 所有的集群部署都会变得简单起来

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值