Docker容器单机网络架构全攻略:从默认桥接到自定义桥接的实战之旅

Docker容器单机网络架构全攻略:从默认桥接到自定义桥接的实战之旅四 创建自定义docker桥接网络4.1 docker中的默认三种网络类型4.1.1 桥接模式(Bridge)4.1.2 主机模式(Host)4.1.3 无网络模式(None)4.2 docker自定义网络类型4.2.1 桥接模式(Bridge)4.2.2 覆盖网络(Overlay)4.2.3 Macvlan4.2.4 主机模式(Host)4.2.5 无网络模式(None)4.3 自定义docker桥接网络实战4.3.1 查看docker网络帮助4.3.2 查看Docker网络/网桥4.3.2 查看docker网络详细信息4.3.3 创建新的docker网络4.3.3.1 查看创建网络帮助4.3.3.2 创建新的docker网络4.3.4 删除docker网络4.3.5 创建docker网络

Docker容器单机网络架构全攻略:从默认桥接到自定义桥接的实战之旅

四 创建自定义docker桥接网络

4.1 docker中的默认三种网络类型

4.1.1 桥接模式(Bridge)

  • 这是Docker的默认网络模式。

  • 当Docker服务启动时,它会在主机上创建一个名为docker0的虚拟网桥,并选择一个与宿主机不同的IP地址和子网分配给docker0网桥。

  • 桥接模式下,Docker会为每个容器分配一个IP地址,并创建一个本地的网络桥接接口,连接所有在该主机上运行的容器。

  • 通过桥接接口,容器可以相互通信,也可以与主机上的其他服务通信。

  • 该模式适用于单主机多容器的情况,特别是当容器之间需要互相通信且需要保持网络隔离时。

4.1.2 主机模式(Host)

  • 在主机模式下,容器与主机共享网络命名空间。

  • 容器将直接使用主机的网络接口和IP地址,而不是创建独立的网络栈。

  • 这意味着容器可以使用主机上的所有网络功能和服务,包括使用主机的IP地址和端口。

  • 主机模式适用于需要容器与主机之间网络性能最大化的场景,或者当容器需要快速访问主机网络服务时。

4.1.3 无网络模式(None)

  • 在无网络模式下,容器没有分配任何网络资源。

  • 这意味着容器内部没有网络接口,也没有IP地址。

  • 无网络模式适用于不需要网络连接的容器,例如用于批处理作业或与外部网络完全隔离的容器。

这三种网络类型各自适用于不同的场景和需求,用户可以根据具体的应用场景来选择最适合的网络类型。

4.2 docker自定义网络类型

Docker支持多种自定义网络类型,以满足不同的容器通信和网络配置需求。以下是Docker自定义网络类型的详细分点表示和归纳。

4.2.1 桥接模式(Bridge)

  • 这是Docker默认的网络模式,但在自定义网络中,桥接模式允许用户创建自己的网络桥,而不是使用默认的docker0桥。

  • 使用docker network create --driver bridge my_bridge_network命令可以创建一个新的桥接网络。

  • 用户可以指定自定义的子网和IP地址范围,如--subnet=172.17.0.0/16

  • 容器连接到该网络后,可以通过容器名称或别名进行通信。

4.2.2 覆盖网络(Overlay)

  • Overlay网络用于跨多个Docker主机的容器间通信。

  • 它使用键值存储(如Consul、Etcd或Zookeeper)来管理网络状态,并允许在不同的Docker主机上的容器之间进行通信。

  • 创建Overlay网络时,可以使用docker network create --driver overlay my_overlay_network命令。

  • Overlay网络特别适用于在分布式系统中部署微服务或容器化应用。

4.2.3 Macvlan

  • Macvlan网络允许容器拥有自己的MAC地址,并直接连接到物理网络。

  • 这意味着容器可以直接访问外部网络,而无需NAT或端口映射。

  • 使用docker network create --driver macvlan --subnet=172.17.0.0/16 --gateway=172.17.0.1 -o parent=eth0 my_macvlan_network命令可以创建一个Macvlan网络。

  • 其中,--subnet--gateway参数指定子网和网关,-o parent=eth0指定父网络接口。

4.2.4 主机模式(Host)

  • 尽管主机模式不是真正的自定义网络类型(因为它不使用Docker的网络管理功能),但它在某些场景下可能被视为一种“自定义”配置。

  • 在主机模式下,容器与宿主机共享网络命名空间,因此容器可以直接访问宿主机的网络接口和IP地址。

  • 这意味着容器将使用宿主机的IP地址和端口,而不是自己的。

4.2.5 无网络模式(None)

  • 在无网络模式下,容器没有自己的网络栈,也不连接到任何网络。

  • 这通常用于不需要网络功能的容器,例如批处理任务或只与本地文件系统进行交互的容器。

Docker提供了多种自定义网络类型,以满足不同的容器通信和网络配置需求。桥接模式适用于单主机容器通信,Overlay和Macvlan模式适用于跨主机容器通信,主机模式允许容器直接使用宿主机的网络接口,而无网络模式则用于不需要网络功能的容器。

4.3 自定义docker桥接网络实战

4.3.1 查看docker网络帮助

[superman@docker ~]$ docker network --help

示例:

[superman@docker ~]$ docker network --help

Usage: docker network COMMAND

Manage networks

Commands:
connect     Connect a container to a network
create     Create a network
disconnect Disconnect a container from a network
inspect     Display detailed information on one or more networks
 ls         List networks
prune       Remove all unused networks
 rm         Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.
[superman@docker ~]$

4.3.2 查看Docker网络/网桥

[superman@docker ~]$ docker network ls

示例:

[superman@docker ~]$ docker network ls
NETWORK ID     NAME     DRIVER   SCOPE
a480afcf17e0   bridge   bridge   local
1fe81a14e4c7   host     host     local
008ae2f75ac2   none     null     local
[superman@docker ~]$

4.3.2 查看docker网络详细信息

[superman@docker ~]$ docker network inspect a480afcf17e0

示例:

[superman@docker ~]$ docker network inspect a480afcf17e0
[
  {
       "Name": "bridge",
       "Id": "a480afcf17e0d785c70b274bbd1f4bcc3a4a6850e83d22f4c316ecbc998d74c5",
       "Created": "2024-06-24T09:46:02.300756433+08:00",
       "Scope": "local",
       "Driver": "bridge",
       "EnableIPv6": false,
       "IPAM": {
           "Driver": "default",
           "Options": null,
           "Config": [
              {
                   "Subnet": "172.17.0.0/16",
                   "Gateway": "172.17.0.1"
              }
          ]
      },
       "Internal": false,
       "Attachable": false,
       "Ingress": false,
       "ConfigFrom": {
           "Network": ""
      },
       "ConfigOnly": false,
       "Containers": {},
       "Options": {
           "com.docker.network.bridge.default_bridge": "true",
           "com.docker.network.bridge.enable_icc": "true",
           "com.docker.network.bridge.enable_ip_masquerade": "true",
           "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
           "com.docker.network.bridge.name": "docker0",
           "com.docker.network.driver.mtu": "1500"
      },
       "Labels": {}
  }
]
[superman@docker ~]$

4.3.3 创建新的docker网络

4.3.3.1 查看创建网络帮助
[superman@docker ~]$ docker network create --help

示例:

[superman@docker ~]$ docker network create --help

Usage: docker network create [OPTIONS] NETWORK

Create a network

Options:
     --attachable           Enable manual container attachment
     --aux-address map     Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
     --config-from string   The network from which to copy the configuration
     --config-only         Create a configuration only network
 -d, --driver string       Driver to manage the Network (default "bridge")
     --gateway strings     IPv4 or IPv6 Gateway for the master subnet
     --ingress             Create swarm routing-mesh network
     --internal             Restrict external access to the network
     --ip-range strings     Allocate container ip from a sub-range
     --ipam-driver string   IP Address Management Driver (default "default")
     --ipam-opt map         Set IPAM driver specific options (default map[])
     --ipv6                 Enable IPv6 networking
     --label list           Set metadata on a network
 -o, --opt map             Set driver specific options (default map[])
     --scope string         Control the network's scope
     --subnet strings       Subnet in CIDR format that represents a network segment
[superman@docker ~]$
4.3.3.2 创建新的docker网络
[superman@docker ~]$ docker network create -d bridge br1

示例:

[superman@docker ~]$ docker network create -d bridge br1
43104b870c80ae69948fb201aee3af386ad8d23c7a9dd6a849e1fcf58f3c6798
[superman@docker ~]$

4.3.4 删除docker网络

[superman@docker ~]$ docker network rm br1
[superman@docker ~]$ docker network inspect br1

示例:

[superman@docker ~]$ docker network rm br1
br1
[superman@docker ~]$
[superman@docker ~]$ docker network inspect br1
[]
Error response from daemon: network br1 not found
[superman@docker ~]$

4.3.5 创建docker网络

定义子网/网关/网桥名称

[superman@docker ~]$ docker network create -d bridge --subnet 172.16.1.0/24 --gateway 172.16.1.1 br1
[superman@docker ~]$ docker network inspect br1

示例:

[superman@docker ~]$ docker network create -d bridge --subnet 172.16.1.0/24 --gateway 172.16.1.1 br1  
1aa209e7f1ecfb2a31aff43199ac845b90030480b854dba1a3aa2a32cfda74a1
[superman@docker ~]$
[superman@docker ~]$ docker network inspect br1
[
  {
       "Name": "br1",
       "Id": "1aa209e7f1ecfb2a31aff43199ac845b90030480b854dba1a3aa2a32cfda74a1",
       "Created": "2024-06-24T11:22:13.046754701+08:00",
       "Scope": "local",
       "Driver": "bridge",
       "EnableIPv6": false,
       "IPAM": {
           "Driver": "default",
           "Options": {},
           "Config": [
              {
                   "Subnet": "172.16.1.0/24",
                   "Gateway": "172.16.1.1"
              }
          ]
      },
       "Internal": false,
       "Attachable": false,
       "Ingress": false,
       "ConfigFrom": {
           "Network": ""
      },
       "ConfigOnly": false,
       "Containers": {},
       "Options": {},
       "Labels": {}
  }
]
[superman@docker ~]$
[superman@docker ~]$ brctl show
bridge name     bridge id               STP enabled     interfaces
br-1aa209e7f1ec         8000.02420fae1f4d       no
docker0         8000.02426622474e       no
virbr0          8000.5254002be74a       yes             virbr0-nic
[superman@docker ~]$
[superman@docker ~]$ ifconfig -a
br-1aa209e7f1ec: flags=4099 mtu 1500
      inet 172.16.1.1 netmask 255.255.255.0 broadcast 172.16.1.255
      ether 02:42:0f:ae:1f:4d txqueuelen 0 (Ethernet)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

docker0: flags=4099 mtu 1500
      inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
      ether 02:42:66:22:47:4e txqueuelen 0 (Ethernet)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33: flags=4163 mtu 1500
      inet 192.168.0.121 netmask 255.255.255.0 broadcast 192.168.0.255
      inet6 fe80::bf89:d5fb:2136:8e25 prefixlen 64 scopeid 0x20
      ether 00:0c:29:ae:f5:f2 txqueuelen 1000 (Ethernet)
      RX packets 1338 bytes 252973 (247.0 KiB)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 560 bytes 74996 (73.2 KiB)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73 mtu 65536
      inet 127.0.0.1 netmask 255.0.0.0
      inet6 ::1 prefixlen 128 scopeid 0x10
      loop txqueuelen 1000 (Local Loopback)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099 mtu 1500
      inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
      ether 52:54:00:2b:e7:4a txqueuelen 1000 (Ethernet)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0-nic: flags=4098 mtu 1500
      ether 52:54:00:2b:e7:4a txqueuelen 1000 (Ethernet)
      RX packets 0 bytes 0 (0.0 B)
      RX errors 0 dropped 0 overruns 0 frame 0
      TX packets 0 bytes 0 (0.0 B)
      TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[superman@docker ~]$


PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我吧!


? 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


请使用浏览器的分享功能分享到微信等