六、Docker网络-创建和使用自定义Bridge - 图1

docker网络的创建

  • docker network create [options]
    参数:-d:指定driver,如bridge
    例子:docker network create -d bridge mybridge

    1. [root@localhost ~]# docker network create -d bridge mybridge
    2. a0bc67bd61e96496569fe5cb99cf3541a94fb5344ab78744d017ce68b08e56de
    3. [root@localhost ~]#
    4. [root@localhost ~]# docker network ls
    5. NETWORK ID NAME DRIVER SCOPE
    6. c4b678a93972 bridge bridge local
    7. d0763579887a host host local
    8. a0bc67bd61e9 mybridge bridge local
    9. 6a03d63270a6 none null local
    10. [root@localhost ~]#
    11. [root@localhost ~]# docker network inspect a0b
    12. [
    13. {
    14. "Name": "mybridge",
    15. "Id": "a0bc67bd61e96496569fe5cb99cf3541a94fb5344ab78744d017ce68b08e56de",
    16. "Created": "2021-12-12T15:39:11.777904385+08:00",
    17. "Scope": "local",
    18. "Driver": "bridge",
    19. "EnableIPv6": false,
    20. "IPAM": {
    21. "Driver": "default",
    22. "Options": {},
    23. "Config": [
    24. {
    25. "Subnet": "172.18.0.0/16",
    26. "Gateway": "172.18.0.1"
    27. }
    28. ]
    29. },
    30. "Internal": false,
    31. "Attachable": false,
    32. "Ingress": false,
    33. "ConfigFrom": {
    34. "Network": ""
    35. },
    36. "ConfigOnly": false,
    37. "Containers": {},
    38. "Options": {},
    39. "Labels": {}
    40. }
    41. ]
  • 可看到新创建的bridge子网为172.18.0.0/16

    使用自定义bridge

  • 创建container时使用--network [network_name] 来指定网络

    1. [root@localhost ~]# docker container run -d --name box3 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"
    2. d4d224ad1847593352e11877e2264797129c3205d13aae42c227c50fea6b903a
    3. [root@localhost ~]#
    4. [root@localhost ~]# docker container ls
    5. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    6. d4d224ad1847 busybox "/bin/sh -c 'while t…" 11 seconds ago Up 10 seconds box3
    7. a99bb30012ad busybox "/bin/sh -c 'while t…" 19 hours ago Up 19 hours box2
    8. 80c4a01d050e busybox "/bin/sh -c 'while t…" 19 hours ago Up 19 hours box1
  • 使用docker container inspect box3查看容器信息,发现网络使用的是自定义的bridge
    六、Docker网络-创建和使用自定义Bridge - 图2

  • 使用docker network inspect mybridge 查看自定义的bridge信息,发现container下有box3
    六、Docker网络-创建和使用自定义Bridge - 图3

    自定义网络提供类似DNS功能

  • 使用docker network connect bridge box3 来使容器box3连接默认的bridge网络

  • 连接完成后docker container inspect box3 来查看box3的信息,发现box3同时连接了自定义的mybridge和默认的bridge
    六、Docker网络-创建和使用自定义Bridge - 图4
  • 进入到容器中docker container exec -it box3 sh查看ip信息ip a,也能查看到此容器连接了172.18.0.2/16以及172.17.0.4/16两个接口

    1. [root@localhost ~]# docker container exec -it box3 sh
    2. / # ip a
    3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    5. inet 127.0.0.1/8 scope host lo
    6. valid_lft forever preferred_lft forever
    7. 29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    8. link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    9. inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
    10. valid_lft forever preferred_lft forever
    11. 31: eth1@if32: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    12. link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    13. inet 172.17.0.4/16 brd 172.17.255.255 scope global eth1
    14. valid_lft forever preferred_lft forever
  • 使用docker network inspect bridge也能查看到container中多了box3这个容器
    六、Docker网络-创建和使用自定义Bridge - 图5

    关闭网络连接

  • docker network disconnect [network_name] [container_name]

    容器网络互通实验

  1. 创建第四个容器box4,网络连接至mybridge:docker container run -d --name box4 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"
  2. 查看box3和box4的网络连接

    1. [root@localhost ~]# docker container exec -it box3 ip a
    2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    3. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    4. inet 127.0.0.1/8 scope host lo
    5. valid_lft forever preferred_lft forever
    6. 29: eth0@if30: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    7. link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
    8. inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
    9. valid_lft forever preferred_lft forever
    10. [root@localhost ~]#
    11. [root@localhost ~]# docker container exec -it box4 ip a
    12. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    13. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    14. inet 127.0.0.1/8 scope host lo
    15. valid_lft forever preferred_lft forever
    16. 33: eth0@if34: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    17. link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    18. inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
    19. valid_lft forever preferred_lft forever
  3. 在box3中使用box4的ip以及名字进行网络连接(ping)
    六、Docker网络-创建和使用自定义Bridge - 图6

    Note 由此可见自定义的mybridge提供了类似DNS的功能,可以通过容器名称查询其ip地址。但是默认的bridge不提供类似的DNS的功能。 六、Docker网络-创建和使用自定义Bridge - 图7

docker network其他参数

  1. [root@localhost ~]# docker network create --help
  2. Usage: docker network create [OPTIONS] NETWORK
  3. Create a network
  4. Options:
  5. --attachable Enable manual container attachment
  6. --aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
  7. --config-from string The network from which to copy the configuration
  8. --config-only Create a configuration only network
  9. -d, --driver string Driver to manage the Network (default "bridge")
  10. --gateway strings IPv4 or IPv6 Gateway for the master subnet
  11. --ingress Create swarm routing-mesh network
  12. --internal Restrict external access to the network
  13. --ip-range strings Allocate container ip from a sub-range
  14. --ipam-driver string IP Address Management Driver (default "default")
  15. --ipam-opt map Set IPAM driver specific options (default map[])
  16. --ipv6 Enable IPv6 networking
  17. --label list Set metadata on a network
  18. -o, --opt map Set driver specific options (default map[])
  19. --scope string Control the network's scope
  20. --subnet strings Subnet in CIDR format that represents a network segment
  • 指定网关和子网
    docker network create -d bridge --gateway 172.200.0.1 --subnet 172.200.0.0/16 demo-bridge
    1. [root@localhost ~]# docker network create -d bridge --gateway 172.200.0.1 --subnet 172.200.0.0/16 demo-bridge
    2. 18294d3e66dd7004ff956f8f1243ffcaf2d29940f3e024dfcd70c41814cc1b01
    3. [root@localhost ~]#
    4. [root@localhost ~]# docker network inspect demo-bridge
    5. [
    6. {
    7. "Name": "demo-bridge",
    8. "Id": "18294d3e66dd7004ff956f8f1243ffcaf2d29940f3e024dfcd70c41814cc1b01",
    9. "Created": "2021-12-12T16:19:44.154286168+08:00",
    10. "Scope": "local",
    11. "Driver": "bridge",
    12. "EnableIPv6": false,
    13. "IPAM": {
    14. "Driver": "default",
    15. "Options": {},
    16. "Config": [
    17. {
    18. "Subnet": "172.200.0.0/16",
    19. "Gateway": "172.200.0.1"
    20. }
    21. ]
    22. },
    23. "Internal": false,
    24. "Attachable": false,
    25. "Ingress": false,
    26. "ConfigFrom": {
    27. "Network": ""
    28. },
    29. "ConfigOnly": false,
    30. "Containers": {},
    31. "Options": {},
    32. "Labels": {}
    33. }
    34. ]