> For the complete documentation index, see [llms.txt](https://kawsing.gitbook.io/opensystem/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kawsing.gitbook.io/opensystem/docker-cong-an-zhuang-dao-ying-yong-ru-men-pian/shi-yong-macvlan.md).

# 使用MacVlan(建議使用)

VirtualBox使用注意，需開啟橋接網路混雜模式

<div align="left"><img src="https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkRfqG_f60ulKOtjXqp%2F-LkRgDPB27y0HwXcyyNe%2Fimage.png?alt=media&amp;token=b5af7061-6711-4a5c-8300-5b5693d93de6" alt=""></div>

```
sudo modprobe macvlan
sudo ip link set enp0s3  promisc on

ifconfig enp3s0
enp3s0: flags=4355<UP,BROADCAST,PROMISC,MULTICAST>  mtu 1500
        ether a8:1e:84:35:9f:fe  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

docker network create -d macvlan --subnet 192.168.43.0/24 --gateway 192.168.43.1 -o parent=enp0s3 -o macvlan_mode=bridge macnet
docker network ls
docker run -id --net macnet --ip 192.168.43.5 --name c1 busybox sh

# 查看容器IP

$ docker exec c1 ip a
```

macvlan是kernel的模組 \
192.168.43.0/24是宿主機所在網段\
192.168.43.1是gateway\
&#x20;enp3s0是宿主機接入192.168.43.0/24的網路介面

容器主機上使用enp3s0網卡創建一個192.168.43.0網段的macvlan網絡，macvlan驅動實際上是利用的Linux macvlan內核驅動，這意味著這樣子運行的容器，網路通訊將會直接送到下層vlan。這是目前最高網路效率的驅動。這裡沒有NAT，沒有端口映射，通訊直接通過VLAN送出。

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkMLOH3NC9yVqwLPJJj%2F-LkMLzF0HhwI1K3kgzsZ%2Fimage.png?alt=media\&token=5191ac29-585e-4c72-9f09-176f6f295aa6)

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkMLOH3NC9yVqwLPJJj%2F-LkMM9TY6m3wPAk4PzVU%2Fimage.png?alt=media\&token=6fa3767e-32c1-48bf-8fee-0796dee6dcb0)

容器可以接通往機網路，也能被網際網路access，但是ping HOST機卻不通

```
docker exec c1 ping -c3 192.168.43.65(HOST IP)
PING 192.168.43.65 (192.168.43.65): 56 data bytes

--- 192.168.43.65 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss
```

移除舊 macnet 的 docker network&#x20;

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkRpIaN92xYwQ7VmlF8%2F-LkRs5veCv4neAZyUQ1X%2Fimage.png?alt=media\&token=411bb4ee-fa68-438e-96bf-d1e41a95df9e)

```
sudo modprobe macvlan
sudo ip link set enp0s3  promisc on
#建立新的macvlan network
docker network create -d macvlan --subnet 192.168.43.0/24 --gateway 192.168.43.1 --ip-range 192.168.43.192/27 --aux-address 'host=192.168.43.65' -o parent=enp0s3 -o macvlan_mode=bridge macnet
sudo ip link add serverFarm link enp0s3 type macvlan  mode bridge

sudo ip link set serverFarm up
sudo ip route add 192.168.43.192/27 dev serverFarm

docker run -id --net macnet --name c1 busybox sh
docker exec c1 ping 192.168.43.65
sudo apt install sipcalc
#計算CIDR可用IP範圍
sipcalc 192.168.43.192/27
Usable range        - 192.168.43.193 - 192.168.43.222
#指定容器使用的IP(需在 192.168.43.192/27 範圍中)
docker run -id --net macnet --ip 192.168.43.195 --name c2 busybox sh
```

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkRv8TSwGUXcEyZbHEZ%2F-LkRwRjHU0VDNF5XOyRZ%2Fimage.png?alt=media\&token=f75527f9-5d4e-4243-ba65-893e088008af)

請注意，此處顯示的接口和路由配置不是永久性的 - 如果您要重新啟動主機，則會丟失。如何使其持久化取決於分發。

{% file src="/files/-LkSSEo1x16FexXq7mOE" %}

啟用以個對外服務的nginx站台

```

docker run -id --net macnet --ip 192.168.43.199 --name nginx nginx
```

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkSVnIR_G1oTVeGvw6r%2F-LkSW6956-N8lNJT1c4F%2Fimage.png?alt=media\&token=9a0935d2-73f4-4eac-8623-dc7d9cce7015)

## 透過 portainer 可以看資源使用狀況

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkSZlUFmzlt3eJi50s0%2F-LkS_-EGKWBnu8KW3fsc%2Fimage.png?alt=media\&token=bbda35c5-3f8e-4300-af6b-e90f1fc495c9)

## 如何開機啟動

```
sudo nano /etc/rc.local
#!/bin/sh
card=enp0s3
serverFarmRange=192.168.43.192/27
sudo modprobe macvlan
sudo ip link set $card  promisc on
sudo ip link add serverFarm link $card type macvlan  mode bridge

sudo ip link set serverFarm up
sudo ip route add $serverFarmRange dev serverFarm

exit 0
```

## 如何加入IPv6

#### IPv6 Macvlan Bridge Mode

**Example:** Macvlan Bridge mode, Dual Stack

```
docker network  create  -d macvlan \
	--subnet=192.168.43.0/24 \
	--gateway=192.168.43.1 \
	--subnet=2001:db8:abc8::/64 --gateway=2001:db8:abc8::10
	 -o parent=enp0s3 \
	 -o macvlan_mode=bridge macvlandualstack
```

* Macvlan是Linux的核心支持的網路接口。要求的Linux的核心版本是v3.9-3.19和4.0+。
* 通過為物理網卡創建Macvlan子接口，允許一塊物理網卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在底層物理網路中。從外界看來，就像是把網線分成多股，分別接到了不同的主機上一樣
* Macvlan有四種工作模式：Private、VEPA、Bridge和Passthru。最常用和預設的模式是Bridge模式。
* 物理網路界面收到封包，依據收到包的目的MAC地址判斷這個封包需要交给哪個虛擬網路界面

![](https://529150212-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Lh81JtaIQ84bwQqz_Wh%2F-LkMdA4TCLVu3oSLyn8b%2F-LkMdC-Gwa8zWPcH5etB%2Fimage.png?alt=media\&token=13a84173-b971-4f38-97c2-0600c30cd255)
