Docker进阶篇-Docker网络

打印 上一主题 下一主题

主题 870|帖子 870|积分 2610

一、描述

1、docker不启动,默认网络情况

查看网卡情况利用,ifconfig大概ip addr
ens33:本机网卡
lo:本机回环网络网卡
virbr0:在CentoS 7的安装过程中如果有选择相关假造化的的服务安装系统后,启动网卡时会发现有一个以网桥毗连的私网所在的virbrO网卡(virbro网卡;它另有一个固定的默认IP所在(192.168.122.1),是做假造机网桥的利用的,其作用是为毗连其上的虚机网卡提供NAT访问外网的功能。
如果不必要可以直接将lbvitd服务卸载:
  1. yum remove libvirt-libs.x86 64
复制代码
2、docker启动,网络情况

利用systemctl start docker启动Docker服务后,会多出一个docker0的假造网桥,默认IP所在为172.17.0.1
当安装Docker后,默认会自动创建三个网络
  1. docker network ls
复制代码

二、docker常用网络命令

1、查看Docker网络模式

  1. docker network ls
复制代码
2、添加Docker网络 

  1. docker network create xxx
复制代码
3、删除Docker网络 

  1. docker network rm xxx
复制代码
4、查看网络源数据 

  1. docker network inspect xxx
复制代码
5、删除全部无效的网络 

  1. docker network prune
复制代码
三、docker网络的作用



  • 容器间的互联和通讯以及端口映射
  • 容器IP变动时间可以通过服务名直接网络通讯而不受到影响
四、docker网络模式

1、总体介绍

网络模式

简介

利用方式
bridge

为每一个容器分配、设置IP等,并将容器毗连到一个docker0
假造网桥,默认为该模式。
--network bridge,默认利用docker0
host

容器将不会假造出自己的网卡、配置自己的IP等,而是利用宿主机的IP和端口。
--network host
none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pari
和网桥毗连、IP等。
--network none
container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
--network container:NAME大概容器ID
2、容器实例内默认网络IP生产规则



  • 新建两个容器,命名为u1、u2
  1. docker run  -it --name u1 ubuntu bash
  2. docker run  -it --name u2 ubuntu bash
复制代码


  • 查看u1网络设置
  1. docker inspect u1 | tail -n 20
复制代码

u1的IP所在为172.17.0.2


  • 查看u2网络设置
  1. docker inspect u2 | tail -n 20
复制代码

u2的IP所在为172.17.0.3


  • 删除u2,生成容器u3,并查看网络设置
  1. docker rm -f u2
  2. docker run  -it --name u3 ubuntu bash
  3. docker inspect u3 | tail -n 20
复制代码

u3的IP所在为172.17.0.3


  • 结论
docker容器内部的IP是有可能会发生改变的。
3、案例说明

3.1 bridge

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


  • 查看 bridge 网络的具体信息,并通过 grep 获取名称项
  1. docker network inspect bridge | grep name
复制代码



  • ifoconfig

3.1.1 说明

1、Docker利用Linux桥接,在宿主机假造一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP所在,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就可以或许通过容器的Container-lP直接通讯。
2、docker run的时间,没有指定network的话默认利用的网桥模式就是bridge,利用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己createnetworketh0,eth1,eth2......代表网卡一,网卡二,网卡三......,lo代表127.0.0.1,即localhostinet addr用来表示网卡的IP所在。
3、网桥docker0创建一对对等假造装备接口一个叫veth,另一个叫eth0,成对匹配。
①整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本田主机和容器内分别创建一个假造接口,并让他们彼此联通(这样一对接口叫veth pair);
②每个容器实例内部也有一块网卡,每个接口叫eth0
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,逐一匹配。
可知,将宿主机上的全部容器都毗连到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。

3.1.2 验证

以tomcat容器为例,创建两个容器实例
  1. docker run -it -d -p 8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
  2. docker run -it -d -p 8082:8080 --name tomcat82 billygoo/tomcat8-jdk8
  3. docker ps
复制代码

查看宿主机IP
  1. ip addr | tail -n 8
复制代码

查看容器tomcat81网络设置
  1. docker exec -it tomcat81 bash
  2. ip addr
复制代码

查看容器tomcat82网络设置 
  1. docker exec -it tomcat82 bash
  2. ip addr
复制代码

3.2 host

3.2.1 说明

直接利用宿主机的 IP 所在与外界进行通讯,不再必要额外进行 NAT 转换。
容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network space。容器将不会假造出自己的网卡,而是直接利用宿主机的IP和端口。

3.2.2 案例 

告诫

当利用了--network host时,-p端口映射将不会生效
  1. docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
  2. docker ps
复制代码

问题:
docke启动时总是遇见标题中的告诫缘故原由
docker启动时指定--network=host-net=host,如果还指定了-p映射端口,那这个时间就会有此告诫并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
办理:
办理的办法就是利用docker的其他网络模式,例如--network=bridge大概不利用-p进行端口映射,这样就可以办理问题。
精确利用

  1. docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
  2. docker ps
复制代码

查看容器内部网络情况
  1. docker inspect tomcat83 | tail -n 20
复制代码

可知利用的是host模式,没有网关IP所在
  1. docker exec -it tomcat83 bash
  2. ip add
复制代码

可知没有之前的配对显示,和宿主机网络一样 
没有设置-p端口映射,如何访问tomcat83?
访问方式:宿主机IP所在:8080
当有多个tomcat容器利用host模式,端口号依次递增,如8080、8081、8082......

如果运行了tomcat84利用host模式
访问方式:访问方式:宿主机IP所在:8081
  1. docker run -d --network host --name tomcat84 billygoo/tomcat8-jdk8
复制代码

3.2.3 总结

host模式容器共享宿主机网络IP,这样的利益是外部主机与容器可以直接通讯。
3.3 none

3.3.1 说明

none模式下,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(当地回环所在 127.0.0.1),必要手动为Docker容器添加网卡、配置IP等。
3.3.2 案例

新建tomcat84
  1. docker run -d -p 8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8
  2. docker ps
复制代码

 查看tomcat84网络信息
  1. docker inspect tomcat84 | tail -n 20
复制代码

可知,none模式,没有网关IP所在
进入tomcat84内部查看网络信息
  1. docker exec -it tomcat84 bash
  2. ip addr
复制代码

可知,只有网卡lo 
3.4 container

3.4.1 说明


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

3.4.2 案例

利用tomcat做案例不符合,因为公用同一个IP和同一个端口,导致端口冲突。
这里利用Alpine做演示。Apine Linux 是一款独立的、非商业的通用 Linux 发行版,专为追求安全性、简朴性和资源效率的用户而设计。 可能许多人没听说过过个 Linux 发行版本,但是常常用 Docker 的朋友可能都用过,因为他小,简朴,安全而著称,以是作为底子镜像黑白常好的一个选择,可谓是麻雀虽小但五脏俱全,镜像非常小巧,不到6M的巨细,以是特殊得当容器打包。


  • 运行容器镜像
当地没有镜像会自动拉取
  1. docker run -it --name alpine1 alpine /bin/sh
  2. # 指定和 alpine1 容器共享网络
  3. docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
复制代码


  • 验证
查看alpine1网络情况
  1. docker ps
复制代码

查看alpine2网络情况 
  1. docker ps
复制代码



  • 关闭alpine1,查看alpine2
关闭alpine1容器

 查看alpine2容器

可知关闭alpine1,alpine2只剩下回环所在
3.5 自定义网络

3.5.1 说明

实现通过服务名进行网络通讯,而不只是通过IP进行网络通讯。
3.5.2 案例



  • 查看目前网络列表
  1. docker network ls
复制代码



  •  新建自定义网络
  1. docker network create fanhe_network
  2. docker network ls
复制代码



  • 创建容器指定加入自定义网络
  1. docker run -d -p 8081:8080 --network fanhe_network --name tomcat81 billygoo/tomcat8-jdk8
  2. docker run -d -p 8082:8080 --network fanhe_network --name tomcat82 billygoo/tomcat8-jdk8
  3. docker ps
复制代码



  • 查看容器网络信息
查看tomcat81网络信息
  1. docker exec -it tomcat81 bash
  2. ip addr
复制代码

查看tomcat82网络信息 
  1. docker exec -it tomcat82 bash
  2. ip addr
复制代码



  • tomcat81与tomcat82通过IP所在互相验证网络连通性
tomcat81  ping  tomcat82
  1. ping 172.21.0.3 -c 4
复制代码

tomcat82  ping  tomcat81
  1. ping 172.21.0.2 -c 4
复制代码



  • tomcat81与tomcat82通过服务名互相验证网络连通性 
tomcat81  ping  tomcat82
  1. ping tomcat82 -c 4
复制代码

tomcat82  ping  tomcat81
  1. ping tomcat81 -c 4
复制代码



  • 结论 
自定义网络本身就维护好了主机名和IP的对应关系。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表