Macvlan là một trình điều khiển mạng của Docker cho phép các container giao tiếp trực tiếp với mạng vật lý như những thiết bị độc lập, mỗi container có địa chỉ MAC và IP riêng trên cùng phân đoạn mạng với máy chủ.
1. Tạo mạng Macvlan trên cả hai node
[root@docker101 ~]# docker network create -d macvlan \
--subnet=172.16.1.0/24 \
--gateway=172.16.1.1 \
-o parent=ens33 shared_macvlan
--subnet: Khai báo dải mạng con.--gateway: Thiết lập cổng mặc định.-o parent: Chỉ định giao diện mạng vật lý (ví dụ:ens33).
Lặp lại lệnh tương tự trên node thứ hai (docker102) để đảm bảo cấu hình đồng nhất.
2. Khởi chạy container với địa chỉ IP cố định trên mạng Macvlan
Khi sử dụng mạng Macvlan, bắt buộc phải chỉ định địa chỉ IP tĩnh cho container để tránh xung đột.
# Trên docker101
[root@docker101 ~]# docker run -d --network shared_macvlan --ip 172.16.1.10 --name web1 nginx:1.25.4-alpine
# Trên docker102
[root@docker102 ~]# docker run -d --network shared_macvlan --ip 172.16.1.20 --name web2 nginx:1.25.4-alpine
Sau khi khởi chạy, kiểm tra cấu hình mạng bên trong container:
/ # 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
Các container trên hai máy chủ khác nhau có thể ping lẫn nhau thành công, chứng tỏ liên kết lớp 2 hoạt động tốt. Tuy nhiên, chúng không thể truy cập Internet do mạng Macvlan không cung cấp NAT hoặc gateway ra ngoài.
3. Bổ sung khả năng truy cập Internet bằng cách kết nối thêm mạng bridge
Để giải quyết vấn đề thiếu kết nối Internet, ta gắn thêm mạng bridge mặc định vào container:
# Trên docker101
[root@docker101 ~]# docker network connect bridge web1
# Trên docker102
[root@docker102 ~]# docker network connect bridge web2
Kiểm tra lại giao diện mạng trong container:
/ # ifconfig
eth0 inet addr:172.16.1.10 # Macvlan
eth1 inet addr:172.17.0.2 # Bridge (có NAT qua host)
Lúc này, container có thể vừa giao tiếp nội bộ qua Macvlan, vừa truy cập Internet thông qua giao diện bridge được NAT bởi Docker daemon.
4. Cảnh báo về việc không chỉ định IP khi dùng Macvlan
Nếu không khai báo --ip, Docker sẽ tự động cấp phát từ dải đã cấu hình. Tuy nhiên, vì mạng Macvlan có phạm vi local, mỗi node không biết trạng thái IP của node kia, dẫn đến khả năng cấp trùng địa chỉ:
# docker101
/ # ifconfig eth0 → 172.16.1.2
# docker102
/ # ifconfig eth0 → 172.16.1.2 ← Xung đột!
Do đó, luôn nên quản lý IP thủ công hoặc tích hợp với hệ thống DHCP tập trung khi triển khai Macvlan trên nhiều máy chủ.