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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 如何用名字而不用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了。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
13
分享
相关文章
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
250 91
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
云原生应用实战:基于阿里云Serverless的API服务开发与部署
随着云计算的发展,Serverless架构日益流行。阿里云函数计算(Function Compute)作为Serverless服务,让开发者无需管理服务器即可运行代码,按需付费,简化开发运维流程。本文从零开始,介绍如何使用阿里云函数计算开发简单的API服务,并探讨其核心优势与最佳实践。通过Python示例,演示创建、部署及优化API的过程,涵盖环境准备、代码实现、性能优化和安全管理等内容,帮助读者快速上手Serverless开发。
|
1月前
|
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
85 20
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
222 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
云原生AI加速生成式人工智能应用的部署构建
本文探讨了云原生技术背景下,尤其是Kubernetes和容器技术的发展,对模型推理服务带来的挑战与优化策略。文中详细介绍了Knative的弹性扩展机制,包括HPA和CronHPA,以及针对传统弹性扩展“滞后”问题提出的AHPA(高级弹性预测)。此外,文章重点介绍了Fluid项目,它通过分布式缓存优化了模型加载的I/O操作,显著缩短了推理服务的冷启动时间,特别是在处理大规模并发请求时表现出色。通过实际案例,展示了Fluid在vLLM和Qwen模型推理中的应用效果,证明了其在提高模型推理效率和响应速度方面的优势。
云原生AI加速生成式人工智能应用的部署构建
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
231 26
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
129 8
如何监控Docker Swarm集群的性能?
如何监控Docker Swarm集群的性能?
206 8
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
331 7

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等