Cara Manage Network di Docker
Secara default container menggunakan network driver tipe bridge dengan nama bridge. Network driver lain yang tersedia yaitu host, overlay, dan macvlan.
Network driver
- bridge: menghubungkan container yang memakai nama bridge yang sama
- host: menghapus network isolation antara container dan Docker host, secara langsung menggunakan network milik host
- overlay: menghubungkan beberapa Docker daemon bersama-sama dan memungkinkan swarm service berkomunikasi satu sama lain
- macvlan: memungkinkan menetapkan MAC address ke container, membuatnya muncul sebagai perangkat fisik di network
- none: menonaktifkan semua network. Biasanya digunakan bersama dengan custom network driver
- Network plugins: menginstall dan menggunakan third-party network plugin yang tersedia di Docker Hub atau dari third-party vendor
Bridge network
Menampilkan network yang tersedia di Docker.
1 | docker network ls |
Contoh hasil perintah di atas, menampilkan network default, belum ada network yang ditambahkan sendiri.
1 2 3 4 | NETWORK ID NAME DRIVER SCOPE 1652fc7934a6 bridge bridge local 547776771fe2 host host local a4d149a845ae none null local |
Default bridge network
Membuat dua container dengan nama container node1 dan node2, image nginx:stable-alpine, dan tanpa mendefinisikan opsi network.
1 2 | docker run -d --name node1 nginx:stable-alpine docker run -d --name node2 nginx:stable-alpine |
Menampilkan informasi detail container.
1 | docker inspect node1 |
Informasi network dari container terdapat pada bagian Networks. Container menggunakan network driver bridge. 12 karakter pertama (1652fc7934a6) NetworkID sama dengan NETWORK ID yang ditampilkan sebelumnya pada hasil perintah docker network ls dengan NAME dan DRIVER bridge.
1 2 3 4 5 6 7 8 9 10 11 | ... "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "1652fc7934a653e3852e24f289219ea1255292133d625563bf5905947a313d98", "EndpointID": "ce80598649bf6500e4fb6799f76801908bc9e69a7535fb8241a64a6cb7418b04", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", ... |
IP address 172.17.0.2 dan Gateway 172.17.0.1. Gateway menggunakan network interface dan IP dari Docker0 di host.
1 2 3 4 5 6 7 8 9 10 | ifconfig docker0 docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:b0ff:fe4b:4ff9 prefixlen 64 scopeid 0x20<link> ether 02:42:b0:4b:4f:f9 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5 bytes 526 (526.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 |
Menampilkan informasi network dengan nama bridge.
1 | docker network inspect bridge |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ... "Containers": { "aba5c5373c2dc5cf0c416d4c9a64334f060d05a84695dbcfbb3866bb7722d036": { "Name": "node1", "EndpointID": "ce80598649bf6500e4fb6799f76801908bc9e69a7535fb8241a64a6cb7418b04", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" }, "f0667f59710ee4a62299f6943a38f0b40bbe09ee950b6e62d8b35fc6bdb71b2f": { "Name": "node2", "EndpointID": "d272a549bdb743c4206eb4ef17fc10981c9cbb3a51c38e2fad22afd55175f374", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, ... |
Container yang menggunakan bridge network dapat dilihat informasinya pada bagian Containers. Terdapat dua container yaitu node1 dengan IP address 172.17.0.2 dan node2 dengan IP address 172.17.0.3.
Uji ping dari container node1 ke node2.
1 | docker exec node1 ping 172.17.0.3 |
Hasil perintah di atas.
1 2 3 4 | 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.119 ms 64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.134 ms 64 bytes from 172.17.0.3: seq=2 ttl=64 time=0.107 ms |
CTRL+C untuk menghentikan ping.
Membuat Bridge Network
Container yang menggunakan default bridge network tidak dapat secara otomatis berkomunikasi menggunakan hostname dari container, hanya dapat menggunakan IP address. Misalnya tidak bisa ping node2 hanya bisa ping 172.17.0.3.
Untuk dapat berkomunikasi dengan menggunakan hostname, definisikan IP-host di file /etc/hosts container secara manual. Cara lainnya, container menggunakan bridge network yang dibuat sendiri (user-defined bridge).
Membuat bridge network dengan nama net-web.
1 | docker network create net-web |
Menampilkan network.
1 2 3 4 5 6 7 | docker network ls NETWORK ID NAME DRIVER SCOPE 1652fc7934a6 bridge bridge local 547776771fe2 host host local 2aa8cf07ab2e net-web bridge local a4d149a845ae none null local |
Membuat Container dengan opsi network
Pada saat membuat container dapat sekaligus menghubungkannya ke network.
Membuat container dan menghubungkannya ke network dengan nama net-web.
1 2 | docker run -d --name node1 --network net-web nginx:stable-alpine docker run -d --name node2 --network net-web nginx:stable-alpine |
Uji ping dari container node1 ke node2.
1 2 3 4 5 6 | docker exec node1 ping node2 PING node2 (172.19.0.3): 56 data bytes 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.145 ms 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.100 ms 64 bytes from 172.19.0.3: seq=2 ttl=64 time=0.117 ms |
Menghubungkan container yang sudah ada
Container yang sudah ada sebelumnya dapat dihubungkan ke network.
Menghubungkan container node1 dan node2 ke network net-web.
1 2 | docker network connect net-web node1 docker network connect net-web node2 |
Melepaskan container node1 dari network net-web.
1 | docker network disconnect net-web node1 |
Perintah docker network
Menampilkan semua network.
1 | docker network ls |
Membuat network.
1 | docker network create nama-network |
Menghubungkan container ke network.
1 | docker network connect nama-network nama-container |
Melepaskan container dari network.
1 | docker network disconnect nama-network nama-container |
Menampilkan informasi detail network.
1 | docker network inspect nama-network |
Menghapus network.
1 | docker network rm nama-network |
Menghapus semua network yang tidak terpakai.
1 | docker network prune |
Selamat mencoba 🙂