Skip to main content
Background Image
  1. Teches/

Docker: A Powerful Containerization Platform (+ Lazydocker)

··2794 words·14 mins· ·
Wildan
Author
Wildan
An Ordinary Human Being
Table of Contents

Docker
#

At A Glance
#

Pernahkah kalian mendengar Docker?

Jika kalian adalah software developer atau minimal seorang tech-enthusiast seperti saya, sudah dipastikan kalian tau Docker. Tapi, biarkan saya tetap menjelaskan Docker di artikel ini.

What is Docker?
#

Docker adalah sebuah layanan open-source yang menyediakan kemampuan untuk mengemas dan menjalankan sebuah aplikasi dalam lingkungan terisolasi yang disebut sebagai “container”.1 Docker memungkinkan kita untuk menjalankan software yang tidak bergantung pada dependensi yang terpasang di host.2 Dengan demikian, proses pengembangan software menjadi lebih cepat.

Sejarahnya, Docker pertama kali diperkenalkan ke publik pada acara PyCon di tahun 2013 oleh pembuatnya, yaitu Solomon Hykes.3 Di tahun-tahun berikutnya, perkembangan Docker di banyak sistem operasi mulai masif. Misalnya, di tahun 2016, Docker untuk Mac dan Windows rilis ke publik.

Apa itu container? Kita akan lihat apa itu container sambil membandingkannya dengan Virtual Machine (VM) di bawah ini.

Container vs Virtual Machine (VM)
#

Container adalah software yang mengemas/membungkus kode berikut dengan dependensinya sehingga sebuah aplikasi dapat berjalan dengan cepat dan dapat diandalkan (reliable) meskipun di environment yang berbeda.4 Selain Docker, Podman adalah salah satu platform kontainerisasi juga.

Catatan:

Salah satu permasalahan di dunia software development adalah ketidak-compatible-an sebuah aplikasi dengan lingkungan barunya.

Contohnya, ketika saya mengembangkan (re: membuat) sebuah aplikasi online chatting, saya tentu membuatnya di komputer atau laptop pribadi saya (intinya satu komputer). Akan tetapi, ketika saya ingin agar aplikasi tersebut di-test atau bahkan diproduksi (dirilis), aplikasi tersebut akan berpindah lingkungan (komputer) yang berbeda-beda, mulai dari sistem operasinya, arsitekturnya, versinya, dan lain sebagainya. Dengan demikian, aplikasi saya tersebut memiliki kemungkinan tidak berjalan dengan baik di lingkungan barunya tersebut. Solusi konvensionalnya adalah, saya sebagai developer-nya, perlu membuat banyak versi dari aplikasi online chatting tersebut agar dapat berjalan dengan baik di lingkungannya masing-masing. Misalnya, aplikasi versi Linux, aplikasi versi Mac, dan aplikasi versi Windows.

Nah, dengan adanya containerization (sistem kontainer) ini, saya tidak perlu mengkhawatirkan permasalahan di atas dan dapat membuat satu aplikasi saja. Sebab, saya dapat meng-kontainerisasi (membuat image container) aplikasi saya tersebut ketika akan di-test atau di-deploy ke produksi (dirilis). Dengan adanya sistem containerization ini, semua orang di sistem yang berbeda akan tetap dapat menjalankan aplikasi online chatting saya itu tanpa harus terkendala sistem operasi yang berbeda, arsitektur yang berbeda, versi yang berbeda, dan lain sebagainya.

Virtual Machine di sisi lain adalah sebuah virtualisasi atau emulasi dari komputer fisik.5 Virtual machine memungkinkan kita untuk menjalankan banyak sistem operasi dalam satu sistem operasi saja. Software yang meng-handle proses virtualisasi ini disebut Hypervisor. Beberapa hypervisor yang populer ada Virtualbox, VMWare, dan Virt-Manager.6

Berikut adalah perbandingan Container & Virtual Machine:

ss1
Container VS Virtual Machine. Source: docker.com

AspekContainerVirtual Machine (VM)
ArsitekturBerbagi kernel host OSMenggunakan hypervisor + guest OS
UkuranRingan (MB)Lebih besar (GB)
Waktu startupSangat cepat (detik)Lebih lambat (menit)
IsolasiIsolasi proses (lebih ringan)Isolasi penuh (lebih kuat)
KinerjaMendekati native (lebih efisien)Ada overhead dari hypervisor
PortabilitasSangat tinggi (mudah dipindahkan)Lebih kompleks
Resource usageLebih hemat resourceLebih boros resource
Sistem operasiBerbagi OS hostBisa menjalankan OS berbeda
KeamananLebih rendah dibanding VMLebih tinggi karena isolasi penuh
DeploymentMudah & cepat (CI/CD friendly)Lebih kompleks
Use case utamaMicroservices, aplikasi cloud-nativeAplikasi legacy, isolasi penuh
Contoh teknologiDocker, KubernetesVMware, VirtualBox, Hyper-V

Installation
#

Berikut adalah cara meng-install docker di beberapa sistem operasi Linux:

DistroCommand
Debian/Ubuntusudo pacman -Sy docker
Arch Linuxsudo pacman -Sy docker
Fedorasudo dnf install docker
Opensusesudo zypper install docker

NixOS:
Masukkan baris berikut di file konfigurasi (/etc/nixos/configuration.nix):

  environment.systemPackages = [
    pkgs.docker
  ];

Atau jika menggunakan nix-shell:

nix-shell -p docker

Untuk memastikan docker sudah ter-install:

docker -v
docker version

ss25
docker version

Berikut adalah tautan official Docker:

Website: https://github.com/docker
Github: https://github.com/docker

Set Up
#

1. Starting docker
#

Untuk memulai Docker daemon, gunakan perintah:

sudo docker systemctl start docker

Untuk memastikan Docker daemon berjalan otomatis setelah login:

sudo systemctl enable docker

2. Stopping docker
#

Untuk mematikan Docker daemon, gunakan perintah:

sudo systemctl stop docker
sudo systemctl stop docker.socket

Untuk me-non-aktifkan Docker daemon dari berjalan otomatis setiap login:

sudo systemctl disable docker
sudo systemctl disable docker.socket

3. Adding docker group
#

Secara default, Docker daemon berjalan sebagai root user sehingga setiap kali user non-root mengeksekusi perintah docker, perintah sudo diperlukan. Jika kita ingin agar perintah docker dapat dieksekusi tanpa perlu sudo, berikut caranya:7

  1. Buat grup docker
sudo groupadd docker
  1. Tambahkan user kita ke grup docker.
sudo usermod -aG docker $USER
  1. Logout & login kembali agar perubahan bisa teraktivasi.

  2. Jika malas logut, aktivasi perubahan tersebut dengan perintah:

newgrp docker
  1. Konfirmasi
docker run hello-world

Essential Commands
#

Berikut adalah perintah-perintah penting untuk melakukan manajemen container di Docker.89

docker search#

Mencari docker image dari Docker Registry, seperti DockerHub:

docker search <image_name>

ss2
docker search

docker pull
#

Mengambil (men-download) docker image:

docker pull <image_name>

ss3
docker pull

docker images
#

Melihat daftar docker image yang ada di komputer:

sudo docker images

ss7
docker images

docker login
#

Perintah ini selain akan me-login-kan kita ke Docker.
Kredensial docker disimpan di komputer lokal (/home/$USER/.docker/config.json).

Login ke docker:

docker login -u <username>

Catatan:

Jika belum punya akun, maka kita perlu membuat akun (register) terlebih dahulu di website official Docker: https://www.docker.com/

ss4
docker login

docker logout
#

Perintah ini selain akan me-logout-kan kita ke Docker.
Kredensial docker dihapus di komputer lokal (/home/$USER/.docker/config.json).

docker logout

ss5
docker logout

docker build
#

Membuat docker image dari Dockerfile di current directory:

docker build -t <image_name> .

Membuat docker image tanpa cache:

docker build --no-cache -t <image_name>

Misalnya, saya ingin membuat sebuah docker image dari file app.py berikut menggunakan Dockerfile:

ss12
docker build

Tinggal jalankan perintah docker build tanpa cache tersebut, dia akan mengunduh dependensi yang diperlukan dan membuat docker image-nya:

ss13
docker build

Berikut adalah isi file app.py:

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "hello world!"

if __name__ == "__main__":
    app.run(host="0.0.0.0")

Dan isi file Dockerfile-nya:

FROM python:3.14.3-alpine
RUN pip install --upgrade pip
RUN pip install flask
CMD ["python","app.py"]
COPY app.py /app.py

Sumber: congnitiveclass.ai/courses/docker-essentials

docker push
#

Menambahkan (meng-upload) docker image:

docker tag <local-image>:<tagname> <username>/<new-repo>:<tagname>
docker push <username>/<new-repo>:<tagname>

Catatan:

Jika belum punya repository, kita perlu membuatnya terlebih dahulu.

ss23
docker push

Docker image-nya akan muncul di repository kita:

ss24
docker image in dockerhub repo

docker ps
#

Melihat container yang sedang berjalan:

docker ps 

ss8
docker ps

Melihat semua container, termasuk yang sedang tidak berjalan:

docker ps -a

ss9
docker ps -a

docker rm
#

Menghapus satu atau lebih container:

docker rm -f <container_name / container_id>

ss10
docker rm

docker rmi
#

Menghapus satu atau lebih docker image:

docker rmi -f <image_name>

ss11
docker rmi

docker run
#

Menjalankan docker image sebagai container:

docker run <image_name>

ss14-1
docker run

Kita bisa lihat, container-nya sudah berjalan:

ss14-2
docker run

docker start
#

Menjalankan container:

docker start <container_id>

ss15
docker start

docker restart
#

Me-restart container:

docker restart <container_id>

ss16
docker restart

docker stop
#

Menghentikan container:

docker stop <container_id>

ss17
docker stop

docker logs
#

Melihat log dari sebuah container:

docker logs <container_id>

ss18
docker logs

docker stats
#

Melihat alokasi resource yang dipakai oleh container:

docker stats

ss19
docker stats

docker inspect
#

Melihat informasi detail sebuah container:

docker inspect <container_id>

ss20
docker inspect

docker network
#

Melihat daftar network:

docker network ls

ss21
docker network ls

Melihat detail sebuah network:

docker network inspect <network_name>

ss22
docker network inspect

docker volume
#

Volume Docker secara default berada di /var/lib/docker/volumes.

Untuk membuat volume baru:

docker volume create <volume_name>

Untuk melihat daftar volume yang tersedia:

docker volume ls

Untuk melihat informasi detail suatu volume:

docker volume inspect <volume_name>

Untuk menghapus volume:

docker volume rm <volume_name>

ss32
docker volume

docker help
#

Masih banyak lagi perintah-perintah docker lainnya yang belum dibahas di artikel ini. Tapi, kalian dapat mengeksplorasinya sendiri dengan perintah:

docker help # atau
docker -h

Saya coba lampirkan juga video Youtube tutorial untuk pemula.
Worth watching.

Docker Compose
#

Docker Compose adalah sebuah alat dari Docker untuk mendefinisikan dan menjalankan banyak container dengan satu file konfigurasi.10 Jadi, melalui Docker Compose, jika kita ingin menjalankan banyak container, kita gak perlu membuat perintah docker run ... atau docker start ... satu persatu, tapi cukup dengan satu perintah Docker Compose aja.

At A Glance
#

Pada prakteknya, kita hanya perlu sebuah file konfigurasi (YAML file) yang dijalankan dengan Docker Compose, seperti ini:

docker compose docker-compose.yml

Apa saja yang perlu “dideklarasikan” atau “didefinisikan” dalam file konfigurasi tersebut? Berikut adalah 3 komponen utama yang ada di dalam file konfigurasi Docker Compose:1112

  1. Services

Bagian services digunakan untuk mendefinisikan setiap kontainer yang akan menjadi bagian dari aplikasi kita. Inilah the pith of the configuration file alias bagian yang paling penting dalam file konfigurasi Docker Compose kita. Oleh kaerna karena itu, tanpa bagian services ini, Docker Compose belum bisa berjalan.

  1. Networks

Bagian networks digunakan untuk mendefinisikan jaringan Docker yang akan digunakan. Jika kita tidak mendefinisikan networks di file konfigurasi, Docker akan otomatis menggunakan jaringan default-nya (bridge).

  1. Volumes

Bagian networks digunakan untuk mendefinisikan penyimpanan aplikasi yang tidak bergantung pada container. Artinya, data aplikasi tidak akan hilang meski kontainernya berhenti atau di-restart.

Sehingga, nanti, secara umum, seperti inilah isi file docker-compose.yml kalian:

services:
  service1:
    image: ...
    ports: ...
    volumes: ...
    environment: ...

  service2:
    build: ...
    depends_on: ...

networks:
  ...

volumes:
  ...

Sampai sini, kita tidak perlu khawatir jika masih belum memahami secara utuh komponen-komponen tersebut. Kita akan lihat secara langsung implementasinya di bagian-bagian berikutnya pada artikel ini.

Installation
#

Berikut adalah cara meng-install docker compose di beberapa sistem operasi Linux:

DistroCommand
Debian/Ubuntusudo pacman -Sy docker-compose
Arch Linuxsudo pacman -Sy docker-compose
Fedorasudo dnf install docker-compose
Opensusesudo zypper install docker-compose

NixOS:
Masukkan baris berikut di file konfigurasi (/etc/nixos/configuration.nix):

  environment.systemPackages = [
    pkgs.docker-compose
  ];

Atau jika menggunakan nix-shell:

nix-shell -p docker-compose

Untuk memastikan docker-compose sudah ter-install:

docker-compose -v # atau
docker compose version 

ss26
docker compose version

Docker Compose juga bisa dilihat di repository Github milik Docker:

Essential Commands
#

Sebelum menjalankan perintah-perintah di bawah ini, kita perlu membuat sebuah skema untuk Docker Compose kita. Skemanya sederhana, saya akan menjalankan container nginx yang akan menampilkan halaman web berisi sebuah sapaan.13

Berikut adalah struktur direktori skema ini:

.
├── app
│   └── index.html
└── docker-compose.yml

Berikut file konfigurasinya (docker-compose.yml):

services:
  web:
    image: nginx:alpine
    ports:
      - "8000:80"
    volumes:
      - ./app:/usr/share/nginx/html

Keterangan:

  • images: nginx: alpine
    Bagian ini artinya, kita akan membuat sebuah container bernama “web” yang akan menggunakan image “nginx” versi alpine (sehingga ukurannya kecil dan ringan).
  • ports: “8000:80”
    Bagian ini artinya, kita akan mapping port 80 di container ke port 8000 di host. Artinya, kalau saya buka http://localhost:8000 di browser, sebenarnya saya sedang mengakses nginx di dalam container di port 80.
  • volumes: ./app:/usr/share/nginx/html
    Bagian ini artinya, kita akan me-mounting (memasang) folder/direktori ./app di komputer saya ke folder/direktori /usr/share/nginx/html di dalam container. Artinya, semua isi folder/direktori ./app akan langsung disajikan oleh nginx, tanpa perlu rebuild container-nya.

Seperti terlihat, file konfigurasi Docker Compose ini hanya memiliki 1 dari 3 komponen utama yang sudah dijelaskan sebelumnya, yaitu services. Meskipun demikian, Docker Compose sudah dapat berjalan karena bagian services adalah bagian paling penting dalam file konfigurasi Docker Compose.

Berikut adalah file webnya (app/index.html):

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Docker Compose Demo</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>

    <h1>This is a Docker Compose Demo Page.</h1>
    <p>This content is being served by an Nginx container.</p>

</body>
</html>

Berikut adalah perintah-perintah penting di Docker Compose:10

docker compose up
#

Menjalankan container dari sebuah file konfigurasi:

docker compose up 

Jika ingin berjalan di background:

docker compose up -d

ss27
docker compose up

Berjalan dengan baik di port 8000:

ss31
Docker Compose: nginx on port 8000

docker compose down
#

Untuk menghentikan kontainer yang sedang berjalan:

docker compose down

ss28
docker compose down

docker compose ps
#

Melihat proses yang sedang berjalan:

docker compose ps

ss29
docker compose ps

docker compose logs
#

Melihat log:

docker compose logs

ss30
docker compose logs

Catatan:

Sampai artikel ini ditulis, perintah-perintah Docker Compose di atas hanya dapat berjalan di direktori yang terdapat file konfigurasinya. Artinya, jika file konfigurasi (docker-compose.yml)-nya ada di direktori atau folder ~/Documents misalnya, sementara kalian menjalankan perintah-perintah Docker Compose tersebut di direktori lain seperti ~/Downloads, maka akan muncul error.

docker compose help
#

Masih banyak perintah-perintah Docker Compose lainnya yang tidak di-cover di artikel ini. Tapi, kalian dapat mengeksplorasinya sendiri di:

docker compose -h # atau
docker compose help

Lazydocker
#

Pernah mendengar lazygit?
Saya pernah menulis tentang lazygit di website ini lho:

Git in A Nutshell (+ Lazygit)
··2417 words·12 mins
A seriously short introduction to Git and Github, with Lazygit as an automation tool for Git. Its not as hard as you assume. Dont overthink it.

At A Glance
#

Mirip seperti lazygit, lazydocker adalah program terpisah (non-official) berbasis CLI yang dibuat untuk “para pemalas” yang enggan mengetikkan perintah-perintah Docker dan Docker Compose di terminal. Program ini juga merupakan tool open source yang juga dibuat oleh orang yang sama yang membuat lazygit. Dengan adanya lazydocker, kita dapat memantau container kita hanya dengan satu interface sederhana ini.

Installation
#

Berikut adalah cara meng-install lazydocker di beberapa sistem operasi Linux:

DistroCommand
Arch Linuxsudo pacman -Sy lazydocker
Opensusesudo zypper install lazydocker

NixOS:
Masukkan baris berikut di file konfigurasi (/etc/nixos/configuration.nix):

  environment.systemPackages = [
    pkgs.lazydocker
  ];

Atau jika menggunakan nix-shell:

nix-shell -p lazydocker

Karena distro Debian/Ubuntu dan Fedora tidak menyediakan lazydocker di repository-nya, jadi, kalian yang menggunakan distro tersebut dapat mengambil binary-nya atau meng-compile-nya langsung dari repository Github lazydocker di sini:

Website official lazydocker: https://lazydocker.com/

lazydocker UI
#

Berikut adalah tampilan (UI / User Interface) lazydocker ketika pertama kali dijalankan:

lazydocker

ss33
lazydocker UI

Perhatikan 3 bagian yang saya highlight tersebut: ada 2 window utama, yaitu window di sebelah kiri dan di sebelah kanan, ditambah satu bagian keybinding (shortcut) di bagian bawah.

  1. Window Kiri

Window di bagian kiri menunjukkan informasi terkait 6 hal:

  • Project: Berisi informasi tentang “Docker Project” yang ada di komputer kita, baik project yang diambil dari Docker Registry (seperti dockerhub) maupun dari Docker Compose.
  • Services: Berisi informasi tentang Services yang ada di komputer kita, berikut statusnya (running / exited).
  • Containers: Berisi informasi tentang Container yang ada di komputer kita, berikut statusnya (running / exited).
  • Images: Berisi informasi tentang Images yang ada di komputer kita, berikut dengan Tag-nya.
  • Volumes: Berisi informasi tentang Volumes yang ada di komputer kita (lokasinya di /var/lib/docker/volumes).
  • Networks: Berisi informasi tentang Networks yang ada di komputer kita.
  1. Windows Kanan

Window di bagian kanan menunjukkan informasi detail dari objek yang kita lihat di Window Kiri. Kita bisa melihat ada beberapa sub-menu-nya juga, dan sub-menu ini berbeda-beda tergantung bagian mana dari 6 bagian yang ada di Window Kiri yang sedang kita buka. Untuk berpindah sub-menu, kita bisa gunakan keybinding (shortcut): [ untuk ke kiri, dan ] untuk ke kanan.

  1. Keybind di Bawah

Bagian ini menunjukkan informasi praktis tentang cara mengoperasikan lazydocker ini, mulai dari cara melakukan scrolling, keluar dari lazydocker, melihat menu atau daftar keybinding yang tersedia, dan bernavigasi dari satu Window ke Window lainnya.

Pro Tip:

Kita juga bisa menekan tombol Shift+? di keyboard untuk melihat daftar keybinding (shortcut) yang tersedia dan dapat digunakan.

How to use
#

docker ps, docker logs, docker stats, docker inspect
#

Keempat perintah tersebut (docker ps, docker logs, docker stats, docker inspect) saya gabung karena memang kita dapat melakukannya dengan (sangat) mudah di lazydocker hanya dengan bernavigasi dari satu Window ke Window lainnya, dari satu sub-menu ke sub-menu lainnya. Semua itu dapat saya lakukan hanya dengan 6 buah tombol di keyboard: arrow up, arrow down, arrow right, arrow left, opening square bracket, closing square bracket.

Perhatikan tombol keyboard yang muncul di bagian bawah video!

Notes: Saya menggunakan showmethekey untuk melihat keystrokes keyboard di Wayland.

docker run, docker start, docker restart, docker stop
#

Lagi-lagi, keempat perintah tersebut (docker run, docker start, docker restart, docker stop) akan saya tunjukkan dalam satu demonstrasi berikut. Sebab, memang akan sangat mudah menjalankan, menghentikan, maupaun menjalankan ulang sebuah container melalui lazydocker ini. Semua itu dapat saya lakukan hanya dengan menekan tombol capital S, s, dan r.

Perhatikan tombol keyboard yang muncul di bagian bawah video!

Untuk bagian Images, Volumes, dan Networks tidak saya bahas di sini, selain karena tidak banyak yang dapat ditunjukkan selain menghapus-hapus Images/Volumes/Networks, juga karena membuat video demonstrasi ini memakan storage yang lumayan besar (1 video berkisar 1 menit bisa berukuran 3-4 MB!). Oleh karena itu, jika kalian sudah paham dasar-dasar pengoperasian lazydocker, kalian bisa mencoba mengeksplorasi bagian-bagian tersebut sendiri!

Oiya, beberapa kekurangan lazydocker yang saya jumpai, terutama terkait dengan perintah-peritah dasar Docker, rupanya, ada beberapa perintah dasar Docker yang belum bisa dilakukan di lazydocker, misalnya seperti:

  • men-download image: docker pull
  • login ke Docker Registry: docker login
  • membuat volumes & networks: docker volume create & docker network create

Sehingga, kita masih memerlukan perintah-perintah manual Docker untuk melakukan operasi tersebut.

Sekian dulu totorial docker dan lazydocker ini.
Terima kasih. Sampai jumpa di artikel saya yang lain!

Related

Step by Step DVWA Installation for Web App Hacking
·669 words·4 mins
DVWA (Damn Vulnerable Webb Apps) is a PHP/MySQL web application that is damn vulnerable~
File/Web Server Options At a Glance
··2101 words·10 mins
A curated file server list that will enhance your productivity, especially as a hobbyist.
A Comparison of 5 Terminal File Managers
A glimpse of terminal-based file managers and their uniquenesses.