当前位置:   article > 正文

(十一) Docker network_docker查看容器对应的网络名称

docker查看容器对应的网络名称

前言

Linux的命令 ip addr

[root@Feng ~]# ip addr
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
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:06:78:3a brd ff:ff:ff:ff:ff:ff
    inet 172.21.129.9/20 brd 172.21.143.255 scope global dynamic eth0
       valid_lft 279126205sec preferred_lft 279126205sec
    inet6 fe80::216:3eff:fe06:783a/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:e3:f9:98:81 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:e3ff:fef9:9881/64 scope link 
       valid_lft forever preferred_lft forever
8: br-ac0fd4ae03e7: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:13:fa:43:42 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-ac0fd4ae03e7
       valid_lft forever preferred_lft forever

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

这个命令显示了这台机器上所有的网卡信息。网卡都会有一个 IP 地址(也会不存在)

lo

网卡参数<>:
	LOOPBACK, 回环,指将电子信号、数据流等原样送回发送者的行为,它主要用于对通信功能的测试 。
	UP,表示网卡处于启动的状态。
	LOWER_UP物理连接正常,就是网卡已经上电(物理指的是物理层)。
mtu 65536: 最大传输单元MTU为65536,这是以太网的默认值。
qdist noqueue: 排队规则为noqueue。内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的排队规则把数据包加入队列,noqueue表示无队列。
state UNKNOWN: 网络接口状态未知。
group default: 接口组为默认的。
qlen 1: 传输队列长度为1。
link/loopback: 接口的 MAC(硬件)地址是`00:00:00:00:00:00`。
brd: 广播地址`00:00:00:00:00:00`。
inet: 是IPV4的地址,scop host lo:本主机环回有效。
valid_lft forever: IPv4 地址的有效使用期限为无限
preferred_lft forever: IPv4 地址的首选生存期为无限
inet6: IPV6的地址,scop host本机有效。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

eth0

宿主机网卡
BROADCAST: 表示这个网卡有广播地址,可以发送广播包
MULTICAST: 表示网卡可以发送多播包。
qdist  pfifo_fast: pfifo_fast规则的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。  
state UP: 网络接口已启用。
link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff  MAC地址,是一个网卡的物理地址。
scope global: 全局有效。
scop link: 仅在此设备上有效。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

一、概述

1.1、简介

Docker启动后,服务器网络会多一个 docker0 的虚拟网桥(就是通过这个来进行与主机或者其他容器进行网络通信的连接,理解为交换机,类似于将一台主机通过网线接入到物理交换机。当接收到数据时,Bridge 就会根据数据帧中的 MAC 地址进行广播、转发或过滤处理 )

在这里插入图片描述
lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址

在这里插入图片描述

1.2、常用基本命令

在这里插入图片描述

查看docker网络模式命令

默认创建3大网络模式

docker network ls
  • 1

在这里插入图片描述

创建网络

docker network create XXX网络名字
  • 1

查看网络的详细信息

docker network inspect  XXX网络名字
  • 1

删除无法使用的网络

docker network prune
  • 1

删除网络

docker network rm XXX网络名字
  • 1

在这里插入图片描述

1.2、作用

因为在之前都是在单机的Docker上的,实际工作中肯定会有很多个Docker实例。还可能在不同的服务器上,肯定需要对Docker之间的通信进行管理。所以需要Docker网络的设置

  • 容器间的互联和通信以及端口映射
  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响(因为容器的IP可能会变动,比如重启重新分配IP,然后通过服务名就不会发生变动)

二、网络模式

2.1、四种模式介绍

在这里插入图片描述

  • bridge模式:使用 --network bridge 指定,默认使用 docker0
  • host模式:使用 --network host 指定
  • none模式:使用 --network none 指定
  • container模式:使用–network container:NAME或者容器ID指定

2.2、容器实例内默认网络IP生产规则

  1. 先启动两个ubuntu容器实例

    在这里插入图片描述

  2. 查看这两个实例的详细情况
    使用 docker inspect 命令查看实例信息,最后的有网络情况
    U1的是172.17.0.2
    在这里插入图片描述
    U2的是172.17.0.3
    在这里插入图片描述

  3. 关闭u2实例,新建u3,查看ip变化

    发现这个172.17.0.3分配给U3了

    在这里插入图片描述

结论:显然容器的内部的ip是有可能会发生改变的,这是很危险的,因为服务IP的变化很有可能在原有IP的请求会失效,这是不可取的

三、模式说明

1、bridge

概念

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信

在这里插入图片描述

  1. Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
  2. docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network,eth0,eth1,eth2……代表网卡一,网卡二,网卡三……
  3. 网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
    • 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
    • 每个容器实例内部也有一块网卡,每个接口叫eth0;
    • docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

docker0和宿主机的eth0是桥接的关系,而上面的容器实例与docker0是相当于同一网关的不同路由,也就是同一网段,理解docker0是交换机就行,做虚拟网桥的作用,将不同实例在同一网关下可以相互通信

实践说明

在上述的理论中,因为docker0做交换机桥接的作用,而每一个实例的eth0都会有一个veth一一匹配,也就是按照这种理论,每一个实例运行后其网卡都可以在宿主机进行一一匹配

运行两个实例

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8
  • 1
  • 2

在这里插入图片描述
将宿主机的网卡情况与实例的进行对比展示,发现对应上了

在这里插入图片描述

bridge在不暴露端口的情况下,那么就是使用路由方式,在通过docker0网桥。使得宿主机和docker容器网络中的容器进行通信
bridge模式在暴露端口的情况下,那么就是使用路由+nat(网络地址转换) 的方式,在通过docker0网桥,使得宿主机的端口和docker容器网络中的容器暴露的端口进行映射。

2、host

概述

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口

在这里插入图片描述

运行测试

docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
  • 1

会有警告

在这里插入图片描述

上述警告原因

docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,
  • 1

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。也就是他会直接使用宿主机的端口,设置端口映射会失效,也就是直接使用默认启动端口,假设多个,他就会让端口递增,比如第一个tomcat是8080,第二个就是8081,所以在使用host模式的时候不需要指定端口映射

在这里插入图片描述

查看实例信息,发现没有网关以及IP,因为使用的是宿主机的、

在这里插入图片描述

宿主机的网卡信息与实例内部的是一样的

宿主机

在这里插入图片描述
实例

在这里插入图片描述

3、none

概述

在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(回环地址也急就是127.0.0.1)
需要我们自己为Docker容器添加网卡、配置IP等。

禁用网络功能

实践测试

docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
  • 1

实例内部

在这里插入图片描述

外部查看实例信息

在这里插入图片描述

4、container

概述

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的,也就是只有网络配置共享

在这里插入图片描述

Tomcat 镜像测试会报错i,因为两个实例公用同一个ip以及端口,会造成端口冲突

docker run -d -p 8085:8080                                     --name tomcat85 billygoo/tomcat8-jdk8

docker run -d -p 8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8
  • 1
  • 2
  • 3

错误结果

在这里插入图片描述

使用 Alpine 进镜像测试

Alpine操作系统是一个面向安全的轻型 Linux发行版,这个就不会有端口的冲突

docker run -it                                                    --name alpine1  alpine /bin/sh

docker run -it --network container:alpine1 --name alpine2  alpine /bin/sh
  • 1
  • 2
  • 3

在这里插入图片描述

进入容器查看网卡信息

两者网络配置是一样的

在这里插入图片描述

假设先存在的容器挂了,那剩下的这个 alpine2 会怎样

在这里插入图片描述

发现alpine2的原有共享网卡没有了

在这里插入图片描述

假设停掉 apline2 会怎么样

在这里插入图片描述
停掉共享的是不会影响原有被共享的

在这里插入图片描述

5、自定义网络

1、概念

其实就是自定义的bridge网络

2、没有自定义网络时

启动两个实例

docker run -d -p 8081:8080   --name tomcat81 billygoo/tomcat8-jdk8

docker run -d -p 8082:8080   --name tomcat82 billygoo/tomcat8-jdk8
  • 1
  • 2
  • 3

在这里插入图片描述
上述成功启动并用docker exec进入各自容器实例内部

按照IP地址ping是可以的
在这里插入图片描述

按照服务名ping结果

是失败的

在这里插入图片描述

因为容器实例的ip是会变化的,所以根据IP来进行通信显然是不可取的,所以就需要用自定义网络实现通过容器名通信

3、自定义网络

自定义桥接网络,自定义网络默认使用的是桥接网络bridge

新建自定义网络

docker network create tomcat_network
  • 1

查看网络列表

docker network ls
  • 1

在这里插入图片描述

新建容器加入上一步新建的自定义网络

# 删除原有的 81,82 再重新启动
#命令实现停用还有删除容器
docker stop $(docker ps -q)

docker rm $(docker ps -aq)

docker run -d  --network tomcat_network --name tomcat81 billygoo/tomcat8-jdk8


docker run -d --network tomcat_network --name tomcat82 billygoo/tomcat8-jdk8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

此时进入tomcat81中,使用ping命令测试连接tomcat82容器名,发现可以正常连通

在这里插入图片描述

4、Link

原来用的是 docker link ,但是这个过时了,所以不多探究,示例如下

# 启动一台mysql容器
# --name 为容器指定一个别名
docker run --name mysql-matomo -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:8.0.28

# 启动另一个容器,通过--link连接到mysql容器
# --link 容器名称:本容器连接对方时的别名
docker run -d -p 8888:80 --link mysql-matomo:db --name matomo matomo:4.9.0

# 此时,在matomo容器中,便可以通过 db 这个hostname连接到mysql-matomo容器,而无须再通过ip
# 连接地址:db:3306
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5、自定义bridge网络与默认bridge网络之间的区别

默认bridge网络自定义bridge网络
连通性相互之间需要通过-p或者–publish选项指明开放的端口,即使是两个容器连接在相同的默认bridge网络之上不需要-p与–publish选项,相互之间的端口全部开放
域名解析默认网桥上的容器只能通过IP地址相互访问,使用名称通信时需要指定–link选项,这种方式已过时并且不容易调试无需特别指定选项,可直接通过名称与别名通信
热插拔需要停止容器的执行并重新创建容器才能离开或者加入默认bridge网络,因为容器的改变会影响其他容器实例支持随时加入与离开某个用户自定义bridge网络,它是不影响的
灵活性系统中只能存在一个默认网络,牵一发而动全身可定义多个用户自定义网络,每个可单独配置
共享环境变量不支持通过–link选项的方式共享环境变量,更高级的共享环境变量的方式:data volume、docker-compose、docker-configs。支持通过–link选项的方式共享环境变量
  • 用户定义的桥接器可在容器化应用程序之间提供更好的隔离和互操作性。
  • 用户定义的桥接器在容器之间提供自动DNS解析。
  • 容器可以在运行中与用户定义的网络连接和分离。
  • 每个用户定义的网络都会创建一个可配置的网桥。
  • 默认桥接网络上的链接容器共享环境变量。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/120036?site
推荐阅读
相关标签
  

闽ICP备14008679号