ITPub博客

首页 > 云计算 > Docker/K8 > 12 Docker容器单机网络架构全攻略:从默认桥接到自定义桥接的实战之旅

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

原创 Docker/K8 作者:shuchaoyang 时间:2024-11-10 21:11:50 0 删除 编辑

12 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 Macvlan 4.2.4 主机模式(Host) 4.2.5 无网络模式(None) 4.3 自定义docker桥接网络实战 4.3.1 查看docker网络帮助 4.3.2 查看Docker网络/网桥 4.3.3 查看docker网络详细信息 4.3.4 创建新的docker网络 4.3.4.1 查看创建网络帮助 4.3.4.2 创建新的docker网络 4.3.5 删除docker网络 4.3.6 创建docker网络

12 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.3 查看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.4 创建新的docker网络

4.3.4.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.4.2 创建新的docker网络
[superman@docker ~]$ docker network create -d bridge br1

示例:

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

43104b870c80ae69948fb201aee3af386ad8d23c7a9dd6a849e1fcf58f3c6798
[superman@docker ~] $

4.3.5 删除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.6 创建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<UP,BROADCAST,MULTICAST>  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<UP,BROADCAST,MULTICAST>  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<UP,BROADCAST,RUNNING,MULTICAST>  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<link>
       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<UP,LOOPBACK,RUNNING>  mtu 65536
       inet 127.0.0.1  netmask 255.0.0.0
       inet6 ::1  prefixlen 128  scopeid 0x10<host>
       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<UP,BROADCAST,MULTICAST>  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<BROADCAST,MULTICAST>  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 ~] $

原文链接: https://mp.weixin.qq.com/s?__biz=MzkxNzI1OTE3Mw==&mid=2247492203&idx=1&sn=6841375ea044bb5726d1f70eb2a77608&chksm=c141f4a1f6367db7504cfbba142f89cb78650d750f1f12989d42aa21809dc818c2189de4f474&token=1641304794&lang=zh_CN#rd

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

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

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

图片



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/291614/viewspace-3048259/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
专注于IT系统集成、运维、架构二十年的IT职场老兵,拥有CCNA、OCA、OCP、PGCA、PGCE认证证书,公众号:超哥的IT私房菜,知识星球:超哥的IT私房菜,目前是多家IT厂商的咨询顾问。

注册时间:2021-08-27

  • 博文量
    552
  • 访问量
    303575