赞
踩
前言
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
这个命令显示了这台机器上所有的网卡信息。网卡都会有一个 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本机有效。
宿主机网卡
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: 仅在此设备上有效。
在Docker启动后,服务器网络会多一个 docker0
的虚拟网桥(就是通过这个来进行与主机或者其他容器进行网络通信的连接,理解为交换机,类似于将一台主机通过网线接入到物理交换机。当接收到数据时,Bridge 就会根据数据帧中的 MAC 地址进行广播、转发或过滤处理 )
lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址
查看docker网络模式命令
默认创建3大网络模式
docker network ls
创建网络
docker network create XXX网络名字
查看网络的详细信息
docker network inspect XXX网络名字
删除无法使用的网络
docker network prune
删除网络
docker network rm XXX网络名字
因为在之前都是在单机的Docker上的,实际工作中肯定会有很多个Docker实例。还可能在不同的服务器上,肯定需要对Docker之间的通信进行管理。所以需要Docker网络的设置
bridge
模式:使用 --network bridge 指定,默认使用 docker0host
模式:使用 --network host 指定none
模式:使用 --network none 指定container
模式:使用–network container:NAME或者容器ID指定先启动两个ubuntu容器实例
查看这两个实例的详细情况
使用 docker inspect
命令查看实例信息,最后的有网络情况
U1的是172.17.0.2
U2的是172.17.0.3
关闭u2实例,新建u3,查看ip变化
发现这个172.17.0.3分配给U3了
结论:显然容器的内部的ip是有可能会发生改变的,这是很危险的,因为服务IP的变化很有可能在原有IP的请求会失效,这是不可取的
概念
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信
通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的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
将宿主机的网卡情况与实例的进行对比展示,发现对应上了
bridge在不暴露端口的情况下,那么就是使用路由方式,在通过docker0网桥。使得宿主机和docker容器网络中的容器进行通信
bridge模式在暴露端口的情况下,那么就是使用路由+nat(网络地址转换) 的方式,在通过docker0网桥,使得宿主机的端口和docker容器网络中的容器暴露的端口进行映射。
概述
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。
容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
运行测试
docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
会有警告
上述警告原因
docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,
并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。也就是他会直接使用宿主机的端口,设置端口映射会失效,也就是直接使用默认启动端口,假设多个,他就会让端口递增,比如第一个tomcat是8080,第二个就是8081,所以在使用host模式的时候不需要指定端口映射
查看实例信息,发现没有网关以及IP,因为使用的是宿主机的、
宿主机的网卡信息与实例内部的是一样的
宿主机
实例
概述
在none模式下,并不为Docker容器进行任何网络配置。
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(回环地址也急就是127.0.0.1)
需要我们自己为Docker容器添加网卡、配置IP等。
禁用网络功能
实践测试
docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
实例内部
外部查看实例信息
概述
新建的容器和已经存在的一个容器共享一个网络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
错误结果
使用 Alpine 进镜像测试
Alpine操作系统是一个面向安全的轻型 Linux发行版,这个就不会有端口的冲突
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
进入容器查看网卡信息
两者网络配置是一样的
假设先存在的容器挂了,那剩下的这个 alpine2 会怎样
发现alpine2的原有共享网卡没有了
假设停掉 apline2 会怎么样
停掉共享的是不会影响原有被共享的
其实就是自定义的bridge网络
启动两个实例
docker run -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
上述成功启动并用docker exec进入各自容器实例内部
按照IP地址ping是可以的
按照服务名ping结果
是失败的
因为容器实例的ip是会变化的,所以根据IP来进行通信显然是不可取的,所以就需要用自定义网络实现通过容器名通信
自定义桥接网络,自定义网络默认使用的是桥接网络bridge
新建自定义网络
docker network create tomcat_network
查看网络列表
docker network ls
新建容器加入上一步新建的自定义网络
# 删除原有的 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
此时进入tomcat81中,使用ping命令测试连接tomcat82容器名,发现可以正常连通
原来用的是 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
默认bridge网络 | 自定义bridge网络 | |
---|---|---|
连通性 | 相互之间需要通过-p或者–publish选项指明开放的端口,即使是两个容器连接在相同的默认bridge网络之上 | 不需要-p与–publish选项,相互之间的端口全部开放 |
域名解析 | 默认网桥上的容器只能通过IP地址相互访问,使用名称通信时需要指定–link选项,这种方式已过时并且不容易调试 | 无需特别指定选项,可直接通过名称与别名通信 |
热插拔 | 需要停止容器的执行并重新创建容器才能离开或者加入默认bridge网络,因为容器的改变会影响其他容器实例 | 支持随时加入与离开某个用户自定义bridge网络,它是不影响的 |
灵活性 | 系统中只能存在一个默认网络,牵一发而动全身 | 可定义多个用户自定义网络,每个可单独配置 |
共享环境变量 | 不支持通过–link选项的方式共享环境变量,更高级的共享环境变量的方式:data volume、docker-compose、docker-configs。 | 支持通过–link选项的方式共享环境变量 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。