docker - [13] docker网络

smo smo smo "狂神" omz omz omz

 

一、理解网络

本机回环地址:127.0.0.1本机IP地址:192.168.2.131docker地址:172.17.0.1

 

 

1.1、docker如何处理容器网络访问的?

(1)首先,拉取一个tomcat镜像(我直接从之前制作的tomcat镜像拉取下来了)

(2)拉取之后修改了一下名字:docker tag <imageId> tomcat:1.0

(3)之后把名称特别长那个tomcat镜像删掉:docker rmi -f registry.cn-shanghai.aliyuncs.com/harleyhub/harleyrepo:1.0

(4)查看镜像:docker images

(5)然后启动镜像:docker run -d -P --name tomcat01 tomcat1.0

启动tomcat容器并查看ip addr的执行结果:docker exec -it tomcat01 ip addr

可能会遇到ip addr命令不存在的情况,可以问一下文心、通义、混元和豆包它们。

测试一下容器内的ip是否可以ping通

每启动一个容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术!在宿主机(容器外)再次执行ip addr,发现会多出一个网卡:vethefdc19@if40

再启动一个容器

 

1.2、veth-pair 技术原理

  veth-pair(Virtual Ethernet Pair)是一种在Linux系统中实现的虚拟网络设备对技术,主要用于在不同网络命名空间(network namespace)之间建立通信连接。以下是veth-pair技术的关键特点和工作原理:

  成对出现:veth-pair由两个虚拟网络接口组成,这两个接口如同一对虚拟以太网线连接的两端。数据包从一端发送后,会出现在另一端,反之亦然。

  命名空间间的桥梁:veth-pair常用于隔离网络环境的场景,如Docker容器、Linux网络命名空间等。它可以将一个命名空间中的网络流量导向另一个命名空间,使得不同命名空间内的进程可以通过虚拟链路相互通信,而不会影响到宿主机或其他命名空间的网络配置。

  内核层面的转发:当数据包被发送到veth-pair的一端时,它会通过内核的网络栈,然后从配对的另一端出来,这个过程实现了命名空间之间的透明通信,如同物理连接一样。

  配置灵活性:veth-pair设备可以独立配置IP地址、路由规则等,就像物理网络接口一样。此外,它们可以被添加到Linux网桥、与物理网络接口一同参与复杂的网络拓扑构建。

  与网络命名空间结合使用:通过ip netns命令,veth-pair可以被分配到特定的网络命名空间中,从而实现网络资源的灵活隔离和管理。

  原理简述:veth-pair基于Linux内核的网络栈工作,利用内核的网络协议处理能力来传递数据包。数据从一端注入时,内核会根据目的MAC地址和IP配置,将数据包正确地路由到另一端,反之亦然,实际上是在内核层面完成了数据包的转发。

  总之,veth-pair是实现容器网络、虚拟机网络以及其他需要网络隔离场景下的关键技术之一,它提供了简单而强大的机制来构造和控制复杂的虚拟网络拓扑。

 

 

1.3、容器之间是否可以ping通

tomcat01的ip(172.17.0.2):docker exec -ti tomcat01 ip addr

tomcat02的ip(172.17.0.3):docker exec -ti tomcat02 ip addr

进行测试:docker exec -ti tomcat01 ping 172.17.0.2

 

Q:255.255.0.1/16 能用多少个IP

Q:255.255.0.1/24呢

 

 

 

二、docker link

注意:目前已经不建议使用这种方式。

两个容器无法通过容器名进行ping......如何处理?

再次启动一个容器:docker run -d -P --name tomcat03 --link tomcat02 tomcat:1.0,测试tomcat02可以ping通tomcat01 

但是tomcat01无法ping通tomcat02,这种link方式是单向的。

查看容器inspect,拿到network的ID,使用docker network inspect networkId

执行结果如下

执行link之后,会修改hosts文件,所以可以ping通

 

 

 

三、自定义网络

容器互联

 

查看所有的docker网络:docker network ls

 

3.1、网络模式

  • bridge(桥接模式,docker默认)
  • none(不配置网络)
  • host(和宿主机共享网络)
  • container(容器网络连通,局限大,用的较少)

 

测试

# 启动容器的命令,隐藏掉了--net bridge
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

docker0特点
1.默认的网络模式
2.域名不能访问
3.使用--link才能打通连接

 

3.2、自定义网络

用来解决容器互联问题

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

--driver:桥接模式,--subnet:子网地址,--gateway:网关(路由器的地址)

使用桥接的网络模式,设置子网地址和网关,用该网络启动容器,可以通过容器名互相ping通

 

 

开始测试


1.使用网络mynet启动tomcat01tomcat02

2.测试tomcat01tomcat02的网络通信情况

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

redis、mysql

 

3.3、网络连通测试

场景:使用docker0启动两个tomcat容器,然后使用mynet启动两个tomcat容器,测试网络连通情况。

(1)启动容器

(2)查看以docker0启动的两个容器的IP

(3)查看以mynet启动的两个容器的IP

(4)四个容器的IP如下

  • docker0
    • tomcat01:172.17.0.2
    • tomcat02:172.17.0.3
  • mynet
    • tomcat-net-01:192.168.0.2
    • tomcat-net-02:192.168.0.3

(5)网络拓扑图

tomcat01如何和mynet连通?

(6)使用docker network connect

(7)测试网络连通

(8)执行ip addr查看tomcat01的网络信息如下

tomcat01会多一个虚拟网卡,分配一个mynet的IP:198.168.0.4

 

 

— 要养成终身学习的习惯 —

posted @ 2024-05-07 16:17  HOUHUILIN  阅读(10)  评论(0编辑  收藏  举报