Skip to main content
  1. Posts/

Using Bridge Network in Docker

·4 mins·
docker docker
Table of Contents

Dalam istilah Docker, bridge network digunakan untuk memungkinkan container–container yang terhubung pada network bridge yang sama dapat saling berkomunikasi, sekaligus mengisolasi container tersebut dari container lain yang tidak tergabung dalam network bridge yang sama.

Docker bridge driver secara otomatis mengonfigurasi aturan jaringan pada mesin host, sehingga container yang berada pada network bridge yang berbeda tidak dapat berkomunikasi secara langsung satu sama lain.

Menggunakan Default Bridge Network
#

Pada pengujian ini, kita akan membuat dua container menggunakan image Alpine Linux untuk menguji komunikasi pada default bridge network.

Membuat Container
#

docker run -dit --name alpine1 alpine ash
docker run -dit --name alpine2 alpine ash

Memastikan Container Berjalan
#

docker container ls

Contoh output:

CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS         PORTS     NAMES
e8960d257fea   alpine    "ash"     7 seconds ago    Up 6 seconds             alpine2
3674b7e97db3   alpine    "ash"     10 seconds ago   Up 8 seconds             alpine1

Inspect Network Bridge
#

Gunakan perintah berikut untuk melihat container yang terhubung ke default bridge network:

docker network inspect bridge

Contoh potongan output:

...
{
  "3674b7e97db3d2e3709498bc2b381c118d163c1d93492f93a898cffdab555d64": {
    "Name": "alpine1",
    "EndpointID": "8b8f8e59285714296d1d3ce40ee5f7c7ad8db1e4805e16e61d12b3bcd32271e5",
    "MacAddress": "02:42:ac:11:00:02",
    "IPv4Address": "172.17.0.2/16",
    "IPv6Address": ""
  },
  "e8960d257fea38ee7827e7245fe1a3596e065a83018c52feaa28bea8490e6068": {
    "Name": "alpine2",
    "EndpointID": "29970c6b62c082038d8c8a6e5f28dba6bf88058a3b826e7769fe88870fc6ede9",
    "MacAddress": "02:42:ac:11:00:03",
    "IPv4Address": "172.17.0.3/16",
    "IPv6Address": ""
  }
}
...

Terlihat bahwa kedua container mendapatkan alamat IP pada subnet yang sama (172.17.0.0/16).

Test Konektivitas Antar Container
#

Masuk ke shell container alpine1:

docker exec -it alpine1 sh

Lakukan ping ke IP container alpine2:

# ping -c4 172.17.0.3
PING 172.17.0.3 (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.152 ms
64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.097 ms
64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.087 ms
64 bytes from 172.17.0.3: seq=3 ttl=64 time=0.107 ms

Output di atas menunjukkan bahwa kedua container berhasil berkomunikasi karena berada pada network bridge yang sama.

Test Menggunakan Nama Container
#

Sekarang coba lakukan ping menggunakan nama container:

# ping -c4 alpine2
ping: bad address 'alpine2'

Hasil ini menunjukkan bahwa default bridge network tidak menyediakan DNS-based container name resolution. Oleh karena itu, container hanya dapat diakses menggunakan alamat IP, bukan nama container.

Keluar dari shell container: CTRL + D

Menghentikan dan Menghapus Container
#

docker stop alpine1 alpine2
docker rm alpine1 alpine2

Menggunakan User-Defined Bridge Network
#

Berbeda dengan default bridge, user-defined bridge network menyediakan fitur tambahan seperti DNS internal, sehingga container dapat saling berkomunikasi menggunakan nama container, bukan hanya alamat IP.

Membuat Network Bridge
#

Buat sebuah user-defined bridge network dengan nama net-priv:

docker network create --driver bridge net-priv

Melihat Daftar Network
#

docker network ls

Contoh output:

NETWORK ID     NAME       DRIVER    SCOPE
a348ab0b6139   bridge     bridge    local
c066dfd4012a   host       host      local
4bef5690ba4e   net-priv   bridge    local
266a0a91f950   none       null      local

Topologi Container
#

Selanjutnya buat tiga container dengan topologi sebagai berikut:

flowchart TD %% Definisi Node A(net-priv) B[alpine1] C[alpine2] D(bridge) E[alpine3] %% Definisi Koneksi A o--o B A o--o C D o--o E
  • alpine1 dan alpine2 terhubung ke net-priv
  • alpine3 terhubung ke default bridge

Membuat Container
#

docker run -dit --name alpine1 --network net-priv alpine ash
docker run -dit --name alpine2 --network net-priv alpine ash
docker run -dit --name alpine3 alpine ash

Inspect Network net-priv
#

docker network inspect net-priv | jq '.[].Containers'

Contoh output:

{
  "394332126aedc7bca965499c853511236dd4bc0f626db25fcffd004466e89dc8": {
    "Name": "alpine1",
    "EndpointID": "c278cac84164596c5e0af8ac28f16fcb88ba64fd3185121cea91a2cec2cfe22d",
    "MacAddress": "02:42:ac:12:00:02",
    "IPv4Address": "172.18.0.2/16",
    "IPv6Address": ""
  },
  "da6d6c97a7b5a7d5ee458095c192b3efb4cadcd7ab6eb3bde2ee7050d91b9ff6": {
    "Name": "alpine2",
    "EndpointID": "64fa8a7830c5585b4ee05e4041e8de013ffd4e63b9c55c828e8a47ae94bea5a7",
    "MacAddress": "02:42:ac:12:00:03",
    "IPv4Address": "172.18.0.3/16",
    "IPv6Address": ""
  }
}

Terlihat bahwa alpine1 dan alpine2 berada pada subnet yang sama (172.18.0.0/16) di network net-priv.

Inspect Default Bridge Network
#

docker network inspect bridge | jq '.[].Containers'

Contoh output:

{
  "8f7ad7db3a8794362a009032133b0f7d58576fe417937d78d68a19ad5eee32fe": {
    "Name": "alpine3",
    "EndpointID": "4853296cfe6f730deb7d368217ee886f4d036ff7f610f8192a228477cd6069b9",
    "MacAddress": "02:42:ac:11:00:02",
    "IPv4Address": "172.17.0.2/16",
    "IPv6Address": ""
  }
}

alpine3 berada pada default bridge dengan subnet yang berbeda (172.17.0.0/16).

Test Konektivitas Antar Container (net-priv)
#

Masuk ke shell container alpine1:

docker exec -it alpine1 sh

Ping ke IP container alpine2:

ping -c4 172.18.0.3

Hasilnya berhasil, menandakan kedua container dapat saling berkomunikasi.

Test Menggunakan Nama Container
#

Coba ping menggunakan nama container:

ping -c4 alpine2

Hasilnya juga berhasil. Hal ini membuktikan bahwa user-defined bridge menyediakan DNS internal, sehingga container dapat diakses menggunakan nama container.

Test Isolasi Antar Network
#

Terakhir, lakukan pengujian konektivitas ke container alpine3 yang berada di network berbeda.

Ping menggunakan IP:

ping -c4 172.17.0.2

Hasil:

100% packet loss

Ping menggunakan nama container:

ping -c4 alpine3
ping: bad address 'alpine3'

Pengujian ini menunjukkan bahwa:

  • Container pada network yang berbeda tidak dapat saling berkomunikasi
  • DNS internal hanya berlaku di dalam network yang sama

Related

Remote Host Docker menggunakan Docker Context
·2 mins
docker docker
Rename Docker Image with Tag
·1 min
docker docker
Install Docker
·4 mins
docker linux docker
Install Desktop di Console GCP
·1 min
docker docker gcp ubuntu
Install Uptime Kuma sebagai Monitoring
·4 mins
linux docker linux monitoring nodejs uptime kuma
Enable LiteSpeed Cache Engine
·1 min
cpanel litespeed cpanel