一文搞懂docker网络

罪恶克星  论坛元老 | 昨天 00:57 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1761|帖子 1761|积分 5283

概念

基于对Network Namespace的控制,docker可以为在容器创建隔离的网络环境,在隔离的网络环境下,容用具有完全独立的网络栈,与宿主机隔离,也可以使容器共享主机或者其他容器的网络定名空间,根本可以满足开发者在各种场景下的需要。按docker官方的说法,docker容器的网络有以下几种模式:

  • Bridge 模式:默认模式,实用于大多数场景。
  • Host 模式:高性能,直接使用宿主机网络。
  • None 模式:无网络,仅实用于本地任务。
  • Overlay 模式:跨主机通信,实用于分布式应用。
  • Macvlan 模式:直接接入物理网络,实用于 IoT 设备。
  • Custom Network:机动设置,实用于复杂网络需求。
  • Container 网络模式:共享网络,实用于日志代理等场景。
当我们安装docker之后,默认会创建三个网络模式
  1. [root@master]:~$ docker network ls
  2. NETWORK ID     NAME      DRIVER    SCOPE
  3. 653123c201c5   bridge    bridge    local
  4. bf70d98b37ce   host      host      local
  5. b0cd5e45bf65   none      null      local
复制代码
Docker提供了以下常用的网络模式:

  • Bridge模式(桥接模式):默认的网络模式,容器通过假造网桥连接到主机的物理网络接口上,可以通过端口映射将容器的端口映射到主机上。
  • Host模式(主机模式):容器与主机共享网络定名空间,容器直接使用主机的网络栈,可以轻松访问主机上的网络资源,但会损失一定的隔离性。
  • None模式(无网络模式):容器不连接到任何网络,只能通过内部与其他容器举行通信,不能与外部举行网络通信。
Docker网络相关下令

在讲述正文之前,先看下Docker网络的相关下令
docker network ls:列出所有的网络

示例:
  1. [root@master]:~$ docker network ls
  2. NETWORK ID     NAME      DRIVER    SCOPE
  3. 4c46875a7300   bridge    bridge    local
  4. bf70d98b37ce   host      host      local
  5. b0cd5e45bf65   none      null      loca
复制代码
docker network create:创建docker网络

docker network create默认创建桥接网络,有以下常用选项

  • --driver, -d:指定网络类型,默认是bridge
  • --subnet:指定网段,接纳CIDR表现法
  • --gateway:指定网关
  • --ip-range:指定IP范围
  • --internal:创建一个内部网络,该网络中的容器无法访问外部网络。
  • --attachable:允许独立的容器(非服务模式下的容器)连接到该网络
  • --aux-address:为网络分配辅助 IP 地址
示例:
  1. # 创建一个名为 my_network 的桥接网络
  2. docker network create my_network
  3. # 创建一个my_bridge_network的网络,指定网络类型未bridge
  4. docker network create -d bridge my_bridge_network
  5. # 创建my_ip_range_network的网络,指定网段为192.168.10.0/24,IP范围192.168.10.128/25,网关192.168.10.1
  6. docker network create --subnet=192.168.10.0/24 --ip-range=192.168.10.128/25 --gateway=192.168.10.1 my_ip_range_network
  7. # 创建一个内部网络,该网络中的容器无法访问外部网络
  8. docker network create --internal my_internal_network
复制代码
docker network inspect:检察网络的详细信息

docker network inspect可以简写为docker inspect
示例:
  1. [root@master]:~$ docker inspect bridge
  2. [
  3.     {
  4.         "Name": "bridge",
  5.         "Id": "4c46875a7300333dafcbc6e6fea5d6313b9096ea48bb5098b07ad5302a145358",
  6.         "Created": "2025-04-25T11:06:30.998734581+08:00",
  7.         "Scope": "local",
  8.         "Driver": "bridge",
  9.         "EnableIPv4": true,
  10.         "EnableIPv6": false,
  11.         "IPAM": {
  12.             "Driver": "default",
  13.             "Options": null,
  14.             "Config": [
  15.                 {
  16.                     "Subnet": "172.17.0.0/16",
  17.                     "Gateway": "172.17.0.1"
  18.                 }
  19.             ]
  20.         },
  21.         "Internal": false,
  22.         "Attachable": false,
  23.         "Ingress": false,
  24.         "ConfigFrom": {
  25.             "Network": ""
  26.         },
  27.         "ConfigOnly": false,
  28.         "Containers": {},
  29.         "Options": {
  30.             "com.docker.network.bridge.default_bridge": "true",
  31.             "com.docker.network.bridge.enable_icc": "true",
  32.             "com.docker.network.bridge.enable_ip_masquerade": "true",
  33.             "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
  34.             "com.docker.network.bridge.name": "docker0",
  35.             "com.docker.network.driver.mtu": "1500"
  36.         },
  37.         "Labels": {}
  38.     }
  39. ]
复制代码
docker network connect:将指定容器连接到指定网络

示例:
  1. docker network connect my_network my_container
复制代码
docker network disconnect: 将指定容器断开连接到指定网络

示例:
  1. docker network disconnect my_network my_container
复制代码
docker network rm:删除指定的网络

该下令可以删除一个或多个指定的网络
  1. # 删除一个网络
  2. docker network rm my_network
  3. # 删除多个网络
  4. docker network rm my_network1 ... my_networkN
复制代码
Docker网络类型之bridge

bridge 网络本质上是一个 Linux 桥接设备(bridge device),它就像一个假造的交换机,允许连接到该网络的容器之间举行通信。当创建一个 Docker 容器并将其连接到 bridge 网络时,Docker 会为容器分配一个 IP 地址,而且通过桥接设备将容器的网络接口连接到这个假造交换机上,从而实现容器间的网络通信。
当我们安装docker之后,默认会在宿主机上创建一个docker0的网卡设备,这个docker0的网卡设备就是用来给bridge设备来使用的。
  1. [root@master]:~$ ip addr
  2. 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  3.     link/ether 46:d4:9c:a4:ee:07 brd ff:ff:ff:ff:ff:ff
  4.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  5.        valid_lft forever preferred_lft forever
复制代码
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到雷同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到docker0 网桥,名称以 veth 开头(比方 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个假造共享网络。

当我们创建一个容器来观察一下变化
  1. # 创建容器
  2. [root@master]:~$ docker run -d -p 82:80 --name nginx nginx
  3. 2add24bef3ec5a26ceb3b5a95ab0a5ff8cbe9883aed9e1cc10d345d97b3b9050
  4. [root@master]:~$ docker ps -a
  5. CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                 NAMES
  6. 2add24bef3ec   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 5 seconds   0.0.0.0:82->80/tcp, [::]:82->80/tcp   nginx
  7. # 发现新增了一个vethe9f90c1@if2的虚拟网络接口
  8. [root@master]:~$ ip addr
  9. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  10.     link/ether 46:d4:9c:a4:ee:07 brd ff:ff:ff:ff:ff:ff
  11.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  12.        valid_lft forever preferred_lft forever
  13.     inet6 fe80::44d4:9cff:fea4:ee07/64 scope link
  14.        valid_lft forever preferred_lft forever
  15. 4: vethe9f90c1@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
  16.     link/ether 8a:5a:e7:db:44:9a brd ff:ff:ff:ff:ff:ff link-netnsid 0
  17.     inet6 fe80::885a:e7ff:fedb:449a/64 scope link
  18.        valid_lft forever preferred_lft forever
复制代码
继承检察一下容器的IP地址和bridge网络、docker0设备有什么接洽
  1. # 查看容器的网络设置,发现使用的bridge类型,且Gateway和IPAddress都属于默认创建的bridge网络的范畴
  2. [root@master]:~$ docker inspect nginx | jq .[].NetworkSettings.Networks
  3. {
  4.   "bridge": {
  5.     "IPAMConfig": null,
  6.     "Links": null,
  7.     "Aliases": null,
  8.     "MacAddress": "a2:6a:08:83:12:4a",
  9.     "DriverOpts": null,
  10.     "GwPriority": 0,
  11.     "NetworkID": "4c46875a7300333dafcbc6e6fea5d6313b9096ea48bb5098b07ad5302a145358",
  12.     "EndpointID": "e15e87b83f30dfc6414e88502c5626239a9f938443ef7e2c51c65b2e5bfe5877",
  13.     "Gateway": "172.17.0.1",
  14.     "IPAddress": "172.17.0.2",
  15.     "IPPrefixLen": 16,
  16.     "IPv6Gateway": "",
  17.     "GlobalIPv6Address": "",
  18.     "GlobalIPv6PrefixLen": 0,
  19.     "DNSNames": null
  20.   }
  21. }
  22. #查看bridge网络
  23. [root@master]:~$ docker inspect bridge
  24. [
  25.     {
  26.         "Name": "bridge",
  27.         "Id": "4c46875a7300333dafcbc6e6fea5d6313b9096ea48bb5098b07ad5302a145358",
  28.         "Created": "2025-04-25T11:06:30.998734581+08:00",
  29.         "Scope": "local",
  30.         "Driver": "bridge",
  31.         "EnableIPv4": true,
  32.         "EnableIPv6": false,
  33.         "IPAM": {
  34.             "Driver": "default",
  35.             "Options": null,
  36.             "Config": [
  37.                 {
  38.                     "Subnet": "172.17.0.0/16",
  39.                     "Gateway": "172.17.0.1"
  40.                 }
  41.             ]
  42.         },
  43.         "Internal": false,
  44.         "Attachable": false,
  45.         "Ingress": false,
  46.         "ConfigFrom": {
  47.             "Network": ""
  48.         },
  49.         "ConfigOnly": false,
  50.         "Containers": {
  51.             "2add24bef3ec5a26ceb3b5a95ab0a5ff8cbe9883aed9e1cc10d345d97b3b9050": {
  52.                 "Name": "nginx",
  53.                 "EndpointID": "e15e87b83f30dfc6414e88502c5626239a9f938443ef7e2c51c65b2e5bfe5877",
  54.                 "MacAddress": "a2:6a:08:83:12:4a",
  55.                 "IPv4Address": "172.17.0.2/16",
  56.                 "IPv6Address": ""
  57.             }
  58.         },
  59.         "Options": {
  60.             "com.docker.network.bridge.default_bridge": "true",
  61.             "com.docker.network.bridge.enable_icc": "true",
  62.             "com.docker.network.bridge.enable_ip_masquerade": "true",
  63.             "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
  64.             "com.docker.network.bridge.name": "docker0",
  65.             "com.docker.network.driver.mtu": "1500"
  66.         },
  67.         "Labels": {}
  68.     }
  69. ]
  70. # 查看docker0网卡
  71. [root@master]:~$ ip addr
  72. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  73.     link/ether 46:d4:9c:a4:ee:07 brd ff:ff:ff:ff:ff:ff
  74.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  75.        valid_lft forever preferred_lft forever
  76.     inet6 fe80::44d4:9cff:fea4:ee07/64 scope link
  77.        valid_lft forever preferred_lft forever
复制代码
从上面能够看到容器的网关172.17.0.1是bridge网络的网关,容器IP地址172.17.0.2是bridge网络的网段范围,且bridge网络的Containers中包含着我们新创建的容器nginx
Docker网络类型之host

相称于Vmware中的NAT模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会假造出本身的网卡,设置本身的IP等,而是使用宿主机的IP和端口。可以通过 --net=host 指定使用 host 网络。

创建容器检察:
  1. # --net指定网络类型,当使用host网络类型时,-p选项是不生效的,所以这里不指定-p选项,
  2. # 使用host网络类型默认是使用镜像的端口直接映射到宿主机中
  3. [root@master]:~$ docker run -d --net host --name nginx_host nginx
  4. 057b3e0cd6d6cea318d93d1b0f25bbac0e7f287c84b469c6b64e69c794a69262
  5. # 查看宿主机的网络设备变化,并没有创建额外的网络设备
  6. [root@master]:~$ ip addr
  7. # 查看容器的IP地址
  8. # 这里发现IPAddress和Gateway都是空的,这里是直接使用宿主机的IP和网关
  9. [root@master]:~$ docker inspect nginx_host | jq .[].NetworkSettings.Networks
  10. {
  11.   "host": {
  12.     "IPAMConfig": null,
  13.     "Links": null,
  14.     "Aliases": null,
  15.     "MacAddress": "",
  16.     "DriverOpts": null,
  17.     "GwPriority": 0,
  18.     "NetworkID": "bf70d98b37ce8fb4925a62540dfb75682f85e72dfa5f413256192dfc661f051b",
  19.     "EndpointID": "7a1dfc95e37fc753b0edea128df4a8c3c813909bee4c03a33bf02129c90903ef",
  20.     "Gateway": "",
  21.     "IPAddress": "",
  22.     "IPPrefixLen": 0,
  23.     "IPv6Gateway": "",
  24.     "GlobalIPv6Address": "",
  25.     "GlobalIPv6PrefixLen": 0,
  26.     "DNSNames": null
  27.   }
  28. }
复制代码
检察容器的IP地址和宿主机的IP地址
  1. # 容器的IP地址
  2. [root@master]:~$ docker exec -it nginx_host hostname -I
  3. 172.25.193.185 172.17.0.1
  4. #宿主机的IP地址
  5. [root@master]:~$ hostname -I
  6. 172.25.193.185 172.17.0.1
复制代码
检察容器的hosts文件和宿主机的hosts文件
  1. # 查看宿主机的hosts文件
  2. [root@master]:~$ cat /etc/hosts
  3. 127.0.0.1       localhost
  4. 127.0.1.1       5CG422112V-QCA. 5CG422112V-QCA
  5. ::1     ip6-localhost ip6-loopback
  6. fe00::0 ip6-localnet
  7. ff00::0 ip6-mcastprefix
  8. ff02::1 ip6-allnodes
  9. ff02::2 ip6-allrouters
  10. # 查看容器内部的hosts解析
  11. [root@master]:~$ docker exec -it nginx_host cat /etc/hosts
  12. 127.0.0.1       localhost
  13. 127.0.1.1       5CG422112V-QCA. 5CG422112V-QCA
  14. ::1     ip6-localhost ip6-loopback
  15. fe00::0 ip6-localnet
  16. ff00::0 ip6-mcastprefix
  17. ff02::1 ip6-allnodes
  18. ff02::2 ip6-allrouters
复制代码
访问测试:
  1. # 直接访问本地的80端口,因为nginx的端口是80
  2. [root@master]:~$ curl localhost:80
  3. <!DOCTYPE html>
  4. <html>
  5. xxxx
  6. </html>
复制代码
通过上述的验证,可以发现host网络类型是没有本身独立的IP地址、网关这些信息,而是使用宿主机的IP地址
Docker网络类型值container

Docker网络container模式是指定其和已经存在的某个容器共享一个 Network Namespace,此时这两个容器共同使用同一网卡、主机名、IP 地址、容器间通讯可直接通过本地回环 lo 接口通讯。但这两个容器在其他的资源上,如文件系统、历程列表等还是隔离的。
使用container模式时,注意避免使用端口号一致镜像创建容器,否则会导致端口号冲突!!!

创建容器检察
  1. #创建容器,--net container:nginx指定依赖nginx的容器
  2. [root@master]:~$ docker run -d --net container:nginx --name tomcat_container tomcat:8
  3. 392726502e8caa4e9d13f0106effe2dabfff344882023063afd2a4205665fc31
  4. # 查看nginx_container的网络设置,发现是空的,这里表示nginx_container容器的网络设置和nginx容器的一致
  5. [root@master]:~$ docker inspect tomcat_container | jq .[].NetworkSettings.Networks
  6. {}
  7. # 查看nginx的网络设置
  8. [root@master]:~$ docker inspect nginx | jq .[].NetworkSettings.Networks
  9. {
  10.   "bridge": {
  11.     "IPAMConfig": null,
  12.     "Links": null,
  13.     "Aliases": null,
  14.     "MacAddress": "a2:6a:08:83:12:4a",
  15.     "DriverOpts": null,
  16.     "GwPriority": 0,
  17.     "NetworkID": "4c46875a7300333dafcbc6e6fea5d6313b9096ea48bb5098b07ad5302a145358",
  18.     "EndpointID": "e15e87b83f30dfc6414e88502c5626239a9f938443ef7e2c51c65b2e5bfe5877",
  19.     "Gateway": "172.17.0.1",
  20.     "IPAddress": "172.17.0.2",
  21.     "IPPrefixLen": 16,
  22.     "IPv6Gateway": "",
  23.     "GlobalIPv6Address": "",
  24.     "GlobalIPv6PrefixLen": 0,
  25.     "DNSNames": null
  26.   }
  27. }
复制代码
检察tomcat_container和nginx两个容器hosts文件
  1. # 查看tomcat_container的hosts文件
  2. [root@master]:~$ docker exec -it tomcat_container cat /etc/hosts
  3. 127.0.0.1       localhost
  4. ::1     localhost ip6-localhost ip6-loopback
  5. fe00::  ip6-localnet
  6. ff00::  ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.17.0.2      2add24bef3ec
  10. # 查看nginx的hosts文件
  11. [root@master]:~$ docker exec -it nginx cat /etc/hosts
  12. 127.0.0.1       localhost
  13. ::1     localhost ip6-localhost ip6-loopback
  14. fe00::  ip6-localnet
  15. ff00::  ip6-mcastprefix
  16. ff02::1 ip6-allnodes
  17. ff02::2 ip6-allrouters
  18. 172.17.0.2      2add24bef3ec
复制代码
检察tomcat_container和nginx两个容器IP地址
  1. [root@master]:~$ docker exec -it tomcat_container hostname -I
  2. 172.17.0.2
  3. [root@master]:~$ docker exec -it nginx hostname -I
  4. 172.17.0.2
复制代码
访问测试
  1. # 访问tomcat
  2. [root@master]:~$ curl 172.17.0.2:8080
  3. <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title></head><body><h1>HTTP Status 404 – Not Found</h1><hr  /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr  /><h3>Apache Tomcat/8.5.100</h3></body></html>
  4. # 访问nginx
  5. # 直接访问本地的80端口,因为nginx的端口是80
  6. [root@master]:~$ curl 172.17.0.2:80
  7. <!DOCTYPE html>
  8. <html>
  9. xxxx
  10. </html>
复制代码
通过上述的验证,可以发现container网络类型的容器,是依赖源容器的网卡设备的
Docker网络类型之none

容器有本身的网络定名空间,但不做任何设置,它与宿主机、与其他容器都不连通的。可以认为none网络类型是没有任何网络的,一般用于实行本地任务。
创建容器检察
  1. # 创建容器,--net none指定网络类型为none
  2. [root@master]:~$ docker run -d --name tomcat --net none tomcat:8
  3. 214870040e5542aec45baf6210ab506bbbee99bc908f0046881ff762c337f4fb
  4. # 查看网络
  5. [root@master]:~$ docker inspect tomcat | jq .[].NetworkSettings.Networks
  6. {
  7.   "none": {
  8.     "IPAMConfig": null,
  9.     "Links": null,
  10.     "Aliases": null,
  11.     "MacAddress": "",
  12.     "DriverOpts": null,
  13.     "GwPriority": 0,
  14.     "NetworkID": "b0cd5e45bf657efd288c4177963f6b75691839f207cc28b9ade94558d57f591c",
  15.     "EndpointID": "35224d75c0a50380b1cbaabfdd634052ebed0487b82e02a3a23adc6ea7c6cef4",
  16.     "Gateway": "",
  17.     "IPAddress": "",
  18.     "IPPrefixLen": 0,
  19.     "IPv6Gateway": "",
  20.     "GlobalIPv6Address": "",
  21.     "GlobalIPv6PrefixLen": 0,
  22.     "DNSNames": null
  23.   }
  24. }
复制代码
检察IP地址和hosts文件
  1. [root@master]:~$ docker exec -it tomcat cat /etc/hosts
  2. 127.0.0.1       localhost
  3. ::1     localhost ip6-localhost ip6-loopback
  4. fe00::  ip6-localnet
  5. ff00::  ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. # 发现IP是空的
  9. [root@master]:~$ docker exec -it tomcat hostname -I
  10. [root@master]:~$
复制代码
Docker网络类型之自界说网络

Docker的自界说网络提供了更机动、可控的容器网络管理方式,允许用户根据需求创建独立的网络环境,优化容器间通信和隔离性。
为什么需要自界说网络?

默认网络(bridge/host/none)的局限性:

  • 默认桥接网络(bridge):容器间只能通过 IP 通信,无法通过容器名称直接访问。
  • 隔离性不敷:所有容器默认共享同一个桥接网络,缺乏项目间的隔离。
  • 功能限制:默认网络不支持自界说子网、DNS、静态IP等高级设置。
自界说网络的优势:

  • 容器名称直接通信:同一自界说网络内的容器可通过容器名或别名互相访问。
  • 网络隔离性:差别自界说网络中的容器默认无法通信,加强安全性。
  • 机动设置:支持自界说子网、网关、IP 地址范围、DNS 等。
自界说网络bridge的创建与使用

通过docker network create创建bridge网络,当我们创建bridge网络之后,Docker默认会在宿主机中创建一个br-随机数的网桥设备
示例:
  1. # 创建网络
  2. [root@master]:~$ docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 bridge_01
  3. 856370f701c1b665272a2a5420051d544e3117cf752d801ff316cca17cdcdd70
  4. # 查看网络
  5. [root@master]:~$ docker network ls
  6. NETWORK ID     NAME        DRIVER    SCOPE
  7. 4c46875a7300   bridge      bridge    local
  8. 856370f701c1   bridge_01   bridge    local
  9. bf70d98b37ce   host        host      local
  10. b0cd5e45bf65   none        null      local
  11. # 查看网桥设备
  12. [root@master]:~$ ip addr
  13. 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  14.     link/ether 46:d4:9c:a4:ee:07 brd ff:ff:ff:ff:ff:ff
  15.     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  16.        valid_lft forever preferred_lft forever
  17.     inet6 fe80::44d4:9cff:fea4:ee07/64 scope link
  18.        valid_lft forever preferred_lft forever
  19. ### 新创建的网桥设备,该设备和docker0的作用一致
  20. 5: br-856370f701c1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  21.     link/ether ae:e5:74:0c:e9:31 brd ff:ff:ff:ff:ff:ff
  22.     inet 172.18.0.1/16 brd 172.18.255.255 scope global br-856370f701c1
  23.        valid_lft forever preferred_lft forever
复制代码
创建容器使用自界说网络
  1. # 创建两个容器,使用--net指定自定义网络
  2. [root@master]:~$ docker run -d -p 89:80 --name nginx_bridge1 --net bridge_01 nginx
  3. 050740ed8395bb76449318e4613f0f535ae3520a24acca273935df32511decac
  4. [root@master]:~$ docker run -d -p 8089:8080 --name tomcat_bridge1 --net bridge_01 tomcat:8
  5. 310698f33e70575a80bea21583f0ab04c7a6af2d9986008795f17cba4eb46954
复制代码
测试DNS解析
  1. # 进入nginx_bridge1容器
  2. [root@master]:~$ docker exec -it nginx_bridge1 bash
  3. # 下载ping工具
  4. root@050740ed8395:/# apt update -y && apt install -y iputils-ping
  5. # 测试ping,直接指定同一个网络的另一个容器名称即可
  6. root@050740ed8395:/# ping -4 tomcat_bridge1
  7. PING tomcat_bridge1 (172.18.0.3) 56(84) bytes of data.
  8. 64 bytes from tomcat_bridge1.bridge_01 (172.18.0.3): icmp_seq=1 ttl=64 time=0.470 ms
  9. 64 bytes from tomcat_bridge1.bridge_01 (172.18.0.3): icmp_seq=2 ttl=64 time=0.086 ms
  10. 64 bytes from tomcat_bridge1.bridge_01 (172.18.0.3): icmp_seq=3 ttl=64 time=0.080 ms
  11. 64 bytes from tomcat_bridge1.bridge_01 (172.18.0.3): icmp_seq=4 ttl=64 time=0.076 ms
复制代码
分配静态IP
docker run时通过--ip分配静态IP
  1. # 运行容器
  2. [root@master]:~$ docker run -d -p 8090:8080 --name tomcat_bridge_ip --net bridge_01 --ip 172.18.0.10 tomcat:8
  3. 8e219dee6db6cc0ffa497646bbb4109223d30205cd9231f830490429a78effc3
  4. # 查看容器IP地址
  5. [root@master]:~$ docker inspect tomcat_bridge_ip | jq .[].NetworkSettings.Networks.[].IPAddress
  6. "172.18.0.10"
复制代码
自界说其它的网络类型可自行测试

Docker网络类型之Overlay

Docker 的 Overlay 网络 是专为多主机容器通信设计的网络模式,尤实在用于 Docker Swarm 集群环境,允许差别物理主机上的容器直接互联,仿佛它们在同一局域网中。
Overlay 网络的核心作用


  • 跨主机通信:允许运行在差别宿主机上的容器直接通过假造网络通信。
  • 服务发现与负载均衡:与 Docker Swarm 集成,支持服务动态扩缩容和自动负载均衡。
  • 加密通信(可选):支持 TLS 加密容器间流量,提升安全性。
Overlay 网络的工作原理


  • VXLAN 封装:Overlay 网络通过 VXLAN(假造扩展局域网) 技术,将容器数据包封装在宿主机的 UDP 包中传输,穿透底层物理网络。
  • 控制平面:依赖 Docker Swarm 的 Gossip 协议 和 KV 存储(如 etcd)同步网络状态(如 IP 分配、服务映射)。
与其他网络类型的对比

特性Overlay网络Bridge 网络Host 网络跨主机通信✅❌(单机)❌(单机)隔离性网络级隔离网络级隔离无隔离性能斲丧较高(VXLAN 封装)低最低(无假造化)实用场景集群、多主机单机容器互联高性能单机容器Overlay网络依赖于docker集群,相较于docker集群我们更喜好用kubenetes集群,以是在这就不过多讲解Overlay网络
Docker网络类型之Macvlan网络

Docker 的 Macvlan 网络 允许容器直接绑定到宿主机的物理网络接口,使每个容器拥有独立的 MAC 地址和直接分配的 IP 地址(与宿主机在同一子网)。这种模式让容器表现得像物理设备一样接入网络,无需 NAT 或端口映射,实用于对网络性能要求高且需直接暴露到局域网的场景。
Macvlan 的核心特性


  • 直接物理网络接入:容器直接使用物理网络接口(如 eth0、ens33),获得与宿主机同子网的 IP。
  • 独立 MAC 地址:每个容器有唯一的 MAC 地址,外部设备可通过 ARP 直接发现容器。
  • 高性能:绕过 Docker 的假造网桥和 NAT,降低耽误。
  • 隔离性:容器间默认无法直接通信(除非通过外部网络)。
Macvlan 的两种模式

Macvlan Bridge 模式

原理:在物理接口上创建假造子接口,容器通过假造接口接入物理网络。
实用场景:同一物理网络内需要容器直接通信。
Macvlan 802.1q Trunk 模式

原理:通过 VLAN 标签(如 eth0.10)将流量划分到差别子网。
创建与使用 Macvlan 网络

创建 Macvlan 网络
  1. # 创建名为 macvlan_net 的 Macvlan 网络
  2. [root@master]]# docker network create \
  3.              -d macvlan \              #指定网络类型
  4.              --subnet=10.0.0.0/24 \    #指定网段,这里和宿主机的网段保持一致
  5.              --gateway=10.0.0.1 \      #指定网络网关,这里和宿主机保持一致
  6.              --ip-range=10.0.0.48/28 \ #IP范围,可选
  7.              -o parent=ens33 \         #宿主机网卡设备
  8.              macvlan_net
  9. c445578df1644b1a9fdb6c42b0ca3a16a0ad9e93dd838b2b4d41b90f904ce09a
  10. # 查看网络详细信息
  11. [root@master]]# docker inspect macvlan_net
  12. [
  13.     {
  14.         "Name": "macvlan_net",
  15.         "Id": "c445578df1644b1a9fdb6c42b0ca3a16a0ad9e93dd838b2b4d41b90f904ce09a",
  16.         "Created": "2025-04-20T15:53:38.185154888+08:00",
  17.         "Scope": "local",
  18.         "Driver": "macvlan",
  19.         "EnableIPv4": true,
  20.         "EnableIPv6": false,
  21.         "IPAM": {
  22.             "Driver": "default",
  23.             "Options": {},
  24.             "Config": [
  25.                 {
  26.                     "Subnet": "10.0.0.0/24",
  27.                     "IPRange": "10.0.0.48/28",
  28.                     "Gateway": "10.0.0.1"
  29.                 }
  30.             ]
  31.         },
  32.         "Internal": false,
  33.         "Attachable": false,
  34.         "Ingress": false,
  35.         "ConfigFrom": {
  36.             "Network": ""
  37.         },
  38.         "ConfigOnly": false,
  39.         "Containers": {},
  40.         "Options": {
  41.             "parent": "ens33"
  42.         },
  43.         "Labels": {}
  44.     }
  45. ]
复制代码
运行容器
  1. # 不用指定端口
  2. [root@master]]# docker run -d --name nginx_web --net macvlan_net nginx
  3. 1014b93180a5a1b0f53a739a473b568a4fa483511fbdd9d67397041d13c212af
  4. # 查看容器的IP
  5. [root@master]]# docker exec -it nginx_web hostname -I
  6. 10.0.0.48
复制代码
测试外部网络访问容器
http://10.0.0.48/

与其它网络类型对比

特性MacvlanBridge 网络Host 网络IP 分配物理网络直接分配Docker 内部子网共享宿主机 IP性能高(无 NAT)中等(NAT 开销)最高(无假造化)外部访问直接通过物理网络需端口映射或 NAT直接共享宿主机端口实用场景需直连物理网络的服务单机容器互联高性能单机容器
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

罪恶克星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表