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 arsip
tar
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 port6379
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.