• docker系列(8) - docker网络


    8. docker网络

    8.1 四种网络模式

    网络模式说明
    bridge为每一个容器分配、设置IP等,并将容器连接到一个dockr0。 虚拟网桥,默认为该模式
    host容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
    none容器有独立的network namespace,但并没有设置网络。
    container一个容器借用另一个容器的网络,即两个容器公用一个网络

    8.2 常用命令

    命令说明
    docker network ls查看当前所有的网络
    docker inspect t1|tail -n 20查看name为t1的容器的网络(只需要查看前20行就可以了)

    命令操作:

    docker network ls
    
    • 1

    在这里插入图片描述

    docker network inspect bridge
    
    • 1
    • 桥接模式的网络,会自动分配一个网关为172.17.0.1,然后指定网段范围为172.17.0.0/16
      在这里插入图片描述

    对于xxx.xxx.xxx.xxx/16或者xxx.xxx.xxx.xxx/24。那么这个斜杠后面的数字代表什么意思呢?
    实际上,IPv4地址是由32位二进制数组成的。以192.168.0.0/16为例,它的二进制表示是11000000.10101000.00000000.00000000。
    /16表示前16位是网络地址,后16位是主机地址,即从11000000.10101000.00000000.00000000到11000000.10101000.11111111.11111111,
    所表示的IP地址范围是从192.168.0.0到192.168.255.255,其中最后一个地址为广播地址,因此可用IP地址数量为65534。
    如果是/24,它表示前24位是网络地址,后8位是主机地址。
    例如,192.168.0.0/24表示的IP地址范围是从11000000.10101000.00000000.00000000到11000000.10101000.00000000.11111111,
    所表示的IP地址为192.168.0.0到192.168.0.255,其中最后一个地址为广播地址,因此可用IP地址数量为254。

    172.17.0.0/16代表的网络IP范围为172.17.0.0 - 172.17.255.255
    最后一个172.17.255.255:是作为广播地址的,不能使用其作为容器IP。

    docker inspect t1|tail -n 20
    
    • 1

    在这里插入图片描述

    注意:docker容器启动时,默认是桥接(bridge)模式,此时每个容器内部都会分配一个不同的IP地址,并且这个地址随着启动的顺序不同,是会变化的。
    这个给跨容器访问带来了问题。有可能之前连接的IP地址发生变化了。那么解决的方法就是可以使用name名称访问。

    8.3 桥接网络模式

    8.3.1 桥接网络模式说明

    Host
    Container
    Container
    Container
    docker0 bridge
    eth0
    veth
    veth
    eth0
    veth
    eth0
    eth0

    Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
    然后docker又创建了一个桥接网络,类似于路由器。
    在路由器上定义了网关,以及内部IP网段地址,类似于路由器提供了很多个网口veth。
    然后每个容器内部会有一个独立的虚拟网卡eth0连接到路由器的每个网口veth上,从而在虚拟机内部的所有容器处在同一个虚拟网段中,这样彼此之间就可以互相访问。

    8.3.2 桥接网络模式案例

    启动两个tomcat容器实例。

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

    在这里插入图片描述

    在宿主机中查看ip addr,可以看到网卡88:vethefec9eb@if8790: vethd13f1d2@if89
    在这里插入图片描述

    通过docker exec -it tomcat81 bash进入到容器tomcat81内部,查看网络
    在这里插入图片描述

    通过docker exec -it tomcat82 bash进入到容器tomcat82内部,查看网络
    在这里插入图片描述

    通过以上网络详情可以看到,以下匹配关系:
    宿主机88: vethefec9eb@if87 ==> 容器tomcat81:87: eth0@if88:
    宿主机90: vethd13f1d2@if89 ==> 容器tomcat82:89: eth0@if90:
    宿主机的虚拟网卡docker0上存在veth和容器的eth0的一对一关系。

    8.4 host网络模式

    8.4.1 host网络模式说明

    Host
    Container
    host
    宿主机eth0
    Container
    host
    Container
    host

    Host表示整个宿主机,在宿主机内部,有自己的网卡eth0。
    然后docker容器直接使用宿主机的网卡eth0。

    8.4.2 host模式案例

    #带端口映射的
    docker run -d -p 8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8
    
    • 1
    • 2

    在这里插入图片描述

    host模式在启动时,由于我们设置了端口映射,会出现警告信息,表示当使用host网络模式时,指定的端口映射规则无效。
    在上面的图片也可以看到没有端口映射发生,此时端口号以主机端口号为主,如果重复时,则递增。

    #不带端口映射的
    docker run -d --network host --name tomcat83 billygoo/tomcat8-jdk8
    
    • 1
    • 2

    在这里插入图片描述

    当使用不带端口映射的host模式启动时,就不会有警告信息了。

    #查看容器的网络配置信息
    docker inspect tomcat83
    
    • 1
    • 2

    host网络模式下,容器没有配置网关,ip等信息
    在这里插入图片描述

    容器内部访问网络时,发现与宿主机的网络配置一模一样,它其实就是使用的是宿主机的网络环境。
    在这里插入图片描述

    所有我们在访问tomcat时,直接使用宿主机的网络配置。

    8.5 none网络模式

    在none模式下,容器内部没有任何网络配置,只有一个lo(localhost),即禁用网络功能。

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

    在这里插入图片描述

    查看网络配置,none网络模式下,没有任何网关和IP信息。
    在这里插入图片描述

    容器内部查看,除了lo以外,没有任何网络配置。
    在这里插入图片描述

    因此,通常情况下不使用。

    8.5 container网络模式

    8.5.1 container网络模式说明

    Host
    Container
    docker0 bridge
    eth0
    veth
    Container
    eth0

    8.5.2 container网络模式案例

    错误应用:tomcat
    这是一个特殊的网络模式,如果启动两个tomcat容器,会出现报错信息。即tomcat应用不能使用该模式。

    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

    在这里插入图片描述

    发生错误的原因是tomcat85和tomcat86公用同一个IP同一个端口,导致端口冲突。

    成功应用:Alpine Linux应用,非常轻量级的linux,只有6M大小。

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

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    可以看到alpine2和alpine1使用相同的网络设备,并且都是桥接模式。
    注意:由于alpine2使用的是alpine1的网络设备,当容器alpine1停止后,alpine2将没有网络设备可以使用了。

    8.6 自定义网络

    问题:docker重启容器,容器内部的IP地址会发生变化。
    解决方案:可以通过指定容器服务名来访问。

    8.6.1 创建自定义网络

    # 创建自定义网络
    docker network create netshare
    
    # 加入自定义网络
    docker run -d -p 8081:8080 --network netshare --name tomcat81 billygoo/tomcat8-jdk8
    docker run -d -p 8082:8080 --network netshare --name tomcat82 billygoo/tomcat8-jdk8
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    加入相同的自定义网络中后,在tomcat81容器内部ping tomcat82 或者tomcat82容器内部ping tomcat81 都可以相互ping通对方。
    在这里插入图片描述

    这样解决了ip地址发生变更的问题。

  • 相关阅读:
    向量化编程书籍推荐
    从发现问题到创造价值 数据智能如何助力商家双11高质量增长?
    我不应该用JWT的!
    Js内存泄漏情况解析
    Redis-持久化机制
    大数据(一)背景和概念
    Mac Typora + PicGo + Github配置图床
    【Hack The Box】linux练习-- Brainfuck
    VUE3学习 第六章 V3自动引入插件、深入v-model、自定义指令directive、自定义Hooks、编写Vue3插件、
    node.js的express模块实现GET和POST请求
  • 原文地址:https://blog.csdn.net/wang6733284/article/details/133013690