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 #
flowchart BT
%% Definisi Node
subgraph "Jaringan Fisik & Host"
direction LR
B(["Network Router
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 ashTest Konektivitas Antar Container #
Masuk ke container alfa1, lalu lakukan ping ke alfa2.
ping -c4 192.168.12.8Container juga dapat diakses menggunakan nama container karena Docker menyediakan DNS internal.
ping -c4 alfa2Test Konektivitas ke Router #
ping -c4 192.168.12.1Jika 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 #
flowchart BT
%% Definisi Node dengan ID dan Label
A([Gateway
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 #
flowchart TD
subgraph "Docker Host #1"
direction LR
dh1_ens160["ens160"]
dh1_vlan10["VLAN 10 Interface"]
dh1_vlan20["VLAN 20 Interface"]
end
subgraph "Docker Host #2"
direction LR
dh2_vlan10["VLAN 10 Interface"]
dh2_vlan20["VLAN 20 Interface"]
end
subgraph "Network Endpoints"
alfa10["alfa10
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 20ens224 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 upPastikan 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-vlan20Setiap 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 ashVerifikasi 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 alfa10Docker 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 ashVerifikasi 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 beta10Test 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 #
flowchart TD
%% Definisi Node Host
730663["docker host #2
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-privMembuat Container #
docker run -dit --rm --name alfa --network net-priv alpine ashContainer 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-privMembuat Container #
docker run -dit --rm --name beta --network net-priv alpine ashContainer 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 ens224Docker Host #2 #
sudo ip route add 10.10.11.0/24 via 10.7.7.9 dev ens224Tanpa 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