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中所有网络接口都是虚拟的。
容器链接(link)
容器中的网络都是由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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现