Pengenalan
Dockerfile merupakan dasar dari gambar kustom pada ekosistem Docker. Pada artikel ini, saya akan membahas secara lebih dalam tentang anatomi Dockerfile dan mengulas instruksi-instruksi umum yang digunakan untuk membuat gambar kustom.
Anatomi Dockerfile
Sebuah Dockerfile umumnya terdiri dari tiga komponen berikut:
-
Gambar dasar
Ini adalah titik awal untuk membangun gambar kustom Anda. Anda dapat memilih dari berbagai macam gambar resmi atau buatan komunitas yang tersedia di Docker Hub. -
Instruksi
Ini adalah perintah yang mengubah gambar dasar menjadi gambar baru, kustom. -
Komentar
Baris yang diawali dengan simbol#
dianggap sebagai komentar.
Instruksi-Instruksi Umum pada Dockerfile
Berikut adalah beberapa instruksi yang sering digunakan dalam Dockerfile:
FROM
Menentukan gambar dasar yang digunakan. Instruksi ini wajib ada dan harus menjadi instruksi pertama dalam Dockerfile.
FROM ubuntu:18.04
RUN
Menjalankan perintah dan menghasilkan hasilnya. Instruksi RUN
yang berbeda akan menghasilkan layer yang berbeda dalam gambar. Untuk mengurangi layer, gabungkan perintah menggunakan &&
.
RUN apt-get update && \
apt-get install -y nginx
CMD
Menentukan perintah default yang dijalankan saat kontainer dimulai. Jika terdapat beberapa instruksi CMD
, hanya yang terakhir yang berlaku.
CMD ["nginx", "-g", "daemon off;"]
ENTRYPOINT
Menentukan titik masuk untuk kontainer, sehingga dapat dijalankan sebagai executable. Ini dapat di-overwrite menggunakan flag --entrypoint
saat memulai kontainer.
ENTRYPOINT ["python", "app.py"]
COPY
Mengcopy file dari sistem host ke dalam gambar. Disarankan untuk menggunakan COPY
daripada ADD
kecuali Anda membutuhkan fitur lanjutan seperti dukungan URL atau extracting archives.
COPY . /app
ADD
Menambahkan file ke dalam gambar, dengan dukungan URL dan extracting archives. Gunakan dengan bijak, dan lebih suka menggunakan COPY
untuk transfer file sederhana.
ADD https://example.com/file.tar.gz /app
ENV
Menentukan variabel lingkungan di dalam gambar. Mereka dapat diakses oleh proses yang berjalan di dalam kontainer.
ENV APP_PORT=8080
EXPOSE
Memberitahu Docker bahwa kontainer mendengarkan pada port jaringan tertentu. Instruksi ini tidak secara langsung mem-publish port, tetapi berfungsi sebagai dokumentasi.
EXPOSE 80
WORKDIR
Menentukan direktori kerja untuk instruksi selanjutnya. Jika direktori yang ditentukan tidak ada, maka akan dibuatkan direktori baru.
WORKDIR /app
USER
Menentukan pengguna untuk instruksi selanjutnya. Ini berguna untuk menjalankan proses non-root di dalam kontainer.
USER www-data
VOLUME
Membuat titik mount untuk penyimpanan eksternal. Instruksi ini digunakan untuk mempertahankan data yang dihasilkan oleh kontainer.
VOLUME /var/lib/mysql
Membangun Gambar Kustom
Membuat gambar kustom menggunakan Dockerfile memungkinkan pengembang untuk menyederhanakan proses pengaturan lingkungan, mengkonfigurasi aplikasi, dan mendeploy perangkat lunak. Pada bab ini, saya akan membahas proses pembuatan.
Untuk membangun gambar kustom dari Dockerfile, gunakan perintah docker build
diikuti dengan konteks build (biasanya direktori saat ini):
$ docker build -t your-image-name:tag .
Flag -t
memberikan nama dan tag opsional untuk gambar baru. Konteks build berisi Dockerfile dan file tambahan lainnya yang diperlukan selama proses pembuatan. Konteks build penting karena Docker mencari file yang dirujuk pada Dockerfile di dalam konteks build.
Proses pembuatan terdiri dari langkah-langkah berikut:
- Docker membaca Dockerfile dan memproses setiap instruksi secara berurutan.
- Setiap instruksi membuat layer baru dalam gambar. Layer di-cache untuk mempercepat proses build selanjutnya.
- Layer terakhir mewakili gambar kustom baru, yang dapat digunakan untuk membuat kontainer.
Sebagai contoh, pertimbangkan Dockerfile berikut untuk aplikasi Node.js sederhana:
# Tentukan gambar dasar
FROM node:14
# Tentukan direktori kerja
WORKDIR /app
# Copy file package
COPY package*.json ./
# Install dependensi
RUN npm install
# Copy kode aplikasi
COPY . .
# Expose port aplikasi
EXPOSE 3000
# Jalankan aplikasi
CMD ["npm", "start"]
Ketika membangun gambar ini, Docker akan melakukan tindakan-tindakan berikut:
- Mengambil gambar dasar
node:14
dari Docker Hub. - Menentukan direktori kerja menjadi
/app
. - Menyalin file
package.json
danpackage-lock.json
ke dalam gambar. - Menjalankan
npm install
untuk menginstal dependensi aplikasi. - Menyalin kode aplikasi yang tersisa ke dalam gambar.
- Mengekspos port 3000.
- Menentukan perintah default untuk menjalankan aplikasi dengan
npm start
.
Setelah gambar dibuat, Anda dapat membuat dan menjalankan kontainer menggunakan perintah docker run
:
$ docker run -d -p 3000:3000 your-image-name:tag