Koneksi antar Container pada Docker

2 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Koneksi antar container pada Docker
Docker Logo (Hak Cipta: Docker Inc.)

TeknoCerdas.com – Salam cerdas untuk kita semua. Pada aplikasi berbasis Docker koneksi antar container adalah hal yang krusial. Misalnya sebuah container web perlu melakukan koneksi ke container database. Hubungan antar container ini dapat dengan mudah dilakukan dengan Docker Compose.

Namun pada tulisan ini TeknoCerdas tidak menggunakan Docker Compose akan tetapi memanfaatkan fitur bawaan dari Docker yaitu network.

Dengan koneksi antar container, maka komunikasi dapat dilakukan menggunakan nama dari container daripada alamat IP. Hal ini sangat berguna saat development tetapi mungkin kurang praktis ketika digunakan pada production jika jumlah container bertambah secara otomatis. Pada production orkestrasi container seperti Docker Swarm atau Kubernetes lebih tepat.

Untuk simulasi kita akan menggunakan tiga container. Docker image yang akan digunakan Alpine Linux karena dari segi ukuran cukup kecil untuk keperluan simulasi ini.

Nama containerNetworkImage
web1demoalpine:3.12
web2tidak adaalpine:3.12
dbdemoalpine:3.12

Membuat Docker Network

Agar antar container dapat saling melakukan koneksi maka container perlu ditempatkan pada network yang sama.

$ docker network create demo

Perintah diatas akan membuat sebuah network baru bernama demo. Gunakan perintah inspect untuk melihat detil dari network demo yang baru dibuat.

$ docker network inspect demo
[
    {
        "Name": "demo",
        "Id": "e71bf945c3fa6911cc5a61abd2912807f676299a7c95a70c2badfddba58ea9b6",
        "Created": "2020-10-11T04:50:19.555918794Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

Menghubungkan antar Container

Untuk melakukan koneksi antar container setiap container harus dihubungkan pada network yang sama yaitu “demo”. Dalam simulasi ini yang dapat berhubungan adalah container web1 dan db. Container web2 tidak dapat terhubung karena tidak terkait dengan network “demo”.

Buka terminal session baru untuk membuat container web1.

$ docker run --name web1 -it --network demo --rm --entrypoint /bin/sh alpine:3.12

Buka terminal session baru untuk membuat container web2. Pada web2 tidak menggunakan konfigurasi network demo.

$ docker run --name web -it --rm --entrypoint /bin/sh alpine:3.12

Pada terminal web1 coba lakukan ping ke container web2.

/ # ping web2
ping: bad address 'web2'

Dapat terlihat bahwa container web1 tidak dapat menghubungi container web2. Sekarang coba ke terminal session web2 dan lakukan ping ke web1.

/ # ping web1
ping: bad address 'web1'

Ternyata hasilnya sama, kedua container tidak dapat melakukan koneksi.

Buka terminal session baru untuk membuat container db.

$ docker run --name db -it --network demo --rm --entrypoint /bin/sh alpine:3.12

Lakukan ping pada web1 dari container db.

/ # ping -c 4 web1
PING web1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.345 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.188 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.185 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.226 ms

--- web1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.185/0.236/0.345 ms

Dapat terlihat jika container db dapat melakukan koneksi ke container web1. Pada terminal web1 coba lakukan ping ke container db.

/ # ping -c 4 db
PING db (172.18.0.3): 56 data bytes
64 bytes from 172.18.0.3: seq=0 ttl=64 time=0.499 ms
64 bytes from 172.18.0.3: seq=1 ttl=64 time=0.190 ms
64 bytes from 172.18.0.3: seq=2 ttl=64 time=0.206 ms
64 bytes from 172.18.0.3: seq=3 ttl=64 time=0.209 ms

--- db ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.190/0.276/0.499 ms

Koneksi dari container web1 ke container db dapat dilakukan dengan sukses.

Menghubungkan Container yang Sudah Berjalan

Bagaimana jika ingin menghubungkan antar container jika container tersebut sudah berjalan? Kita ambil contoh container web2. Saat ini container web2 tidak terhubung dengan network demo. Untuk menghubungkannya ke dalam network demo gunakan perintah berikut.

$ docker network connect demo web2

Sekarang pada terminal session container web2 coba lakukan ping ulang ke web1. Seharusnya sekarang web2 dapat melakukan koneksi ke web1.

/ # ping -c 4 web1
PING web1 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.192 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.201 ms
64 bytes from 172.18.0.2: seq=2 ttl=64 time=0.208 ms
64 bytes from 172.18.0.2: seq=3 ttl=64 time=0.220 ms

--- web1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.192/0.205/0.220 ms

Dapat dilihat bahwa koneksi antar container pada Docker dapat dengan mudah dilakukan memanfaatkan fitur dari Docker network.