Driver IPvlan memberikan kontrol penuh kepada operator atas pengalamatan IPv4 dan IPv6. IPvlan memiliki dua mode operasi yang dapat digunakan, yaitu:
ipvlan_mode=l2ipvlan_mode=l3
Jika Anda menggunakan dua atau lebih Docker host, IPvlan dapat digunakan untuk menghubungkan container antar host tanpa harus menggabungkan host tersebut ke dalam Docker Swarm.
IPvlan Mode L2 #
Pada mode L2, container akan berada pada broadcast domain yang sama dengan interface parent di host. Setiap container mendapatkan IP langsung dari subnet fisik yang sama dengan host.
Topologi #
192.168.12.1/28"]) A["Docker Host
192.168.12.2/28"] end %% Definisi Jaringan Docker BRIDGE["net-pub
(bridge network)"] %% Definisi Container C("alfa1
192.168.12.7/28") D("alfa2
192.168.12.8/28") %% Hubungan/Koneksi A -- "ens160" --- B A -.->|"manages"| BRIDGE C --- BRIDGE D --- BRIDGE
Membuat Network IPvlan #
docker network create -d ipvlan \
--subnet 192.168.12.0/28 \
--gateway 192.168.12.1 \
-o ipvlan_mode=l2 \
-o parent=ens160 \
net-pub
-o ipvlan_mode tidak ditentukan, Docker akan menggunakan mode L2 secara default.
Membuat Container #
docker run -dit --name alfa1 --network net-pub --ip 192.168.12.7 alpine ash
docker run -dit --name alfa2 --network net-pub --ip 192.168.12.8 alpine ash
Test Konektivitas Antar Container #
Masuk ke container alfa1, lalu lakukan ping ke alfa2.
ping -c4 192.168.12.8
Container juga dapat diakses menggunakan nama container karena Docker menyediakan DNS internal.
ping -c4 alfa2
Test Konektivitas ke Router #
ping -c4 192.168.12.1
Jika konfigurasi benar, container dapat langsung berkomunikasi dengan router/gateway tanpa NAT.
IPvlan L2 Antar Docker Host #
Pendekatan yang sama dapat digunakan untuk menghubungkan container yang berada pada Docker host berbeda, selama:
- Host-host tersebut berada pada layer-2 network yang sama
- Menggunakan subnet dan gateway yang sama
- Interface
parentmengarah ke NIC fisik yang terhubung ke jaringan tersebut
Contoh Topologi Multi-Host #
192.168.12.1/28]) B[Docker Host #1
192.168.12.2/28] C[Docker Host #2
192.168.12.3/28] D(alfa
192.168.12.7/28) E(beta
192.168.12.8/28) %% Definisi Koneksi dengan Label yang Benar B -- "ens160" --> A C -- "ens160" --> A D -- "docker0" --> B E -- "docker0" --> C
Catatan Penting:
-
Network IPvlan tidak menggunakan
docker0 -
Opsi
-o parent=harus diisi dengan interface fisik yang:- Mengarah ke router atau gateway
- Berada pada subnet yang sama dengan IP container
-
Pastikan switch jaringan mengizinkan multiple MAC/IP pada satu port (tidak ada port security ketat)
IPvlan 802.1Q Trunk – Mode L2 #
Pada skenario ini, IPvlan L2 digunakan di atas interface VLAN (802.1Q). Setiap VLAN direpresentasikan sebagai interface Linux terpisah, lalu digunakan sebagai parent untuk network IPvlan.
Pendekatan ini memungkinkan:
- Pemisahan trafik berbasis VLAN
- Container berada langsung pada subnet VLAN masing-masing
- Koneksi antar container lintas Docker host tanpa Swarm
Topologi #
10.10.10.5/24"] beta10["beta10
10.10.10.6/24"] alfa20["alfa20
20.20.20.5/24"] beta20["beta20
20.20.20.6/24"] end %% Koneksi dari Host #1 ke Host #2 (Trunk Link) dh1_ens160 ---|Trunk Link| dh2_vlan10 dh1_ens160 ---|Trunk Link| dh2_vlan20 %% Alternatif: Jika trunk-nya adalah link tunggal %% dh1_ens160 ---|VLAN 10 & 20 Trunk| dh2_ens160 %% Koneksi Host #1 ke Endpoint-nya dh1_vlan10 --- alfa10 dh1_vlan20 --- alfa20 %% Koneksi Host #2 ke Endpoint-nya dh2_vlan10 --- beta10 dh2_vlan20 --- beta20 %% Styling opsional untuk membedakan VLAN classDef vlan10 fill:#e6f3ff,stroke:#007bff,stroke-width:2px; classDef vlan20 fill:#fff0e6,stroke:#ff8c00,stroke-width:2px; class dh1_vlan10,alfa10,beta10 vlan10; class dh1_vlan20,alfa20,beta20 vlan20;
Membuat Interface VLAN #
Jalankan perintah berikut di kedua Docker host.
sudo ip link add link ens224 name vlan10 type vlan id 10
sudo ip link add link ens224 name vlan20 type vlan id 20
ens224 merupakan interface fisik yang:
- Terhubung ke jaringan trunk
- Digunakan untuk melewatkan VLAN 10 dan VLAN 20
Mengaktifkan Interface VLAN #
sudo ip link set vlan10 up
sudo ip link set vlan20 up
Pastikan interface VLAN sudah UP sebelum digunakan sebagai parent IPvlan.
Membuat Docker Network IPvlan #
docker network create -d ipvlan \
--subnet 10.10.10.0/24 \
--gateway 10.10.10.1 \
-o ipvlan_mode=l2 \
-o parent=vlan10 \
net-vlan10
docker network create -d ipvlan \
--subnet 20.20.20.0/24 \
--gateway 20.20.20.1 \
-o ipvlan_mode=l2 \
-o parent=vlan20 \
net-vlan20
Setiap network IPvlan:
- Terikat ke satu VLAN
- Berada pada broadcast domain VLAN tersebut
- Memberikan IP langsung ke container tanpa NAT
Anda dapat menambahkan lebih dari satu subnet dan gateway pada VLAN yang sama, selama:
- Subnet tidak saling overlap
- Routing di jaringan fisik mendukung
Create Container #
Buat container pada masing-masing Docker host menggunakan network net-vlan10 dan net-vlan20.
Docker Host #1 #
docker run -dit --rm --name alfa10 --network net-vlan10 --ip 10.10.10.5 alpine ash
docker run -dit --rm --name alfa20 --network net-vlan20 --ip 20.20.20.5 alpine ash
Verifikasi container yang berjalan:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce3d612e952c alpine "ash" 27 seconds ago Up 26 seconds alfa20
f043cb332ca3 alpine "ash" 48 seconds ago Up 47 seconds alfa10
Docker Host #2 #
docker run -dit --rm --name beta10 --network net-vlan10 --ip 10.10.10.6 alpine ash
docker run -dit --rm --name beta20 --network net-vlan20 --ip 20.20.20.6 alpine ash
Verifikasi container:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6c536cc8d7e0 alpine "ash" 12 seconds ago Up 12 seconds beta20
c7c41bcfc582 alpine "ash" 17 seconds ago Up 15 seconds beta10
Test Konektivitas (Ping) #
Masuk ke container alfa10, lalu lakukan ping ke container pada Docker host #2.
Ping ke beta10 (VLAN 10)
#
ping -c4 10.10.10.6
✅ Berhasil, karena:
alfa10danbeta10berada pada VLAN 10- Keduanya berada pada broadcast domain yang sama
- IPvlan L2 meneruskan frame Layer-2 secara langsung
Ping ke beta20 (VLAN 20)
#
ping -c4 20.20.20.6
❌ Gagal, karena:
alfa10berada di VLAN 10beta20berada di VLAN 20- Tidak ada routing antar VLAN
IPvlan Mode L3 #
Pada IPvlan mode L3, setiap Docker host bertindak sebagai router (gateway) untuk network container yang berada di host tersebut.
Karakteristik utama IPvlan L3:
- Setiap network IPvlan berada pada subnet yang berbeda
- Tidak ada broadcast antar container
- Container tidak terhubung langsung ke jaringan fisik
- Routing dilakukan oleh Docker host
Topologi #
10.7.7.10/30"] 671715["docker host #1
10.7.7.9/30"] %% Subgraph untuk jaringan virtual di host #1 subgraph "Docker Host #1" direction TB 671715_Host["docker host #1
(Gateway)"] 341575["alfa
10.10.11.2/24"] 671715_Host --- 341575 end %% Subgraph untuk jaringan virtual di host #2 subgraph "Docker Host #2" direction TB 730663_Host["docker host #2
(Gateway)"] 705934["beta
10.10.12.2/24"] 730663_Host --- 705934 end %% Koneksi antar host (Point-to-Point) 671715_Host -- "ens224
10.7.7.9/30 --- 10.7.7.10/30" --- 730663_Host %% Styling opsional untuk membedakan style 341575 fill:#f9f,stroke:#333,stroke-width:2px style 705934 fill:#ccf,stroke:#333,stroke-width:2px
Konfigurasi Docker Host #1 #
Membuat Network IPvlan L3 #
docker network create -d ipvlan \
--subnet 10.10.11.0/24 \
-o ipvlan_mode=l3 \
-o parent=ens224 \
net-priv
Membuat Container #
docker run -dit --rm --name alfa --network net-priv alpine ash
Container alfa akan mendapatkan IP dari subnet 10.10.11.0/24, dengan Docker host #1 sebagai gateway.
Konfigurasi Docker Host #2 #
Membuat Network IPvlan L3 #
docker network create -d ipvlan \
--subnet 10.10.12.0/24 \
-o ipvlan_mode=l3 \
-o parent=ens224 \
net-priv
Membuat Container #
docker run -dit --rm --name beta --network net-priv alpine ash
Container beta berada pada subnet 10.10.12.0/24, dengan Docker host #2 sebagai gateway.
Static Routing Antar Host #
Agar container pada host yang berbeda dapat saling berkomunikasi, masing-masing Docker host harus mengetahui rute ke subnet container di host lain.
Docker Host #1 #
sudo ip route add 10.10.12.0/24 via 10.7.7.10 dev ens224
Docker Host #2 #
sudo ip route add 10.10.11.0/24 via 10.7.7.9 dev ens224
Tanpa static route ini:
- Paket akan berhenti di Docker host
- Tidak ada mekanisme auto-discovery seperti pada L2
Test Konektivitas #
Masuk ke container alfa dan lakukan ping ke container beta.
ping -c4 10.10.12.2
✅ Berhasil, karena:
- Docker host bertindak sebagai router
- Static route sudah dikonfigurasi
- IPvlan L3 meneruskan paket antar subnet