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

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

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的网络配置信息


41.png


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


42.png


这是其他容器,如果启动服务不指定ip会随机分配一个ip,这个ip是docker启动的时候分配的,其实tomcat03就是在本地配置了tomcat02的配置。


43.png


说白了–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


44.png


可以看到我们设置的自定义网络。然后自己通过这个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


45.png


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)网络联通


46.png


docker0和mynet是两个网段不能ping通,我们要把docker0的容器可以连接到mynet而不是把两个网络打通(两个网络打通出问题,整个网络就变了)可以使用下面的命令


docker network connect mynet tomcat01 
打通tomcat01到mynet


47.png


联通之后会把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.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 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 --cluster-replicas 1
然后输入yes就开始创建集群了
查看集群信息
redis-cli -c
cluster info


48.png


三主三从都没问题。


49.png


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


50.png


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


51.png


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

目录
相关文章
|
6月前
|
应用服务中间件 网络安全 nginx
手把手教你使用 Docker 部署 Nginx 教程
本文详解Nginx核心功能与Docker部署优势,涵盖镜像拉取、容器化部署(快速、挂载、Compose)、HTTPS配置及常见问题处理,助力高效搭建稳定Web服务。
2847 4
|
6月前
|
应用服务中间件 Linux nginx
在虚拟机Docker环境下部署Nginx的步骤。
以上就是在Docker环境下部署Nginx的步骤。需要注意,Docker和Nginix都有很多高级用法和细节需要掌握,以上只是一个基础入门级别的教程。如果你想要更深入地学习和使用它们,请参考官方文档或者其他专业书籍。
319 5
|
6月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
2096 8
|
6月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
753 6
|
11月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
6月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
670 25
|
7月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
326 1
Redis专题-实战篇二-商户查询缓存
|
11月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1463 0

热门文章

最新文章