Back to all posts

Using IPvlan network in Docker

April 25, 2023
Anonymous

Driver IPvlan memberikan kontrol penuh kepada operator atas pengalamatan IPv4 dan IPv6. IPvlan memiliki dua mode operasi yang dapat digunakan, yaitu:

  • ipvlan_mode=l2
  • ipvlan_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

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

Jika opsi -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 parent mengarah ke NIC fisik yang terhubung ke jaringan tersebut

Contoh Topologi Multi-Host

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

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:

  • alfa10 dan beta10 berada 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:

  • alfa10 berada di VLAN 10
  • beta20 berada 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

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