Docker image adalah blueprint Docker container yang berisi aplikasi dan semua yang Anda butuhkan untuk menjalankan aplikasi. Container adalah contoh runtime instance dari suatu image.

Dalam tutorial ini, kami akan menjelaskan apa itu Dockerfile, bagaimana membuatnya dan bagaimana membuat image Docker dengan Dockerfile.

Apa itu Dockerfile?

Dockerfile adalah file teks yang berisi semua perintah yang bisa dijalankan user pada baris perintah untuk membuat image. Ini mencakup semua instruksi yang diperlukan oleh Docker untuk membangun image.

Docker image terdiri dari serangkaian filesystem yang mewakili instruksi dalam Dockerfile image dan membentuk aplikasi perangkat lunak yang dapat dieksekusi.

File Docker mengambil bentuk berikut:

# Comment
INSTRUCTION arguments

Meskipun instruksi tidak peka terhadap huruf case-sensitive, konvensi ini adalah untuk menggunakan UPPERCASE untuk nama mereka.

Di bawah ini adalah daftar dengan deskripsi singkat tentang beberapa petunjuk Dockerfile yang paling sering digunakan:

  • ARG – Instruksi ini memungkinkan Anda untuk menentukan variabel yang dapat dilewati saat build-time. Anda juga dapat menentukan nilai default.
  • FROM – image dasar untuk membangun image baru. Instruksi ini harus menjadi instruksi non-comment pertama di Dockerfile. Satu-satunya pengecualian dari aturan ini adalah ketika Anda ingin menggunakan variabel dalam argumen FROM. Dalam hal ini FROM dapat didahului dengan satu atau lebih instruksi ARG.
  • LABEL – Digunakan untuk menambahkan metadata ke image, seperti deskripsi, versi, author dll. Anda dapat menentukan lebih dari satu LABEL dan setiap instruksi LABEL adalah key-value pair.
  • RUN – Perintah yang ditentukan dalam instruksi ini akan dieksekusi selama proses build. Setiap instruksi RUN membuat layer baru di atas image saat ini.
  • ADD – Digunakan untuk menyalin file dan direktori dari sumber yang ditentukan ke tujuan yang ditentukan pada image docker. Sumbernya dapat berupa file atau direktori lokal atau URL. Jika sumbernya adalah arsiptar lokal , maka secara otomatis dibongkar ke dalam image Docker.
  • COPY – Mirip dengan ADD tetapi sumbernya hanya berupa file atau direktori lokal.
  • ENV – Instruksi ini memungkinkan Anda untuk mendefinisikan environment variable.
  • CMD – Digunakan untuk menentukan perintah yang akan dieksekusi ketika Anda menjalankan sebuah container. Anda hanya dapat menggunakan satu instruksi CMD di Dockerfile Anda.
  • ENTRYPOINT – Mirip dengan CMD, instruksi ini mendefinisikan perintah apa yang akan dieksekusi ketika menjalankan sebuah container.
  • WORKDIR – Directive ini menetapkan direktori kerja saat ini untuk instruksi RUN, CMD, ENTRYPOINT, COPY, dan ADD berikut.
  • USER – Tetapkan nama user atau UID untuk digunakan ketika menjalankan instruksi RUN, CMD, ENTRYPOINT, COPY dan ADD.
  • USER – Set the username or UID to use when running any following RUN, CMD, ENTRYPOINT, COPY and ADD instructions.
  • VOLUME – Memungkinkan Anda untuk memasang direktori mesin host ke container.
  • EXPOSE – Digunakan untuk menentukan port tempat Container mendengarkan saat runtime.

Untuk mengecualikan file dan direktori agar tidak ditambahkan ke image, buat file .dockerignore dalam direktori. Sintaks dari .dockerignore mirip dengan salah satu dari file .gitignore Git.

Untuk referensi lengkap dan penjelasan terperinci dari instruksi Dockerfile lihat halaman resmi referensi Dockerfile.

Membuat Dockerfile

Skenario yang paling umum untuk membuat image Docker adalah pull images yang sudah ada dari registri seperti itu (biasanya dari Docker Hub) dan menentukan perubahan yang ingin Anda lakukan pada images dasar tersebut.

Images dasar yang paling umum digunakan saat membuat image Docker adalah Alpine karena berukuran kecil dan dioptimalkan untuk dijalankan dalam RAM.

Docker Hub adalah layanan registri berbasis cloud yang di antara fungsi lainnya digunakan untuk menyimpan image Docker baik dalam repositori publik atau pribadi.

Dalam contoh ini, kita akan membuat image Docker untuk server Redis. Kami akan menggunakan ubuntu 18.04 terbaru sebagai image dasar.

Pertama, buat direktori yang akan berisi Dockerfile dan semua file yang diperlukan:

mkdir ~/redis_docker

Masuk redist_docker dan buat Dockerfile berikut

cd ~/redis_docker
nano Dockerfile

paste konten berikut ke Dockerfile

FROM ubuntu:18.04

RUN apt-get update && \
    apt-get install -y redis-server && \
    apt-get clean

EXPOSE 6379

CMD ["redis-server", "--protected-mode no"]

Mari kita jelaskan arti masing-masing baris di Dockerfile:

  • Pada baris 1 kita mendefinisikan image dasar.
  • Instruksi RUN yang dimulai pada baris 3 akan memperbarui indeks apt, menginstal paket “redis-server” dan membersihkan cache apt. Perintah yang digunakan dalam instruksi, sama dengan perintah yang Anda gunakan untuk install redis di server Ubuntu.
  • Instruksi EXPOSE mendefinisikan port tempat server redis akan listens.
  • Pada baris terakhir, kita menggunakan instruksi CMD untuk mengatur perintah default yang akan dieksekusi ketika container berjalan.

Simpan file dan tutup editor.

Build Image

Langkah selanjutnya adalah build image. Untuk melakukannya jalankan perintah berikut dari direktori tempat Dockerfile berada:

build docker -t linuxid/redis.

Opsi -t menentukan nama image dan secara opsional nama pengguna dan tag dalam format ‘nama user/imagename:tag’.

Output dari proses build akan terlihat seperti ini:

Sending build context to Docker daemon  3.584kB
Step 1/4 : FROM ubuntu:18.04
 ---> 7698f282e524
Step 2/4 : RUN apt-get update && apt-get install -y gosu redis-server && apt-get clean
 ---> Running in e80d4dd69263
...
Removing intermediate container e80d4dd69263
 ---> e19fb7653fca
Step 3/4 : EXPOSE 6379
 ---> Running in 8b2a45f457cc
Removing intermediate container 8b2a45f457cc
 ---> 13b92565c201
Step 4/4 : CMD ["redis-server", "--protected-mode no"]
 ---> Running in a67ec50c7048
Removing intermediate container a67ec50c7048
 ---> d8acc14d9b6b
Successfully built d8acc14d9b6b
Successfully tagged linuxid/redis:latest

Saat proses build selesai, image baru akan terdaftar dalam daftar image :

docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
linuxid/redis      latest              d8add14d8b6b        4 minutes ago       100MB
ubuntu              18.04               7645f282t224        5 days ago          69.9MB

Jika Anda ingin push image ke Hub Docker lihat dokumentasi push image container ke Docker Hub.

Menjalankan Container

Sekarang setelah image dibuat, Anda menjalankan container darinya dengan menjalankan:

docker run -d -p 6379:6379 --name redis linuxid/redis

Penjelasan dari perintah di atas :

  • Opsi -d memberi tahu Docker untuk menjalankan container dalam mode terpisah,
  • opsi -p 6379:6379 akan menerbitkan port 6379 ke mesin host
  • opsi --name redis menentukan nama container.
  • linuxid/redis adalah nama image yang digunakan untuk menjalankan container.

Ketika container mulai, gunakan perintah berikut untuk membuat daftar semua container yang berjalan:

docker container ls
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                    NAMES
6b7d424cd915        linuxid/redis:v0.0.1   "redis-server '--pro…"   5 minutes ago       Up 5 minutes        0.0.0.0:6379->6379/tcp   redis

Untuk memverifikasi bahwa semuanya berfungsi sebagaimana mestinya menggunakan redis-cli untuk terhubung ke container docker :

redis-cli ping

Server redis akan merespons dengan output PONG.

Kesimpulan

Tutorial ini hanya membahas dasar-dasar penggunaan Dockerfiles untuk membuat image. Untuk mempelajari lebih lanjut tentang cara menulis Dockerfiles dan praktik terbaik yang disarankan lihat Praktik terbaik untuk menulis Dockerfiles.