Membuat Docker Image Pertama


container

Seperti yang kita tahu, image yang digunakan pada tulisan Mencoba Docker Container menggunakan image dari Docker Hub . Docker Hub berisi ribuan image Docker dan Plugin penunjang Docker lainnya. Ada yang dibuat oleh komunitas, individu bahkan oleh beberapa perusahaan. Kalau sudah terbiasa menggunakan Github, mengelusuri Docker Hub tidaklah begitu membingungkan. Dalam tulisan kali ini akan mencoba membuat Docker image untuk pertama kalinya, dalam membuat image Docker ada 2 cari yaitu:

  1. Membuat image dari container
  2. Membuat image menggunakan Dockerfile

Dalam praktiknya, kita akan menggunakan image Debian Linux yang cukup populer digunakan pada dunia server. Dan debian ada versi slim yang cukup hemat ukuran untuk ukuran image, alternatif lain dari Alpine Linux. Untuk itu lakukan perintah berikut:

docker pull debian:stable-slim

Membuat Image Dari Container

Sekarang mari kita jalankan perintah:

docker container run -ti debian:stable-slim bash

Untuk membuat image dari container, kita akan coba untuk memasang satu aplikasi figlet pada container dengan menjalankan perintah:

apt update
apt install figlet
figlet "Hello Docker from Debian Stable Slim"

Dengan pertintah tersebut kita bisa lihat tulisa “Hello Docker from Alpine Linux” seperti gambar berikut:

Hello Docker

Selanjutnya kita keluar dari container tadi dengan perintah:

exit

Sekarang kita anggap, aplikasi figlet tadi cukup bermanfaat untuk tim kita. Oleh karena itu, kita perlu membagi image yang sudah dibuat tadi. Pertama yang kita butuhkan adalah ID dari container yang sudah berjalan dengan perintah:

docker container ls -a

Setelah mendapat ID, kita periksa dahulu apa saja yang telah kita lakukan pada container tersebut dengan perintah:

docker container diff <container ID>

docker container diff

Untuk membuat image kita perlu “commit” pada container. Dengan commit akan membuat image secara lokal di sistem yang menjalankan Docker. Jalankan perintah berikut untuk membuat image dari container yang baru saja kita buat:

docker container commit <container ID>

Dan sekarang kita telah berhasil membuat Image Docker pertama. Untuk melihat hasilnya dapat menjalankan perintah:

docker image ls

docker image ls

Seperti yang kita lihat, ada 2 image yang berbeda. Image pertama tanpa nama, tanpa tag, image ID, ukuran yang berbeda dan tanggal pembuatan yang berbeda dengan image kedua. Untuk mempermudah tim kita, kita buat sebuah tag pada image yang telah dibuat dengan perintah:

docker image tag <image ID> figletku
docker image ls

docker image tag

Sekarang kita coba jalankan container yang baru saja dibuat dengan perintah:

docker container run figletku figlet hello

Dan container menghasilkan output seperti berikut:

figletku hello

Begitulah cara membuat image docker menggunakan container, tetapi ada juga membuat image docker menggunkan Dockerfile.

Membuat Image Menggunakan Dockerfile

Selain menggunakan Container, kita bisa membuat sebuah image Docker menggunakan sebuah file dengan nama Dockerfile. Pada intinya sih sama saja, yang menjadi pembeda adalah kita bisa membuat sebuah image Docker yang lebih kompleks dan besar dengan sebuah file saja. Dan dengan begitu dapat mempermudah dalam pengelolaan jika ada perubahan. Dockerfile sendiri hampir mirip saat kita menulis baris kode sebuah program.

Oke langsung saja kita coba membuat sebuah Dockerfile, tetapi sebelumnya kita buat dulu sebuah folder dengan nama app dan file dengan nama index.js. Disini saya menggunakan vim sebagai text editor, sesuai kan text editor yang kalian punya.

mkdir app && cd app && vim index.js

Untuk file index.js bisa diisi dengan kode berikut:

var os = require("os");
var hostname = os.hostname();
console.log("hello from " + hostname);

Kita coba buat sebuah aplikasi sederhana dengan menggunakan Debian Slim sebagai base image dan node.js sebagai backend aplikasinya. Selanjutnya kita buat file dengan nama Dockerfile, file ini kita taruh pada folder app juga. Dockerfile dapat ditulis seperti ini:

FROM debian:stable-slim
RUN apt update -yq && apk install nodejs -yq
COPY . /app
WORKDIR /app
CMD ["node","index.js"]

Sekarang kita coba jalankan perintah:

docker build -< Dockerfile

docker build-1 docker build-2

Mungkin butuh proses beberapa menit saat menjalankan ini, apalagi kalau koneksi kurang stabil. Karena saat proses ini berjalan, akan melakukan update Debian Linux lalu menginstall node.js. Setelah proses selesai, coba jalankan perintah:

docker container run hello:v0.1

Nanti menghasilkan output yang kurang lebih seperti berikut:

run hello:v0.1

Sampai sini kita sudah selesai membuat image Docker menggunakan Dockerfile. Untuk lebih detail dapat kita cek dengan perintah:

docker image ls -a

docker image ls -a

Image Layers

Ada hal yang menarik lainnya dari image yang kita buat di Docker. Saat kita jalankan, mereka tampak satu OS dan aplikasi. Tapi image itu sendiri sebenarnya dibangun secara berlapis, untuk membuktikan hal tersebut dapat menjalankan perintah:

docker image history <image ID>

Dan lihatlah, terdapat beberapa proses saat image yang kita buat tadi. Setiap ada perubahan pada image akan tertulis pada history, mirip seperti history saat kita melakukan browsing di internet.

docker image history

Coba kita rubah file index.js seprerti ini:

echo "console.log(\"this is v0.2\");" >> index.js

Lalu kita buid ulang Docker image dengan perintah:

docker image build -t hello:v0.2 .

docker image build -t hello:v0.2

Pada saat proses ini kita mengulangi hal yang sama tetapi ada sedikit perbedaan, yaitu proses menjadi lebih cepat. Hal ini karena Docker menggunakan cache pada layer image, dengan menggunakan cache ini semisal ingin memperbarui sistem, memperbaiki bug atau membuat konfigurasi file tidak bekerja dua kali pada langkah-langkah yang sama atau membuat image dari awal sehingga lebih efisien dalam membangun aplikasi. Jika dari langkah-langkah diatas masih mengalami kegagalan atau ada error atau ada yang kurang jelas, silahkan tanya lewat kolom komentar.

Refrensi tulisan dan gambar:

Doing More With Docker Images

Container Image

comments powered by Disqus