Docker网络管理跨主机网络互联之Macvlan篇

Macvlan 是 Docker 网络驱动程序之一,它允许容器直接与主机网络进行交互,仿佛它们是物理网络中的独立设备。使用 Macvlan 网络,容器可以拥有自己的 MAC 地址,并通过物理网络接口直接与网络上的其他设备通信。

  1. 在两个节点中同时创建Macvlan网络
[root@docker101 ~]# docker network create -d macvlan \
   --subnet=172.16.1.0/24 \
   --gateway=172.16.1.1 \
   -o parent=ens33 macvlan_network
ce79165719f328c1cc6059064dc3e3ecd711dd9208dc13a4a312ae3e8140d38a
[root@docker101 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
fecc19944be1   bridge            bridge    local
3d74238575bd   host              host      local
ce79165719f3   macvlan_network   macvlan   local
ddb169d385b0   none              null      local
[root@docker101 ~]# docker network inspect macvlan_network
[
    {
        "Name": "macvlan_network",
        "Id": "ce79165719f328c1cc6059064dc3e3ecd711dd9208dc13a4a312ae3e8140d38a",
        "Created": "2024-07-30T22:44:19.327181002+08:00",
        "Scope": "local",
        "Driver": "macvlan",
        "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": {
            "parent": "ens33"
        },
        "Labels": {}
    }
]

● --subnet:指定网络的子网。
● --gateway:指定网关地址。
● -o parent:指定要使用的主机网络接口(例如 eth0)。

  1. 在两个几点中同时运行容器并指定网络类型为macvlan和IP,注意运行容器网络类型指定为macvlan时,需要指定IP
# 节点1
[root@docker101 ~]# docker run --rm -d -it --network macvlan_network --ip 172.16.1.10 nginx:1.25.4-alpine
35347396da4d8734ec98934cc3819b542213e1c08f4faa3c8bbf40655831f461
[root@docker101 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS     NAMES
35347396da4d   nginx:1.25.4-alpine   "/docker-entrypoint.…"   3 seconds ago   Up 3 seconds             priceless_agnesi
[root@docker101 ~]# docker exec -it priceless_agnesi sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:01:0A
          inet addr:172.16.1.10  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:60 (60.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

# 节点2
[root@docker102 ~]# docker run --rm -d -it --network macvlan_network --ip 172.16.1.20 nginx:1.25.4-alpine
9cbacef7f2f7cff3e7155bea41de791558a1d7e96e43fa3d98232f260c2e46e4
[root@docker102 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS     NAMES
9cbacef7f2f7   nginx:1.25.4-alpine   "/docker-entrypoint.…"   2 seconds ago   Up 2 seconds             nifty_almeida
[root@docker102 ~]# docker exec -it nifty_almeida sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:01:14
          inet addr:172.16.1.20  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


# 节点2ping节点1
/ # ping 172.16.1.10
PING 172.16.1.10 (172.16.1.10): 56 data bytes
64 bytes from 172.16.1.10: seq=0 ttl=64 time=0.544 ms
64 bytes from 172.16.1.10: seq=1 ttl=64 time=0.391 ms

# 可以发现容器内无法连接外网
/ # ping www.baidu.com
ping: bad address 'www.baidu.com'

这样就实现了容器跨主机互联,但是现在两个容器间不能连接外网,所以要解决这个问题,可以使用docker network connect命令
docker network connect [OPTIONS] NETWORK CONTAINER

# 节点1为容器添加网络
[root@docker101 ~]# docker network connect bridge priceless_agnesi
[root@docker101 ~]# docker inspect priceless_agnesi
...
            "Networks": {
            # 在macvlan网络的基础上添加了bridge类型的网络
                "bridge": {
                    "IPAMConfig": {},
                    "Links": null,
                    "Aliases": [],
                    "NetworkID": "fecc19944be103614c71a6902e9a5eea06f8ce3329930304e4c1bd96507e20e3",
                    "EndpointID": "76dbc1399b1aa7240f1a9ef59c358d5cc434a5f50bac487750eca02097bc8f38",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": {}
                },
                "macvlan_network": {
                    "IPAMConfig": {
                        "IPv4Address": "172.16.1.10"
                    },
                    "Links": null,
                    "Aliases": [
                        "35347396da4d"
                    ],
                    "NetworkID": "ce79165719f328c1cc6059064dc3e3ecd711dd9208dc13a4a312ae3e8140d38a",
                    "EndpointID": "8a347dc6b54f826228ab28feb52a796c638cfd0697d8fd459359e8db769d16e9",
                    "Gateway": "172.16.1.1",
                    "IPAddress": "172.16.1.10",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:10:01:0a",
                    "DriverOpts": null
                }
...
[root@docker101 ~]# docker exec -it  priceless_agnesi sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:01:0A
          inet addr:172.16.1.10  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:26 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1819 (1.7 KiB)  TX bytes:280 (280.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:648 (648.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

# 同理为节点2添加网络
[root@docker102 ~]# docker network connect bridge nifty_almeida
[root@docker102 ~]# docker exec -it nifty_almeida sh
/ # ping www.baidu.com -c 3
PING www.baidu.com (36.155.132.3): 56 data bytes
64 bytes from 36.155.132.3: seq=0 ttl=127 time=29.505 ms
64 bytes from 36.155.132.3: seq=1 ttl=127 time=30.158 ms
64 bytes from 36.155.132.3: seq=2 ttl=127 time=30.222 ms

--- www.baidu.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 29.505/29.961/30.222 ms

# 网络联通了,可以访问外网了

在运行容器时不指定IP,会照成IP冲突

# 节点1
[root@docker101 ~]# docker run --rm -d -it --network macvlan_network  nginx:1.25.4-alpine
26c3b35af97dccdc437deadce0c850c58371bbe23a600272f100f8822f14c466
[root@docker101 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS     NAMES
26c3b35af97d   nginx:1.25.4-alpine   "/docker-entrypoint.…"   9 seconds ago   Up 8 seconds             condescending_jennings
[root@docker101 ~]# docker exec -it condescending_jennings sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:01:02
          inet addr:172.16.1.2  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:60 (60.0 B)  TX bytes:0 (0.0 B)

# 节点2
[root@docker102 ~]# docker run --rm -d -it --network macvlan_network  nginx:1.25.4-alpine
656d343cc1ac2d0fadcd93c9459d656ac5c5bd0f6d1ccc75c9b6e25fffbd33c9
[root@docker102 ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS         PORTS     NAMES
656d343cc1ac   nginx:1.25.4-alpine   "/docker-entrypoint.…"   9 seconds ago   Up 7 seconds             infallible_taussig
[root@docker102 ~]# docker exec -it infallible_taussig sh
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:10:01:02
          inet addr:172.16.1.2  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:120 (120.0 B)  TX bytes:0 (0.0 B)

# 两个容器的ip相同
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值