Bab 4: Operasi Dasar Docker
Bab ini akan memberi kamu pengalaman langsung (hands-on) sekaligus gambaran umum tentang image dan container. Tujuannya adalah mempersiapkan kamu untuk pembahasan yang lebih mendalam di bab-bab berikutnya.
Bab ini dibagi menjadi dua bagian:
- Perspektif Ops
- Perspektif Dev
Bagian Ops berfokus pada cara menjalankan, menghentikan, dan menghapus container, serta mengeksekusi perintah di dalamnya.
Bagian Dev lebih menitikberatkan sisi aplikasi β mulai dari mengambil source code aplikasi, membuat image container, hingga menjalankannya sebagai sebuah container.
Penulis menyarankan kamu membaca kedua bagian dan mengikuti semua contoh yang ada, karena ini akan memberi kamu sudut pandang Dev dan Ops sekaligus. DevOps, siapa takut? π
Perspektif Opsβ
Di bagian ini, kamu akan melakukan semua hal berikut:
- Memastikan Docker berjalan dengan benar
- Mengunduh sebuah image
- Menjalankan container dari image tersebut
- Menjalankan perintah di dalam container
- Menghapus container
Pemasangan Docker pada umumnya akan memasang client dan engine di mesin yang sama, lalu mengonfigurasikannya agar saling terhubung.
Jalankan perintah docker version untuk memastikan keduanya sudah terinstal dan berjalan.
$ docker version
Client: <<--- Start of client response
Version: 28.1.1 ----β
API version: 1.49 |
Go version: go1.23.8 | Client info block
OS/Arch: darwin/arm64 |
Context: desktop-linux ----β
Server: Docker Desktop 4.42.0 (192140) <<--- Start of server response
Engine: ----β
Version: 28.11 |
API version: 1.49 (minimum version 1.24) |
Go version: go1.23.8 |
OS/Arch: linux/arm64 |
containerd: | Server block
Version: 1.7.27 |
runc: |
Version: 1.2.5 |
docker-init: |
Version: 0.19.0 ----β
Jika output dari client dan server terlihat seperti yang ditunjukkan di buku, berarti semuanya berjalan sebagaimana mestinya.
Jika kamu menggunakan Linux dan mendapatkan error βpermission denied while trying to connect to the Docker daemonβ, coba jalankan kembali perintahnya dengan sudo di depannya β misalnya:
sudo docker version
Jika perintah tersebut berhasil dengan sudo, berarti ke depannya kamu perlu menambahkan sudo di depan semua perintah docker.
Mengunduh Imageβ
Image adalah paket yang berisi semua yang dibutuhkan agar aplikasi bisa berjalan, mulai dari filesystem, source code, hingga semua dependency-nya. Bagi kamu yang biasa di bagian operations, image ini seperti template VM. Sedangkan untuk developer, image bisa diibaratkan seperti class.
Jalankan perintah docker images sebagai berikut:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Kalau kamu baru saja memasang Docker dan belum pernah menambahkan image apa pun, seharusnya hasilnya kosong seperti contoh di atas. Tapi kalau kamu pakai Multipass, mungkin ada image dengan nama portainer/portainer-ce.
Mengambil image baru ke Docker host disebut pulling. Mari kita coba pull image nginx:latest.
$ docker pull nginx:latest
latest: Pulling from library/nginx
ad5932596f78: Download complete
e4bc5c1a6721: Download complete
1bd52ec2c0cb: Download complete
411a98463f95: Download complete
df25b2e5edb3: Download complete
e93f7200eab8: Download complete
Digest: sha256:fb197595ebe76b9c0c14ab68159fd3c08bd067ec62300583543f0ebda353b5be
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
Jalankan lagi perintah docker images untuk memastikan perintah pull sukses.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest fb197595ebe7 10 days ago 280MB
Di bab-bab berikutnya, kita akan membahas di mana image disimpan dan apa saja isi di dalamnya. Untuk saat ini, yang perlu kamu tahu adalah bahwa image berisi cukup banyak komponen sistem operasi (OS), serta seluruh kode dan dependensi yang dibutuhkan untuk menjalankan sebuah aplikasi. Image NGINX yang kamu unduh berisi versi Linux yang sudah dipangkas, beserta aplikasi web server NGINX.
Menjalankan container dari sebuah imageβ
Jika kamu mengikuti langkah-langkah sebelumnya, sekarang kamu sudah memiliki image nginx:latest dan bisa menggunakan perintah docker run untuk menjalankan sebuah container dari image tersebut.
Jalankan perintah docker run berikut untuk membuat dan menjalankan container baru bernama test dari image nginx:latest.
$ docker run --name test -d -p 8080:80 nginx:latest
e08c3535...30557225
Angka panjang yang ditampilkan menunjukkan bahwa container tersebut berhasil dibuat.
Mari kita bahas sebentar perintah docker run tadi.
docker run memberi tahu Docker untuk menjalankan sebuah container baru. Opsi --name memberi nama test pada container tersebut, dan opsi -d membuat container berjalan di latar belakang (detached mode) sehingga tidak mengambil alih terminal kamu. Opsi -p memberitahu Docker untuk memetakan port 80 di dalam container ke port 8080 di host Docker kamu. Terakhir, perintah tersebut memberi tahu Docker agar menggunakan image nginx:latest sebagai basis container.
Jalankan perintah docker ps untuk meliaht container yang berjalan.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e08c35352ff3 nginx:latest "/docker..." 3 mins ago Up 2 mins 0.0.0.0:8080->80/tcp test
Kamu seharusnya mengenali CONTAINER ID dari angka panjang yang muncul setelah perintah docker run dijalankan. Kamu juga akan melihat kolom IMAGE, PORTS, dan NAMES, yang semuanya berasal dari opsi-opsi yang kamu tentukan di perintah docker run. Kolom COMMAND menunjukkan perintah yang dijalankan Docker untuk memulai aplikasi NGINX di dalam container.
Menajalankan Perintah di Containerβ
Jalankan perintah beirkut untuk menghubungkan local shell ke Bash yang ada di dalam container.
$ docker exec -it test bash
root@e08c35352ff3:/#
Terminal kita sekarang akan berubah menandakan kalau sekarang sudah terhubung ke shell yang ada di dalam container itu sendiri.
Jalankan perintah berikut untuk melihat isi direktori saat ini.
root@e08c35352ff3:/# ls -l
total 64
lrwxrwxrwx 1 root root 7 Jan 2 00:00 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Oct 31 11:04 boot
drwxr-xr-x 5 root root 340 Jan 12 15:09 dev
drwxr-xr-x 1 root root 4096 Jan 3 02:56 docker-entrypoint.d
-rwxr-xr-x 1 root root 1620 Jan 3 02:56 docker-entrypoint.sh
drwxr-xr-x 1 root root 4096 Jan 12 15:09 etc
Jika kamu sudah tahu Linux, maka kamu akan mengenal file dan direktori stsandard yang ada di Linux ini.
Coba jalankan perintah ps untuk melihar program yang sedang berjalan.
root@e08c35352ff3:/# ps -elf
bash: ps: command not found
Perintah tersebut tidak ada karena mayoritas container hanya berisi program-progam penting yang mereka butuhkan saja untuk membuat ukurannya sekecil mungkin. Nantinya penulis akan memperlihatkan bagaimana caranya memakai Docker Desktop dan Docker Debug untuk terhubung ke suatu container dan menjalankan perintah yang tidak tersedia secara langsung di dalam container tesebut.
Ketik exit untuk mengakhiri proses bash tadi dan kembali ke shell di local terminal.
Jalankan perintah berikut untuk memastikan container test masih jalan.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e08c35352ff3 nginx:latest "/docker..." 7 mins ago Up 7 mins 0.0.0.0:8080->80 test
Container masih berjalan dan kamu bisa lihat container ini dibuat 7 menit yang lalu dan sudah berjalan selama 7 menit juga.
Menghapus Containerβ
Stop dan kill container dengan perintah docker stop dan docker rm.
$docker stop test
test
Akan butuh waktu beberapa detik bagi container untuk berhenti beroperasi.
$ docker rm test
test
Pastikan container dihapus dengan benar dengan menjalankan perintah docker ps dengan flag -a untuk menampilkan semua container bahkan yang sudah berhenti.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Selamat, kamu sudah berhasil melakukan pull image Docker, memulai container baru dengan image tersebut, masuk ke dalamnya dan mengeksekusi perintah di dalamnya, menghentikan operasi container serta menghapusnya.
Perspektif Devβ
Container pada dasarnya berfokus pada aplikasi.
Di bagian ini, kamu akan menyelesaikan semua langkah berikut:
- Clone aplikasi dari repositori GitHub
- Lihat isi Dockerfile
- Containerize aplikasi tersebut ((di-container-kan))
- Jalankan aplikasi sebagai container
Salin perintah di bawah ini untuk mengunduh repositori sehingga bisa di-containerize di langkah selanjutnya. Kamu akan membutuhkan git untuk menyelesaikanya.
$ git clone https://github.com/nigelpoulton/psweb.git
Cloning into 'psweb'...
remote: Enumerating objects: 63, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 63 (delta 13), reused 25 (delta 9), pack-reused 29
Receiving objects: 100% (63/63), 13.29 KiB | 4.43 MiB/s, done.
Resolving deltas: 100% (21/21), done.
Masuk ke direktori psweb dan lihat isinya.
$ cd psweb
$ ls -l
total 32
-rw-r--r--@ 1 nigelpoulton staff 324 5 Feb 12:31 Dockerfile
-rw-r--r-- 1 nigelpoulton staff 378 5 Feb 12:31 README.md
-rw-r--r-- 1 nigelpoulton staff 341 5 Feb 12:31 app.js
-rw-r--r--@ 1 nigelpoulton staff 355 5 Feb 12:47 package.json
drwxr-xr-x 3 nigelpoulton staff 96 5 Feb 12:31 views
Aplikasi yang kita unduh adalah web app berbasis Node.js yang menjalankan beberapa file HTML statis.
Meninjau Isi Dockerfileβ
Dockerfile adalah dokumen teks yang memberi tahu Docker bagaimana cara membangun aplikasi beserta semua dependensinya menjadi sebuah image.
Tampilkan isi Dockerfile tersebut.
$ cat Dockerfile
FROM alpine
LABEL maintainer="nigelpoulton@hotmail.com"
RUN apk add --update nodejs npm curl
COPY . /src
WORKDIR /src
RUN npm install
EXPOSE 8080
ENTRYPOINT ["node", "./app.js"]
Kamu akan mempelajari lebih banyak tentang Dockerfile di bagian-bagian selanjutnya dari buku ini. Untuk saat ini, yang perlu kamu pahami adalah bahwa setiap baris di dalam Dockerfile merepresentasikan sebuah instruksi yang dijalankan Docker untuk membangun sebuah image.
Proses Containerisasiβ
Jalankan perintah docker build berikut untuk membuat image baru berdasarkan instruksi yang ada di Dockerfile. Perintah ini akan menghasilkan sebuah image Docker bernama test:latest.
Pastikan kamu menjalankannya dari dalam direktori psweb dan jangan lupa menyertakan tanda titik (.) di bagian akhir perintah.
$ docker build -t test:latest .
[+] Building 36.2s (11/11) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
<Snip>
=> => naming to docker.io/library/test:latest 0.0s
=> => unpacking to docker.io/library/test:latest 0.7s
Setelah proses build selesai, pastikan kamu sekarang memiliki sebuah image bernama test:latest.
$ docker images
REPO TAG IMAGE ID CREATED SIZE
test latest 0435f2738cf6 21 seconds ago 160MB
Selamat kamu telah melakukan containerasasi (containerized) aplikasi tadi. Itulah istilah untuk membangun sebuah image container yang berisi suatu aplikasi beserta semua dependensinya.
Menjalankan Aplikasi Sebagai Containerβ
Jalankan perintah berikut untuk memulai sebuah container bernama web1 dari image sebelumnya. Jika kamu menggunakan Widnows, ganti backslash (\) dengan backtick (`) jalan jalankan di satu baris tanpa backslash.
$ docker run -d \
--name web1 \
--publish 8080:8080 \
test:latest
Buka browser dan arahkan ke nama DNS atau alamat IP dari host Docker kamu pada port 8080.
Jika kamu menggunakan Docker Desktop, buka localhost:8080 atau 127.0.0.1:8080. Jika kamu menggunakan Multipass, buka alamat 192.168.x.x milik VM Multipass kamu pada port 8080. Kamu bisa menjalankan perintah ip a | grep 192 dari dalam VM Multipass, atau multipass ls dari mesin lokal untuk menemukan alamat IP-nya.
Kamu akan melihat halaman sebagai berikut.

Selamat. Kamu sudah berhasil mengundauh kode aplikasi dari suatu repositori Git, membangun Docker image-nya, dan menjalankannya sebagai sebuah container. Proses inilah yang dinamakan containerisasi (containerizing) sebuah aplikasi.
Bersih-bersihβ
Jalankan perintah-perintah berikut untuk menghentikan container dan menghapus image yang sudah kamu buat.
$ docker rm web1 -f
web1
$ docker rmi test:latest
Untagged: test:latest
Deleted: sha256:0435f27...cac8e2b
Ringkasanβ
Di bagian Ops pada bab ini, kamu telah mengunduh sebuah image Docker, menjalankan container, masuk ke dalam container, mengeksekusi perintah di dalamnya, lalu menghentikan dan menghapus container tersebut.
Di bagian Dev, kamu meng-container-kan sebuah aplikasi sederhana dengan mengambil source code dari GitHub dan membuatnya menjadi sebuah image menggunakan instruksi di Dockerfile. Setelah itu, kamu menjalankan aplikasi tersebut sebagai sebuah container.
Semua hal yang kamu pelajari di bab ini akan menjadi bekal penting untuk bab-bab berikutnya.