docker网络

docker网络

理解docker0

在没有启动容器时会有三个网卡,分别是lo,ens33,docker0。
lo(loopback):本机回环网卡,IP地址一般为127.0.0.1,用于本机通信。
ens33:主机网络网卡,用于连接互联网。
docker0:docker0虚拟网络网卡,用于连接宿主机网络。IP地址为172.17.0.1。

在启动一个容器后,检测容器的网卡ip信息,发现容器ip为172.17.0.2。宿主机能够正常ping通容器的ip。此时查看宿主机的网卡ip信息,会发现多了一对虚拟网卡veth-pair。
注:
如果容器中没有ip address命令来查看网卡ip信息,需要下载iproute工具包
yum install iproute -y

veth-pair是一对虚拟设备接口,它都是成对出现的,一端连接协议栈,一端彼此连接。因为其特性,一般用来充当桥梁,连接各种虚拟网络设备。

所有容器在不指定网络模式的情况下,默认都是docker0路由的,docker会分配给容器一个可用的IP。docker中所有网络接口都是虚拟的。

容器中的网络都是由docker0路由的,容器之间可以相互ping通ip。但如果想通过容器名来连接就需要link

命令格式:
docker run --link 其他容器
在创建容器时添加链接,使新创建的容器可以通过容器名或容器id访问其他容器。但只能单向的访问,其他容器在没有添加链接的情况下,无法通过容器名或容器id访问新创建的容器。因此不建议使用。

eg:
创建一个新的容器centos-3链接centos-2容器
docker run -it -d --name centos-3 --link centos-2 centos:7

此时进入centos-3容器会发现可以通过容器名与容器id的形式ping通。通过查看容器中的hosts配置文件可以发现link命令的本质是配置ip映射

docker自定义网络

Network Namespace是什么

Linux Namespace是Linux系统中一个资源抽象方式,能够实现资源隔离。目前有其中namespace: Cgroup、IPC、Network、Mount、IPD、User、UTS。
Network Namespace能够实现网络相关资源的分隔。运行在一个单独network namespace 中的进程拥有它自己的网络设备、路由表、防火墙规则等。

docker的4种网络模式

docker有四类网络模式,分别为:bridge模式、host模式、none模式、container模式。

bridge模式:
docker的默认网络模式。当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,启动的容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器都通过交换机连接到二层网络中。从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(网卡),另一端放在主机中,以vethXX的形式命名,并将这个网络设备加入到docker0网桥中。

host模式:
如果容器使用host模式,那么这个容器将不会获得独立的Network Namespace,而是与宿主机共用一个Network Namespace,使用宿主机的IP和端口。

none模式:
如果容器使用none模式,容器拥有自己的Network Namespace,但不进行任何网络配置,没有网卡、ip地址、路由等信息。只有lo回环网络,完全封闭的网络。

container模式:
该模式指定新创建的容器和已经存在的一个容器共享同一个Network Namespace,新创建的容器不会创建自己的网卡。

docker网络管理命令

格式:
docker network 命令
常用命令:
ls: 查看docker网络
inspect xx: 查看xx网络的详细信息
create 参数 xx: 创建网络名为xx的网络
常用参数: --driver:指定网络驱动,--subnet:指定子网网段,--ip-range:指定容器IP范围,--gateway:指定子网网关
connect 网络 容器名|容器ID:将指定容器联通的指定网络
rm xx:删除网络名为xx的网络

eg:
查看当前docker网络
docker network ls
查看bridge网络的详细信息(比如哪些容器在该网络)
docker network inspect bridge
创建一个名为mynet的网络,指定网络驱动为bridge,指定子网网段为10.20.0.0/16,指定子网网关为10.20.0.1
docker network create --driver bridge --subnet 10.20.0.0/16 --gateway 10.20.0.1 mynet
创建一个名为centos-4的容器,指定容器在mynet网络中
docker run -it -d --name centos-4 --net mynet centos:7
将在自定义网络中centos-4容器与docker0网络(bridge)连通,实现一个容器两个ip(公网ip与私网ip)
docker network connect bridge centos-4

参考资料

https://docs.docker.com/network/
https://www.cnblogs.com/bakari/p/10613710.html
https://zhuanlan.zhihu.com/p/629638479
https://www.php.cn/faq/484843.html

posted @ 2024-03-04 20:45  柯南。道尔  阅读(10)  评论(0编辑  收藏  举报