理解docker0

1.lo 本机回环地址

2.ens33 服务器内网地址

3.docker0 地址

三个网络

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

docker run -d -P --name tomcat01 tomcat# 查看容器的内部网络地址 ip addr
docker exec -it tomcat01 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever# 思考,Linux 能不能ping通容器内部
# 容器与容器之间能不能互ping?

原理

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

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

再次测试ip addr

2.在启动一个容器测试,发现又多一对网卡

我们发现这个容器带来网卡,都是一对一对的
evth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的
openstac,Docker容器之间的连接,ovs的连接,都是使用,evth-pair 技术

3.测试一下容器之间是否能ping通

docker exec -it tomcat01 ping 172.17.0.3# 结论容器与容器之间是可以相互ping通的


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

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

255.255.0.1/16 域 局域网

00000000.00000000.00000000.00000000

255.255.0.0 255 * 255 - 65000

小结

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


Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!

只要容器删除,对应的网桥一对就没了!

容器互联 --link

docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
eabb6bc29294        tomcat              "catalina.sh run"   5 seconds ago       Up 5 seconds        0.0.0.0:32771->8080/tcp   tomcat02
962f961aa9ff        tomcat              "catalina.sh run"   33 seconds ago      Up 33 seconds       0.0.0.0:32770->8080/tcp   tomcat01
docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known# 如何可以解决名字相互能ping通
docker run -d -P --name tomcat03 --link tomcat02 tomcat
1e7d9cb504518d2232a019d46b6b8903e523a3afea00cff9015999c589b95de3# 通过--link 即可解决网络通连问题
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.060 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.039 ms# 反向可以ping通吗?# 说白了就是hosts映射

本质探究:–link 就是我们在hosts配置中增加了 一个主机名

我们现在玩docker已经不建议使用–link 了

docker0问题:它不支持容器名连接访问!

自定义网络

查看所有的docker网络

网络模式
bridge : 桥接 docker (默认,自己创建也使用bridge 模式)

none : 不配置网络

host : 和宿主机共享网络

container : 容器内网络连通
测试

# 我们直接启动的命令  --net bridge tomcat ,而这个就是我们的docker0docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat# docker0 特点: 默认,域名不能访问,  --link可以打通连接!# 我们可以自定义一个网络
--driver bridge
--subnet 192.168.0.0/16
--gateway 192.168.0.1 mynet
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet


我们自己的网络就创建好了

docker network inspect mynet
[{"Name": "mynet","Id": "da26f6e9e4b1e933e3fff1a4b15a237a84d2bb0b10ac90373fcf924ca00a831b","Created": "2020-11-22T21:54:57.105303537+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": {"1bfb6fde84692e8dcda970d7d33b50a134cce0eb6a6249b8f9347f8220b60405": {"Name": "tomcat-net-02","EndpointID": "9878c14469536135c2b99eef2e04b289f92a6c0fdf4aa6e057e0d719f9051c5b","MacAddress": "02:42:c0:a8:00:03","IPv4Address": "192.168.0.3/16","IPv6Address": ""},"d4254187aad62f77f5b0173e9f5e865072520885d46da15d28825334c25776ab": {"Name": "tomcat-net-01","EndpointID": "e50724082235d4436330ad1f26a051f5e03389f62950b717eea7db88f46f48f3","MacAddress": "02:42:c0:a8:00:02","IPv4Address": "192.168.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]# 再次测试ping连接
docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.101 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.039 ms# 现在不使用  --link也可以相互ping通了
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.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.041 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.041 ms

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!

好处:

​ 不同的集群使用不同的网络,保证集群是安全和健康的

网络连通



# 测试打通 tomcat01 - mynet
docker network connect mynet tomcat01
docker network inspect mynet# 连通之后就是将 tomcat01 放到了 mynet 网络下# 官方解释就是一个容器两个ip
# 阿里云服务器, 公网ip  私网ip

# 测试 01 连接ok
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.075 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.042 ms# 02 是依旧打不通的
docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

结论:假设要跨网操作,就需要需要docker network connect 连通 !

实战:部署Redis集群

# 创建网卡
docker network create redis --subnet 172.38.0.0/16docker network create redis --subnet 172.38.0.0/16
04ddb12d919d0b032a25fe3d1532b2faacba48f9cabaf1a9f4fa0a44ff1d0a38
[root@localhost ~]# docker network inspect redis
[{"Name": "redis","Id": "04ddb12d919d0b032a25fe3d1532b2faacba48f9cabaf1a9f4fa0a44ff1d0a38","Created": "2020-11-22T22:37:40.864981122+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.38.0.0/16"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {},"Options": {},"Labels": {}}
]

(redis配置文件挂载目录+运行脚本)

vim 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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOFdocker run -p 637${port}:6379 -p1637${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
done

创建集群

docker exec -it redis-1 /bin/sh
/data # ls
appendonly.aof  nodes.confredis-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

redis-cli -c
cluster nodes


测试停掉172.38.0.13

docker stop redis-3


如果高可用替代成功了,从机就会自动替代主机

redis-cli -c
get a


docker搭建redis集群完成

Docker网络 docker network相关推荐

  1. Docker网络 - docker network详解

    目录 是什么 一.Docker不启动时默认的网络情况 二.Docker启动时的网络情况 能干什么 常用基本命令 一.ls 1.--no-trunc 2.DRIVER 3.ID 4.format 二.c ...

  2. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  3. Docker网络相关

    Docker中网络功能相关Docker是允许通过外部访问容器或者容器互联的方式来提供网络服务.外部访问容器:通过-P或者-p参数指定端口映射,-P是随机:-p是指定.-P : Docker会随机映射一 ...

  4. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  5. Docker学习(五):Docker网络

    Docker网络 1. docker network命令 #查看docker网络 docker network ls #帮助命令 docker network --help #创建网络 docker ...

  6. 【k8s】docker网络模式(必知)

    docker网络部分的视频我看了很多,讲解最透彻的还是https://www.bilibili.com/video/BV123411y7TB?p=8 获取本文方式:见谷粒商城文尾,备注[docker网 ...

  7. Docker网络和存储管理

    Docker网络 Docker中的网络主要解决容器与容器.容器与外部网络.外部网络与容器之间的互相通信的问题. Docker的通信方式 在默认的情况下,Docker使用网桥bridge+NAT的通信模 ...

  8. docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]

    docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...

  9. Docker基础------安装docker,以及一些常用的docker命令,docker网络,自定义docker网络

    centos安装docker 1.卸载旧版的docker yum remove docker \docker-client \docker-client-latest \docker-common \ ...

最新文章

  1. 为什么不建议使用 Java 自带的序列化?
  2. 使用Let`s encrypt 免费的https 证书
  3. linux操作系统项目化教程课后答案,完整版Linux操作系统及应用项目教程习题答案(13页)-原创力文档...
  4. boost::replace_if相关的测试程序
  5. oracle易忘函数用法(2)
  6. tomcat 设置java内存_Tomcat 设置JVM内存大小
  7. 2021高考成绩查询。,2021高考成绩公布时间 2021高考成绩查询方式
  8. 异常Exception(Java)
  9. 联想集团杨元庆:联想携手SAP解决用户云计算应用痛点
  10. 通过有向图的可达矩阵判断有向图的连通类型
  11. win7无法打开计算机共享文件夹,win7共享文件夹怎么设置?win7共享文件夹无法访问...
  12. 在 Flutter 中创建响应式表单
  13. 2022最新版40个前端练手项目【附视频+源码】
  14. 生成自己的浏览器证书
  15. css:层叠样式表(全)
  16. CoreDNS 性能优化
  17. 搜狐首页出现一个硕大的错别字
  18. edge浏览器如何把网页放到桌面_win10edge怎么放在桌面
  19. 利用QQ昵称作为软件版本号
  20. 接触角及接触角值的可重复性如何?

热门文章

  1. 云+小游戏,会成为5G时代的抖音吗?​
  2. 安卓开发者必看:Android的数据结构与算法——ArrayList源码解析
  3. 扬州大学广陵学院计算机科学与技术女生多吗,超激动!萌新们纷纷晒出与扬大录取通知书合照...
  4. 做7秒动画赢13W大奖?总奖池超80W、国内最火爆的3D渲染动画创作大赛开始报名!
  5. Python网络与并发编程 10 threading模块线程锁
  6. [Android] Android 6.0 动态权限申请看完就会写
  7. SpringBoot + Spring Cloud +Vue 管理系统后台搭建(七、业务代码通用CURD实现)
  8. 抖音商务团队三面java_腾讯抖音iOS岗位三面面经
  9. 微软通杀漏洞-CVE-2021-1675复现
  10. usb host 驱动 - UVC 掉包