Menggunakan Dockerfile dan Docker Compose

Pengenalan Docker

Docker merupakan platform kontainerisasi yang memungkinkan kita untuk mengemas aplikasi beserta dependensinya ke dalam satu wadah (kontainer) yang bisa dijalankan pada berbagai environment. Dengan adanya docker, developer menjadi dipermudah dalam membuat, menguji dan menyebarkan aplikasi yang dibuat dengan lebih konsisten. Manfaat-manfaat dari penggunaan docker antara lain:

  1. Portabilitas: Aplikasi yang dikemas dalam kontainer Docker dapat dijalankan di berbagai environment termasuk di mesin lokal, server, dan cloud.

  2. Isolasi: Kontainer Docker berjalan dalam isolated environment, artinya dipastikan bahwa aplikasi dan dependensinya tidak saling bertabrakan.

  3. Efisiensi: Kontainer menggunakan resource jauh lebih efisien dibandingkan dengan VMs, karena mereka tidak melakukan instalasi sistem operasi di setiap kontainer.

  4. Kemudahan Pengelolaan: Docker menyediakan alat untuk mengelola siklus hidup container, termasuk pembuatan, penyebaran, dan penghapusan.

Dockerfile

Dockerfile adalah file teks yang berisikan sejumlah instruksi untuk membuat image Docker. Instruksi di dalam Dockerfile akan menentukan bagaimana nantinya konfigurasi suatu environment di dalam container, dari aplikasi saja yang harus diinstal, dan bagaimana aplikasi tersebut harus dijalankan. Ibarat suatu resep masakan, yang mana di dalamnya terdapat bahan-bahan dan langkah yang harus diikuti untuk membuat masakan tersebut. Begitu pula dengan Dockerfile, yang mana isinya adalah bahan dan langkah yang harus diikuti untuk membuat suatu image docker. Untuk membangun image docker, Dockerfile memiliki berbagai instruksi yang bisa dijalankan. Berikut adalah beberapa instruksi dasar dalam Dockerfile:

  • FROM: Menentukan base image yang akan digunakan.

  • WORKDIR: Menentukan direktori kerja di dalam container.

  • COPY: Menyalin file dari host ke container.

  • RUN: Menjalankan perintah di dalam container selama proses build.

  • CMD: Menentukan perintah yang dijalankan ketika container mulai berjalan.

  • LABEL: Menambahkan metadata ke image Docker.

  • ADD: Menyalin file dari host atau URL ke container.

FROM

Instruksi FROM digunakan untuk menentukan base image yang akan digunakan sebagai dasar untuk membangun image baru. Base image adalah titik awal untuk membangun image kita.

Contoh:

FROM python:3.9

Instruksi di atas berarti kita akan menggunakan image Python versi 3.9 sebagai dasar untuk membangun image baru. Base image ini sudah berisi instalasi Python 3.9.

WORKDIR

Instruksi WORKDIR menetapkan direktori kerja di dalam container. Semua instruksi berikutnya dalam Dockerfile akan dieksekusi relatif terhadap direktori ini.

Contoh:

WORKDIR /code

Dalam instruksi di atas, direktori kerja ditetapkan ke path /code. Sehingga seluruh perintah nantinya bakal dijalankan di dalam direktori ini.

COPY

Instruksi COPY digunakan untuk menyalin file atau direktori dari host (komputer lokal Anda) ke image Docker.

Contoh:

COPY requirements.txt /code/

Instruksi di atas menyalin file requirements.txt dari direktori saat ini di host ke direktori /code/ di dalam image Docker.

RUN

Instruksi RUN digunakan untuk menjalankan perintah di dalam container selama proses build. Biasanya digunakan untuk menginstal dependensi atau menjalankan skrip konfigurasi.

Contoh:

RUN pip install -r requirements.txt

Instruksi di atas menjalankan perintah pip install -r requirements.txt di dalam container untuk menginstal semua dependensi yang tercantum dalam file requirements.txt.

CMD

Instruksi CMD digunakan untuk menentukan perintah default yang akan dijalankan ketika container mulai berjalan.

Contoh:

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Instruksi di atas menentukan bahwa perintah pythonmanage.pyrunserver 0.0.0.0:8000 akan dijalankan ketika container mulai berjalan. Perintah ini akan menjalankan server pengembangan Django pada alamat 0.0.0.0 dan port 8000.

LABEL

Instruksi LABEL digunakan untuk menambahkan metadata ke image Docker. Metadata ini dapat digunakan untuk memberikan informasi tambahan tentang image, seperti pemelihara (maintainer) image tersebut.

Contoh:

LABEL maintainer="your-email@example.com"

Instruksi di atas menambahkan label maintainer dengan nilai your-email@example.com ke image Docker.

ADD

Instruksi ADD digunakan untuk menyalin file atau direktori dari host atau URL ke container. ADD juga dapat mendeteksi dan mengekstrak arsip (seperti file .tar).

Contoh:

ADD . /code

Instruksi di atas menyalin semua file dan direktori dari direktori saat ini di host ke direktori /code di dalam image Docker.

COPY Instruction

Instruksi COPY juga digunakan untuk menyalin file atau direktori dari host ke container. Namun, tidak seperti ADD, COPY hanya mendukung penyalinan dari sistem file host.

Contoh:

COPY requirements.txt /code/

Instruksi di atas menyalin file requirements.txt dari direktori saat ini di host ke direktori /code/ di dalam image Docker.

Contoh Dockerfile Lengkap

Berikut adalah contoh Dockerfile lengkap untuk aplikasi Django:

# Gunakan image python sebagai base
FROM python:3.9

# Set working directory
WORKDIR /code

# Salin file requirements.txt
COPY requirements.txt /code/

# Install dependencies
RUN pip install -r requirements.txt

# Salin kode aplikasi
COPY . /code/

# Set environment variable
ENV DJANGO_SETTINGS_MODULE=todoproject.settings

# Jalankan server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Penjelasan:

  1. FROM python:3.8: Menggunakan image Python versi 3.8 sebagai dasar.

  2. WORKDIR /code: Menetapkan direktori kerja ke /code.

  3. COPY requirements.txt /code/: Menyalin file requirements.txt dari host ke container.

  4. RUN pip install -r requirements.txt: Menginstal semua dependensi yang tercantum dalam file requirements.txt.

  5. COPY . /code/: Menyalin semua file dan direktori dari host ke container.

  6. ENV DJANGO_SETTINGS_MODULE=todoproject.settings: Menetapkan variabel lingkungan DJANGO_SETTINGS_MODULE ke todoproject.settings.

  7. CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]: Menjalankan perintah untuk memulai server pengembangan Django.

Docker Compose

Docker Compose adalah tool yang digunakan untuk mendefinisikan dan menjalankan beberapa container Docker. Docker Compose memungkinkan kita untuk mendefinisikan dan mengelola aplikasi multi-container. Dengan menggunakan file konfigurasi YAML, kita bisa mendefinisikan layanan, jaringan, dan volume yang dibutuhkan oleh aplikasi kita.

Menginstall Docker Compose

Docker Compose merupakan bagian terpisah dari Docker yang perlu diinstal secara terpisah. Namun, di dalam versi Docker terbaru, Docker Compose sudah termasuk dalam instalasi Docker Desktop. Untuk memeriksa apakah Docker Compose sudah terinstal, kita bisa menjalankan perintah berikut:

docker-compose --version

Kita juga bisa menggunakan perintah docker compose --version (tanpa tanda -). Namun pada artikel ini kita akan menggunakan docker-compose .

File Konfigurasi

File konfigurasi Docker Compose memiliki format YAML yang berisi definisi layanan, jaringan, dan volume. Nama default untuk file konfigurasi ini adalah docker-compose.yml.

YAML

YAML (YAML Ain't Markup Language) adalah bahasa serialisasi data yang digunakan untuk menulis file konfigurasi. YAML mirip dengan JSON tetapi lebih mudah dibaca dan ditulis oleh manusia.

Contoh sederhana file YAML:

version: '3.8'

services:
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: tododb
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password

Membuat Container

Untuk membuat container dengan Docker Compose, kita bisa menggunakan perintah docker-compose up. Perintah ini akan membangun image dan menjalankan container berdasarkan definisi di file docker-compose.yml.

Menjalankan Container

Untuk menjalankan container, kita bisa menggunakan perintah berikut:

docker-compose up

Melihat Container

Untuk melihat status container yang dikelola oleh Docker Compose, kita bisa menggunakan perintah:

docker-compose ps

Menghentikan Container

Untuk menghentikan container, kita bisa menggunakan perintah:

docker-compose stop

Menghapus Container

Untuk menghentikan dan menghapus semua container, jaringan, dan volume yang terkait, gunakan perintah:

docker-compose down

Project Name

Nama proyek Docker Compose secara default diambil dari nama direktori tempat file docker-compose.yml berada. Kita bisa mengganti nama proyek dengan menggunakan opsi -p pada perintah Docker Compose.

docker-compose -p myproject up

Kesimpulan

Dockerfile dan Docker Compose merupakan tool yang sangat berguna untuk mengelola aplikasi berbasis container. Dockerfile memungkinkan kita untuk mendefinisikan environment dan dependensi aplikasi kita ke dalam satu file, sedangkan Docker Compose memudahkan pengelolaan aplikasi multi-container. Dengan memahami dan menggunakan kedua tool ini, kita bisa membangun, mengelola, dan menjalankan aplikasi kita dengan lebih efisien dan konsisten.