docker network

本文深入解析Docker网络配置,涵盖host、bridge、自定义bridge等模式下容器与宿主机及容器间的网络通信原理,包括ifconfig、route命令的使用,以及在Linux与Windows平台上的差异。

参考:https://blog.youkuaiyun.com/qq_39504520/article/details/82719456

准备

  • 准备镜像 dockerfile
from ubuntu
run apt-get update
run apt-get -y install netcat  net-tools inetutils-ping
docker build -t netwrok .
  • docker 网络
docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
99b37182037a        bridge              bridge              local
c805148e6dc5        host                host                local
8a0aa29d93ff        none                null                local
  • 主机网络
ifconfig
...
docker0   Link encap:Ethernet  HWaddr 02:42:09:a9:07:e0
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:19745 errors:0 dropped:0 overruns:0 frame:0
          TX packets:19658 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1563604 (1.5 MB)  TX bytes:35632440 (35.6 MB)
...
  • 主机路由(docker0 是默认创建的bridge, 不论容器状态如何,这条路由都一直存在 )
$ route
...
172.18.0.0      *               255.255.0.0     U     0      0        0 docker0
...

默认bridege

docker run -it --net=bridge network

或者

 docker run -it network
  • ifconfig
...
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:acff:fe12:2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 7  bytes 578 (578.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

...
  • 容器 route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.18.0.1      0.0.0.0         UG    0      0        0 eth0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0

此时在容器中可以直接用 gateway 的 IP 172.18.0.1 访问主机的端口
但是主机也可以 通过 172.18.0.2 访问容器的端口

host

docker run -it --net=host network
  • ifconfig
    返回内容和主机一样,也就是容器的网络和主机相同

此时在容器中可以直接用 localhost 访问主机的端口
但是主机无法 通过 localhost 访问容器的端口

自定义bridge

docker network create test
docker run -it --net=test --name=test01 network
docker run -it --net=test --name=test01 network

上面这样抛弃了的机器 test01 test02就是可以相互ping 通的
只有自定义的bridge 下才能ping通,默认的bridge是ping 不通的,但是可以通过ip 访问

docker network 在windows和linux 下的差别

  • docker for windows 和 linux 下差别非常大

  • liunx 的情况最简单

    • 网络类型

      • host --net=host 或者 --network host

        • ifconfig 结果和宿主机一模一样
      • bridge

        • 容器 ifconfig 中只有 本地回环网络和 一个bridge上的网卡(即使windows 中也是这样)
        • 宿主机的 在 桥接网络中 的地址一般是 172.17.0.1
        • docker create network test 后, 宿主机会增加一个 172.18.0.1 的设备
    • 宿主访问容器

      • 如果用了host网络,则直接用 localhost 即可访问容器端口
      • 常见的 端口映射, localhost:port
      • 宿主机也可用 容器在 bridge 网络 172.17.0.0/16 中地址访问容器,比如 172.17.0.2:8080
    • 容器间相互访问

      • 只有使用同一个bridge的容器才可以相互访问
      • 应该是和安全有关,毕竟在host中是无论如何都可以访问的,host 上也有相应的路由
      • 新建的network的容器,可以用容器名相互访问
      • defaul 的 docker0 中可以用172.17.x.x 的ip访问,但是不能用容器名
    • 容器访问宿主

      • host 当成 localhost 就可以随便访问
      • bridge 用 172.17.0.1 这种地址,就是宿主机ifconfig 中返回的地址,即可访问
  • Windows 的情况很郁闷
    有人遇到类似的问题(https://www.iamzs.cn/archives/docker-tutorial.html)
    windows的网络结构(https://docs.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)
    在这里插入图片描述

    • 网络类型

      • host

        • 容器 ifconfig 和宿主有很大差别,直接用localhost 无法访问宿主
        • 宿主windows 中,有三个可疑地址,
          • 其中两个(大概这样的地址192.168.41.161/28,172.17.253.113/28)是hyper-v引入的地址
          • 另外一个(大概这样10.0.75.1/24)是docker 的nat 网关地址
      • bridge

        • 容器 ifconfig 和 linux下 的情况相同
        • 但是由于宿主系统中没有docker0,新建的bridge 也没有网卡,所以无法直接访问容器
        • 没有网桥,只有一个docker nat,也不知道做啥?只能单向访问?
      • docker 似乎维护了两套地址

        • 172.17.. 172.18..
        • 192.168.65.2,192.168.65.3 (host模式下的容器也会使用这个网络),其他任何网络模式中的容器都可以访问这个地址
    • 宿主访问容器

      • host 无法访问
      • 端口映射, 和linux 一样 - p [host_port]:[port] , curl localhost:port
    • 容器间相互访问

      • 和linux 相同
    • 容器访问宿主

      • host.docker.internal(ping host.docker.internal 得到的网址是192.168.65.2)
      • docker.for.win.localhost 也可以
      • host/桥接模式都是一样的地址
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值