Skip to main content
  1. Posts/

Using IPvlan network in Docker

·6 mins·
docker docker
Table of Contents

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
#

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
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
#

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 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
#

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-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

Related

Using Bridge Network in Docker
·4 mins
docker docker
Setup NFS Server With Docker
·2 mins
docker docker
Using Host Network in Docker
·1 min
docker docker
Using Overlay Network in Docker
·2 mins
docker docker
Building Docker Images with Dockerfiles
·1 min
docker docker
Remote Host Docker menggunakan Docker Context
·2 mins
docker docker