跳转至

Docker 网络

理解 Docker 网络

image-20230504135520209

有三个网络地址

网卡名称 ip 地址 作用
lo 127.0.0.1 本机回环地址
enp34s0 192.168.1.99 服务器内网 ip
docker0 172.17.0.1 docker 0 地址

docker 是如何处理容器网络的?

1、启动一个容器

docker run -it -d --name test01 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it hacklab/docker-nettools:latest bash

2、查看容器内 ip 信息

发现

容器启动的时候会得到一个 eth0@if26492 的ip地址,docker 分配的

docker exec -it test01 ip -c a

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
26491: eth0@if26492: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

原理

1、我们每启动一个 docker 容器, docker 就会给 docker 容器分配一个 ip ,我们只要安装了 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair 技术!

2、桥接模式使用的 evth-pair 技术!

3、对比宿主机与容器内ip

image-20230504142707784

结论

  • 我们发现这个容器带来网卡,都是一对对的
  • evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段话在着协议,一段彼此相连
  • 正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的

4. 启动一个新容器、看容器间是否能通信

docker run -it -d --name test02 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it hacklab/docker-nettools:latest bash

image-20230504143714208

结论

新容器 test02 可以 ping test01

5、 结论

image-20230504145638280

结论

  • test01 和 test02 是公用的一个路由器 docker0
  • 所有的容器不指定网络的情况下,都是 docker0 路由的, docker 会给我们的容器分配一个默认的可用 IP
  • 每启动一个 docker 容器, docker 就会给 docker 容器分配一个 ip ,我们只要安装了 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair 技术!
  • Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高! 内网传递文件!

本质探究: --link 就是我们在 hosts 配置中增加了一个 172.18.0.3 可以使用服务名访问、单向的、想要双向通信 两个容器都需要 link、后续可用 compose 配置。 docker 0 不支持容器访问。后续使用 自定义网络。

自定义网络

网络模式

image-20230504151606506

  • bridge: 桥接 docker 0.2 0.3 0.4
  • host: 和宿主机共享网络
  • none:不配置网络

Docker0特点

默认服务名不能访问,--link 可以打通连接、较为麻烦 默认自带了 --net bridge

使用一个自定义网络

1、创建一个自定义网络 mynet

docker network create --driver bridge --subnet 10.10.200.0/16 --gateway 10.10.0.0 mynet

image-20230504152513660

2、在 mynet 网络中启动两个容器

docker run -it -d --name test03 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it --net mynet hacklab/docker-nettools:latest bash

image-20230504153035927

3、查看相关信息

docker network inspect mynet|grep -A 20 "Containers"
image-20230504153538518

image-20230504153348649

注意

--link 不需要指定、自定义的网络 docker 都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

4、测试 docker 0 与自定义网络 mynet 间的连通性

mynet 中的 test03 访问 docker0 中的 test02 失败 image-20230504155041915

5、尝试将 docker 0 与自定义网络 mynet 间连通

docker network connect mynet test02
image-20230504160453799

image-20230504160012086

此时 test02 拥有了两个IP

  • docker0 网络中的 172.17.0.7
  • mynet 网络中的 10.10.0.4

将 docker0 中的 test02 放置到了 mynet 网络中

  • 使 mynet 中的 test03 访问 docker0 中的 test02 成功。
  • 没有连接的 test01 依旧旨在 docker0 网络中。只能与处在 docker 0 网络中的 test02 通信。

image-20230504161409688