Dockerfile dengan Ubuntu: Panduan Lengkap dari Pemula hingga Mahir untuk Membuat Image Docker

目次

1. Pengenalan

Apa Itu Docker dan Dockerfile?

Dalam beberapa tahun terakhir, Docker dengan cepat mendapatkan popularitas sebagai cara efisien untuk menyederhanakan lingkungan pengembangan dan penerapan aplikasi. Docker mengemas aplikasi dan dependensinya ke dalam satu unit yang disebut “kontainer,” yang memungkinkan mereka berjalan secara konsisten di berbagai lingkungan.

Untuk membangun kontainer Docker ini, diperlukan cetak biru yang disebut Dockerfile. Dockerfile adalah file teks yang mendefinisikan gambar sistem operasi dasar, perangkat lunak yang diinstal, variabel lingkungan, dan detail konfigurasi lainnya. Pengembang dapat menggunakannya untuk secara otomatis membangun lingkungan yang disesuaikan.

Mengapa Menggunakan Ubuntu sebagai Gambar Dasar?

Saat membuat Dockerfile, langkah pertama adalah memilih gambar sistem operasi dasar. Di antara banyak opsi yang tersedia, Ubuntu adalah salah satu yang paling populer. Ubuntu adalah distribusi Linux berbasis Debian yang dikenal karena kemudahan penggunaannya dan pengaturan lingkungan yang fleksibel yang didukung oleh ekosistem paket yang luas.

Dockerfile berbasis Ubuntu menawarkan beberapa keuntungan:

  • Dokumentasi resmi dan komunitas yang luas, menghasilkan kurva pembelajaran yang rendah
  • Instalasi paket dan alat yang mudah menggunakan APT
  • Gambar ringan dan minimal yang disediakan secara resmi (seperti ubuntu:20.04 dan ubuntu:24.04 )

Tujuan Artikel Ini dan Target Audiens

Artikel ini berfokus pada kata kunci “Dockerfile Ubuntu” dan menjelaskan cara membuat Dockerfile berbasis Ubuntu dengan cara yang mudah dipahami oleh pemula.

Ini mencakup segalanya mulai dari struktur dasar Dockerfile hingga instruksi langkah demi langkah untuk membangun lingkungan Ubuntu, contoh pengaturan lingkungan aplikasi seperti Python, dan kesalahan umum beserta solusinya.

Artikel ini direkomendasikan untuk:

  • Mereka yang ingin membangun lingkungan menggunakan Dockerfile untuk pertama kalinya
  • Pengembang yang ingin membuat lingkungan pengembangan yang dapat direproduksi di Ubuntu
  • Siapa saja yang ingin mendalami pemahaman mereka, termasuk teknik pemecahan masalah

2. Struktur Dasar Dockerfile

Apa Itu Dockerfile dan Apa Perannya?

Dockerfile seperti resep untuk membuat gambar Docker. Ini mendefinisikan sistem operasi dasar mana yang akan digunakan, perangkat lunak apa yang akan diinstal, dan bagaimana mengonfigurasi lingkungan.

Dengan menjalankan perintah docker build berdasarkan file ini, Anda dapat dengan mudah membuat lingkungan pengembangan dan runtime yang sangat dapat direproduksi.

Manfaat menggunakan Dockerfile:

  • Pengaturan lingkungan otomatis (tidak perlu pengulangan manual)
  • Menghilangkan inkonsistensi lingkungan dalam pengembangan tim
  • Integrasi mudah ke dalam pipeline CI/CD

Instruksi Dockerfile yang Umum Digunakan

Dockerfile terdiri dari beberapa instruksi (direktif). Berikut adalah beberapa yang paling umum digunakan. Dengan menggabungkannya secara tepat, Anda dapat membangun Dockerfile berbasis Ubuntu.

InstructionDescription
FROMSpecifies the base Docker image (e.g., FROM ubuntu:24.04)
RUNExecutes shell commands, typically for installing packages
COPYCopies local files into the image
ADDSimilar to COPY, but also supports URLs and archive extraction
WORKDIRSets the working directory
ENVDefines environment variables
CMDDefines the default command executed at container startup (can be overridden)
ENTRYPOINTDefines a command that is always executed at container startup

Contoh Dockerfile Berbasis Ubuntu Minimal

Berikut adalah contoh sangat dasar dari Dockerfile yang menggunakan Ubuntu sebagai gambar dasar.

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y \
    curl \
    vim

CMD ["/bin/bash"]

Dockerfile ini menggunakan Ubuntu 24.04 sebagai gambar dasar, menginstal utilitas curl dan vim, dan meluncurkan shell Bash saat kontainer dimulai.

Memilih Tag Ubuntu yang Tepat

Gambar Docker Ubuntu diterbitkan di repositori resmi Docker Hub. Meskipun menentukan ubuntu:latest akan menggunakan versi terbaru, disarankan untuk secara eksplisit memasangkan versi.

Misalnya:

  • ubuntu:22.04 (LTS: Long-Term Support, berfokus pada stabilitas)
  • ubuntu:24.04 (LTS terbaru, berfokus pada fitur baru)

Pilih versi berdasarkan apakah stabilitas atau fitur baru menjadi prioritas Anda.

3. Praktis: Membuat Dockerfile Berbasis Ubuntu

Menginstal Paket yang Diperlukan di Lingkungan Ubuntu

Ketika membangun lingkungan Ubuntu menggunakan Dockerfile, sering kali diperlukan untuk menginstal paket tambahan. Misalnya, utilitas berikut biasanya digunakan saat menyiapkan lingkungan pengembangan:

  • curl : Untuk mengunduh file dan menguji API
  • vim : Editor teks ringan
  • git : Sistem kontrol versi
  • build-essential : Alat penting untuk membangun program C/C++

Untuk menginstal paket‑paket ini dalam Dockerfile, gunakan instruksi RUN.

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y \
    curl \
    vim \
    git \
    build-essential

Dengan menjalankan apt-get update terlebih dahulu, Anda memastikan bahwa daftar paket terbaru diambil sebelum instalasi.

Mengonfigurasi Instalasi Non‑Interaktif

Pada Ubuntu, apt-get install kadang‑kadang memerlukan masukan pengguna. Namun, operasi interaktif tidak memungkinkan selama proses build Docker. Untuk menghindarinya, disarankan menetapkan variabel lingkungan dan mengaktifkan mode non‑interaktif.

ENV DEBIAN_FRONTEND=noninteractive

Hal ini menekan prompt seperti pemilihan locale atau zona waktu dan memungkinkan instalasi berjalan lancar.

Mengurangi Ukuran Image dengan Menghapus Cache yang Tidak Diperlukan

Saat menggunakan APT, file sementara yang diunduh (cache) dapat tetap berada di dalam image, sehingga meningkatkan ukuran akhirnya. Anda dapat mengurangi ukuran image dengan menghapus cache seperti contoh di bawah ini:

RUN apt-get update && apt-get install -y \
    curl \
    vim \
    && rm -rf /var/lib/apt/lists/*

Menggabungkan beberapa perintah menjadi satu instruksi RUN juga membantu mencegah peningkatan lapisan image yang tidak perlu.

Praktik Terbaik Menulis Dockerfile

Dalam lingkungan pengembangan dunia nyata, praktik terbaik Dockerfile berikut banyak direkomendasikan:

  • Gabungkan instruksi RUN bila memungkinkan untuk mengurangi jumlah lapisan
  • Tentukan versi dan pengaturan secara eksplisit menggunakan ENV
  • Gunakan komentar untuk menjelaskan tujuan setiap langkah dengan jelas
  • Hindari meninggalkan file yang tidak diperlukan dengan menggunakan rm dan --no-install-recommends

Contoh:

RUN apt-get update && apt-get install -y --no-install-recommends \
    curl \
    git \
    && rm -rf /var/lib/apt/lists/*

Pendekatan ini menghasilkan Dockerfile yang lebih ringan dan lebih mudah dipelihara.

4. Membangun dan Memverifikasi Image Docker

Membangun Image Docker dari Dockerfile

Setelah Dockerfile Anda siap, langkah selanjutnya adalah membangun image Docker. Hal ini dilakukan dengan perintah docker build. Jalankan perintah berikut di direktori yang berisi Dockerfile Anda:

docker build -t my-ubuntu-image .
  • Opsi -t memberikan nama (tag) pada image. Pada contoh ini, image dinamai my-ubuntu-image.
  • Titik (.) mengacu pada direktori saat ini yang berisi Dockerfile.

Docker akan membaca instruksi‑instruksi dalam Dockerfile secara berurutan dan membangun image sesuai.

Memeriksa Image Docker yang Telah Dibangun

Setelah image berhasil dibangun, Anda dapat memverifikasinya dengan perintah berikut:

docker images

Perintah ini menampilkan daftar image Docker yang disimpan secara lokal, termasuk informasi berikut:

  • REPOSITORY (nama image)
  • TAG
  • IMAGE ID (identifikasi unik)
  • CREATED (tanggal pembuatan)
  • SIZE

Contoh:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-ubuntu-image   latest    abcd1234abcd   5 minutes ago    189MB

Ini mengonfirmasi bahwa image telah terdaftar dengan benar.

Menjalankan Kontainer Docker untuk Verifikasi

Untuk memastikan bahwa image yang dibuat berfungsi sebagaimana mestinya, jalankan kontainer Docker dengan perintah berikut:

docker run -it my-ubuntu-image
  • Opsi -it meluncurkan sesi terminal interaktif.
  • Jika berhasil, prompt Bash akan muncul, menandakan Anda berada di dalam kontainer Ubuntu.

Di dalam kontainer, Anda dapat memverifikasi alat‑alat yang terinstal dengan perintah seperti:

curl --version
vim --version

Jika perintah-perintah ini berfungsi dengan benar, Dockerfile Anda dikonfigurasi dengan benar.

Membersihkan Gambar dan Kontainer yang Tidak Digunakan

Pembangunan berulang dan eksperimen mungkin meninggalkan gambar Docker dan kontainer yang tidak digunakan di sistem Anda. Disarankan untuk membersihkannya secara berkala menggunakan perintah berikut:

  • Hapus kontainer yang berhenti:
    docker container prune
    
  • Hapus gambar yang tidak digunakan:
    docker image prune
    
  • Hapus semua data yang tidak digunakan (gunakan dengan hati-hati):
    docker system prune
    

Operasi ini membantu menghemat ruang disk dan mencegah masalah potensial.

5. Lanjutan: Membangun Lingkungan Python

Mengaktifkan Python di Dockerfile Berbasis Ubuntu

Saat membangun lingkungan Ubuntu menggunakan Dockerfile, menambahkan lingkungan runtime Python memungkinkan berbagai kasus penggunaan, termasuk pengembangan, pengujian, dan pembelajaran mesin. Meskipun Python mungkin sudah terinstal secara default di Ubuntu, praktik umum adalah mengonfigurasinya secara eksplisit untuk pengelolaan versi dan paket yang lebih baik.

Menginstal Python Menggunakan APT

Pendekatan paling sederhana adalah menginstal Python menggunakan paket APT. Berikut adalah contoh:

FROM ubuntu:24.04

RUN apt-get update && apt-get install -y \
    python3 \
    python3-pip \
    && rm -rf /var/lib/apt/lists/*

Metode ini menyediakan versi Python sistem yang stabil (seperti Python 3.10 atau 3.12, tergantung pada rilis Ubuntu). Anda juga dapat menginstal paket Python tambahan menggunakan perintah pip.

Mengelola Versi Python dengan pyenv

Jika Anda memerlukan versi Python tertentu atau ingin beralih antar beberapa versi, menggunakan pyenv sangat direkomendasikan.

Contoh berikut menunjukkan cara menginstal Python 3.11.6 menggunakan pyenv di Dockerfile:

FROM ubuntu:24.04

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y \
    git \
    curl \
    make \
    build-essential \
    libssl-dev \
    zlib1g-dev \
    libbz2-dev \
    libreadline-dev \
    libsqlite3-dev \
    wget \
    llvm \
    libncurses5-dev \
    libncursesw5-dev \
    xz-utils \
    tk-dev \
    libffi-dev \
    liblzma-dev \
    && rm -rf /var/lib/apt/lists/*

# Install pyenv
RUN git clone https://github.com/pyenv/pyenv.git ~/.pyenv

ENV PYENV_ROOT="$HOME/.pyenv"
ENV PATH="$PYENV_ROOT/bin:$PATH"

RUN echo 'eval "$(pyenv init --path)"' >> ~/.bashrc

# Install a specific Python version
RUN pyenv install 3.11.6 && pyenv global 3.11.6

Pengaturan ini menyediakan lingkungan Python yang fleksibel dan terkendali dengan baik.

Mengelola Paket dengan requirements.txt

Sebagian besar proyek dunia nyata memerlukan beberapa pustaka Python. Ketergantungan ini biasanya dikelola menggunakan file requirements.txt.

Pertama, buat file requirements.txt di root proyek Anda:

flask==2.3.2
requests>=2.25.1
pandas

Kemudian rujuk itu di Dockerfile Anda seperti berikut:

COPY requirements.txt /app/requirements.txt
WORKDIR /app

RUN pip install --no-cache-dir -r requirements.txt

Ini memungkinkan semua pustaka yang diperlukan diinstal sekaligus dan secara signifikan meningkatkan reproduktibilitas lingkungan.

Praktik Terbaik

  • Saat menggunakan Python, membuat lingkungan virtual dengan virtualenv atau venv membantu mencegah konflik ketergantungan.
  • Menggunakan opsi penekanan cache seperti --no-cache-dir mengurangi ukuran gambar Docker.
  • Menjalankan pip install --upgrade pip sebelum menginstal paket dapat membantu menghindari kesalahan instalasi.

6. Masalah Umum dan Pemecahan Masalah

Kesalahan Izin

Contoh:

Permission denied

Kesalahan ini terjadi ketika file yang disalin kekurangan izin eksekusi atau ketika kepemilikan file dan pengguna eksekusi dikonfigurasi salah.

Solusi:

  • Buat file dapat dieksekusi:
    RUN chmod +x script.sh
    
  • Ubah kepemilikan file jika diperlukan:
    RUN chown root:root /path/to/file
    

Paket Tidak Ditemukan atau Kegagalan Instalasi

Contoh:

E: Unable to locate package xxx

Kesalahan ini biasanya terjadi ketika apt-get update belum dijalankan atau ketika nama paket salah.

Solusi:

  • Selalu jalankan apt-get update sebelum menginstal paket:
    RUN apt-get update && apt-get install -y curl
    
  • Verifikasi nama paket dan periksa kesalahan pengetikan

Kesalahan yang Terkait dengan Jaringan

Contoh:

Temporary failure resolving 'deb.debian.org'

Kesalahan ini menunjukkan masalah resolusi DNS selama proses build.

Solusi:

  • Memulai ulang daemon Docker dapat menyelesaikan masalah ini:
    sudo systemctl restart docker
    
  • Tinjau pengaturan DNS Docker dengan menambahkan server DNS di /etc/docker/daemon.json :
    {
      "dns": ["8.8.8.8", "8.8.4.4"]
    }
    

Build Menggunakan Cache yang Kedaluwarsa

Docker menggunakan caching berbasis lapisan untuk mempercepat build. Akibatnya, perubahan pada Dockerfile tidak selalu langsung tercermin.

Solusi:

  • Bangun ulang tanpa cache:
    docker build --no-cache -t my-image .
    

Kontainer Keluar Secara Instan atau Perintah Startup Tidak Dijalankan

Penyebab:

  • Perintah yang ditentukan dalam CMD atau ENTRYPOINT mengandung kesalahan
  • Menggunakan CMD ["/bin/bash"] tanpa mode interaktif menyebabkan keluar langsung

Solusi:

  • Jalankan kontainer dalam mode debug:
    docker run -it my-image /bin/bash
    
  • Pahami perbedaan antara CMD dan ENTRYPOINT serta gunakan secara tepat

Dengan menghadapi dan menyelesaikan masalah-masalah ini, kemampuan desain Dockerfile Anda akan terus meningkat. Ketika terjadi kesalahan, bacalah pesan error dengan cermat dan identifikasi instruksi serta lapisan mana yang menyebabkan masalah.

7. Ringkasan

Poin Penting untuk Membuat Dockerfile Berbasis Ubuntu

Artikel ini memberikan penjelasan langkah demi langkah tentang cara membangun lingkungan Ubuntu menggunakan Dockerfile, mencakup topik dasar hingga lanjutan. Mari tinjau poin-poin utama:

  • Memahami dasar-dasar Dockerfile adalah langkah pertama Instruksi seperti FROM, RUN, CMD, dan ENV memungkinkan pembuatan lingkungan secara otomatis.
  • Ubuntu adalah image dasar yang stabil dan fleksibel Ekosistem paket yang luas, basis pengguna yang besar, dan rilis LTS menjadikannya ideal untuk lingkungan pengembangan.
  • Manajemen paket yang praktis memungkinkan instalasi alat dan pustaka yang diperlukan Penggunaan apt-get yang tepat, pembersihan cache, dan instalasi non‑interaktif sangat penting.
  • Membangun lingkungan praktis seperti Python sepenuhnya didukung oleh Dockerfile Alat seperti pyenv, pip, dan requirements.txt memastikan setup yang dapat direproduksi.
  • Keterampilan pemecahan masalah secara langsung memengaruhi operasi yang stabil Memahami izin, jaringan, dan perilaku cache build secara signifikan meningkatkan produktivitas.

Langkah Selanjutnya dalam Pembelajaran Dockerfile

Setelah Anda nyaman menggunakan Dockerfile, Anda dapat memperluas keterampilan ke luar pengembangan, seperti pengujian dan penyebaran produksi. Pertimbangkan untuk mengeksplorasi topik berikut:

  • Mengelola setup multi‑kontainer dengan Docker Compose
  • Mengintegrasikan dengan alat CI/CD seperti GitHub Actions dan GitLab CI
  • Bekerja dengan platform orkestrasi kontainer seperti Kubernetes

Dokumentasi Resmi dan Tautan Referensi

8. FAQ (Pertanyaan yang Sering Diajukan)

Q1. Versi Ubuntu mana yang harus saya pilih dalam Dockerfile?

A1. Dalam kebanyakan kasus, memilih rilis LTS (Long Term Support) disarankan untuk stabilitas dan pemeliharaan jangka panjang. Versi seperti ubuntu:22.04 dan ubuntu:20.04 banyak digunakan dan didukung selama lima tahun.

Jika Anda memerlukan paket atau versi bahasa terbaru, Anda dapat memilih rilis yang lebih baru seperti ubuntu:24.04, tetapi pastikan melakukan pengujian secara menyeluruh.

Q2. Mengapa apt-get install melaporkan “package not found”?

A2. Hal ini biasanya disebabkan oleh salah satu hal berikut:

  • Daftar paket belum diperbarui – jalankan apt-get update terlebih dahulu.
  • Nama paket salah ketik atau tidak tersedia di repositori default.
  • Repositori yang diperlukan belum di‑enable dalam /etc/apt/sources.list atau file di /etc/apt/sources.list.d/.

Pastikan untuk memeriksa ejaan paket, memperbarui indeks paket, dan menambahkan repositori yang diperlukan sebelum mencoba menginstal kembali.

A2. Alasan paling umum adalah gagal menjalankan apt-get update sebelumnya. Tanpa memperbarui daftar paket, APT tidak dapat menemukan paket yang diminta.

Contoh yang benar:

RUN apt-get update && apt-get install -y curl

Juga pastikan bahwa nama paket benar dan tidak sudah usang (misalnya, gunakan python3 bukan python).

Q3. Bagaimana cara saya mengatur variabel lingkungan di Dockerfile?

A3. Gunakan instruksi ENV untuk mendefinisikan variabel lingkungan yang tersedia selama waktu build dan runtime kontainer.

Contoh:

ENV DEBIAN_FRONTEND=noninteractive

Ini biasanya digunakan untuk menekan prompt interaktif selama instalasi APT. Variabel lingkungan juga berguna untuk konfigurasi aplikasi dan kunci API.

Q4. Apa perbedaan antara CMD dan ENTRYPOINT?

A4. Keduanya menentukan perintah yang dieksekusi ketika kontainer dimulai, tetapi perilakunya berbeda.

ItemCMDENTRYPOINT
OverridableCan be overridden by docker runGenerally not overridden (treated as fixed command)
Use CaseDefine a default commandDefine a command that must always run

Contoh:

CMD ["python3", "app.py"]
# vs
ENTRYPOINT ["python3"]
CMD ["app.py"]

Dalam kasus yang terakhir, Anda dapat meneruskan argumen menggunakan docker run my-image another_script.py.

Q5. Mengapa perubahan Dockerfile saya tidak tercermin?

A5. Docker menggunakan cache build, yang mungkin menyebabkan layer yang tidak berubah digunakan kembali bahkan setelah mengedit Dockerfile.

Solusi:

docker build --no-cache -t my-image .

Ini memaksa rebuild penuh dan memastikan semua perubahan diterapkan.