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:
alpine1danalpine2terhubung ke net-privalpine3terhubung 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