KATEGORI: CONTAINER

Docker Images | Gambaran BESAR

Pengertian, hal detail, dan latihan dasar dengan Docker Images kita bahas lengkap disini.

Do Exploit

--

Thumbnail!

Eiits, sebelum masuk ke pembahasan disini, apakah kalian sudah belajar dan latihan sedikit tentang docker sebelumnya? Jika belum, bisa baca dulu artikel diatas.

Docker images merupakan komponen paling penting dalam perkembangan docker. Dia alasan kenapa banyak orang menggunakan docker, untuk menyiapkan aplikasi-aplikasi mereka agar bisa lebih portable, jadi mudah dipindah tangankan.

Setelah membaca artikel ini, diharapkan kalian dapat mengerti, bagaimana docker images bisa memegang peran sangat penting dan sedikit mengetahui hal-hal yang terjadi dibalik terbentuknya docker images.

Container dan Images?

☴ ➡️ 📦
Images️ ️️➡️ Container

Dari sana kalian bisa melihat hubungan antara Images dan Container. Pada saat aplikasi siap untuk di jalankan, aplikasi tersebut disimpan dalam images, sehingga akhirnya bisa digunakan container sebagai dasar. Jadi images tidak bisa dihapus jika container belum dihapus.

Kalau begitu, kenapa kita perlu container dan images? Sedangkan sudah pasti container menggunakan 1 images. Jadi harusnya mereka berdua dijadikan 1 nama saja bisa, misalnya imgcont gitu?

Kurang tepat. Bila dilihat, memang container hanya menggunakan 1 images, namun dibalik 1 images tersebut bisa jadi ada images lain yang mendasari dirinya.

Misalkan kalian punya aplikasi web sederhana yang hanya menampilkan landing page sederhana, dan ingin membuatnya online menggunakan web server Nginx. Tentu kalian butuh images Nginx untuk menambahkan konfigurasi web sederhana kedalam sana.

Kita akan bahas lengkap lagi di bagian Images Layers.

Registry | Kumpulan Images

Multiple Docker Registry | Made with app.diagrams.net

Images disimpan pada suatu wadah online yang bisa diakses oleh Docker Daemon. Kalian ingat pernah menggunakan perintah docker pull? Itu salah satu kegiatan men-download images dari Registry.

Secara default, docker daemon berkomunikasi dengan hub.docker.com. Itu merupakan repository images yang disediakan oleh docker secara gratis. Layaknya github, tempat menyimpan kode, docker hub tempat menyimpan images dan harus publik (versi gratisan).

Selain docker hub, ada lagi registry public yang lain. Seperti Amazon Elastic Container Registry (ECR), Google Container Registry (GCR, Azure Container Registry (ACR) dan banyak lagi tentunya.

Mengambil Images

Sehabis installasi docker, tidak ada images apapun dalam Docker Daemon. Kita perlu mengambil images dari registry publik atau milik pribadi, disini kita gunakan registry bawaan docker yaitu Docker Hub.

$ docker pull debianUsing default tag: latest
latest: Pulling from library/debian
d960726af2be: Pull complete
Digest: sha256:acf7795dc91df17e10effee064bd229580a9c34213b4dba578d64768af5d8c51
Status: Downloaded newer image for debian:latest
docker.io/library/debian:latest

Docker images terbentuk dari objek yang disebut layer, diatas kita bisa lihat terdapat d960726af2be yang mendasari images debian. Layer bisa digunakan oleh images yang serupa lainnya juga, sehingga tidak memakan penyimpanan tambahan.

$ docker pull debian:stableUsing default tag: stable
latest: Pulling from library/debian
d960726af2be: Already exists
Digest: sha256:acf7795dc91df17e10effee064bd229580a9c34213b4dba578d64768af5d8c51
Status: Downloaded newer image for debian:stable
docker.io/library/debian:stable

Kenapa hal tersebut terjadi? Karena sebenarnya kedua images tersebut adalah images yang sama, images debian dengan tag default latest merujuk pada debian stable.

$ docker images # melihat images yang telah didownload
REPOSITORY TAG IMAGE ID CREATED SIZE
debian stable 25b497b15bfa 3 weeks ago 114MB
debian latest 25b497b15bfa 3 weeks ago 114MB

Nama dan Tag

debian:latest
nama-images:versi

https://hub.docker.com/_/<nama-images>?tab=tags

Temukan versi images yang kalian perlukan menggunakan format url diatas. Jika saat menggunakan perintah docker pull, hanya menulis nama-images saja tanpa versi, maka docker akan memilih images dengan versi latest.

Membuat Images

Docker bisa membuat images secara otomatis menggunakan intruksi yang ditulis dalam Dockerfile.

Praktek biasa yang dilakukan untuk menyimpan Dockerfile di dalam direktori atau folder yang digunakan untuk develop aplikasi. Penulisan huruf juga perlu diperhatikan, yang benar adalah Dockerfile, tidak ada kata atau huruf lain yang menyerupai kata tersebut.

$ git clone https://github.com/zuramai/go-docker-exampleCloning into 'go-docker-example'...
remote: Enumerating objects: 21, done.
remote: Counting objects: 100% (21/21), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 21 (delta 3), reused 19 (delta 1), pack-reused 0
Unpacking objects: 100% (21/21), done.
$ cd go-docker-example
Layers on go-docker-example | | Made with app.diagrams.net
$ cat Dockerfile
FROM golang:alpine
RUN apk update && apk add --no-cache git
WORKDIR /app
COPY ./src .
RUN go mod tidy
RUN go build -o binary
ENTRYPOINT ["/app/binary"]

Keterangan:

  1. Menggunakan images golang dengan versi alpine sebagai base layer.
  2. Memperbarui list packages, lalu menginstall git.
  3. Berpindah direktori kedalam /app.
  4. Kita baru saja meng-clone sebuah app go dari repository go-docker-example oleh Ahmad Saugi. Appnya disimpan dalam direktori src/, kita perlu memindahkan seluruh source-code tersebut kedalam direktori images yang akan dibuat, yaitu dalam /app.
  5. Dalam direktori src/ kalian bisa melihat terdapat file go.mod, itu seperti file requirements.txt dalam python yang menyimpan modules tambahan untuk menjalankan app tersebut.
  6. Meng-compile app menjadi file binary yang disimpan dalam direktori yang sama dengan source-code juga.
  7. Ayo berikan komentar untuk bantu menjelaskan pada saya, apa yang sebenarnya baris ke-7 lakukan?
$ docker build -t go-docker-example .
Sending build context to Docker daemon 96.77kB
Step 1/7 : FROM golang:alpine
alpine: Pulling from library/golang
540db60ca938: Pull complete
adcc1eea9eea: Pull complete
4c4ab2625f07: Pull complete
689510d40a26: Pull complete
8e4d89f102e3: Pull complete
Digest: sha256:64c82390220281455e221d3c75a0a2405e34a5be2d373b411afed363555b6857
Status: Downloaded newer image for golang:alpine
---> 748a5301b14d
Step 2/7 : RUN apk update && apk add --no-cache git
... Dipotong aja yaa :)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
golang alpine 748a5301b14d 3 days ago 301MB
go-docker-example latest 094324jfi43j 5 minutes ago ~~~~
nginxdemos/hello latest aedf47d433f1 3 years ago 16.8MB

Karena kita menggunakan golang:alpine sebagai dasar images, maka pada tahap awal images golang:alpine didownload terlebih dahulu.

Gunakan perintah docker inspect go-docker-example:latest untuk menunjukkan seluk beluk hal dari images go-docker-example.

Images dan Layers?

— — Layer N
— — Layer ..
— — Layer 2
— — Layer 1

Sebelumnya saya sudah menyinggung beberapa kali soal layers. Docker images mempunyai layer yang bisa mengurangi penyimpanan tambahan dan mempercepat proses pembuatan images. Selain itu, layers pada images dapat digunakan oleh images lainnya, itulah yang meningkatkan efisiensi penyimpanan dan performa dari docker.

$ docker image pull -a nginxdemos/hello 0.1: Pulling from nginxdemos/hello
550fe1bea624: Pull complete
d421ba34525b: Pull complete
fdcbcb327323: Pull complete
bfbcec2fc4d5: Pull complete
8a1d79bc0870: Pull complete
dbf5f5063dea: Pull complete
68a1d10cc39e: Pull complete
Digest: sha256:9f33b1139921436acc1ffc46dd720fa89a55463fe0a308458be8f9c5c0c49a19
0.2-plain-text: Pulling from nginxdemos/hello
550fe1bea624: Already exists
d421ba34525b: Already exists
fdcbcb327323: Already exists
bfbcec2fc4d5: Already exists
05942b883b5e: Pull complete
1fc8017b9adf: Pull complete
Digest: sha256:02a5bc13f8917b9631356fed56a98a4cf2e08e819d74bfe0c817f1179d4a0055
0.2: Pulling from nginxdemos/hello
550fe1bea624: Already exists
d421ba34525b: Already exists
fdcbcb327323: Already exists
bfbcec2fc4d5: Already exists
0497d4d5654f: Pull complete
f9518aaa159c: Pull complete
a70e975849d8: Pull complete
Digest: sha256:f5a0b2a5fe9af497c4a7c186ef6412bb91ff19d39d6ac24a4997eaed2b0bb334
latest: Pulling from nginxdemos/hello
Digest: sha256:f5a0b2a5fe9af497c4a7c186ef6412bb91ff19d39d6ac24a4997eaed2b0bb334
plain-text: Pulling from nginxdemos/hello
Digest: sha256:02a5bc13f8917b9631356fed56a98a4cf2e08e819d74bfe0c817f1179d4a0055
Status: Downloaded newer image for nginxdemos/hello
docker.io/nginxdemos/hello

Lihat pada layer versi 0.2 dan 0.2-plain-text, disana terdapat 4 layer yang saling berbagi layer dengan versi 0.1.

Layer Container

Container Layer | Source: About storage drivers | Docker Documentation

Pada bagian awal sebelumnya saya telah menjelaskan bahwa images dan container tidak bisa dipisahkan. Itu karena setiap container membuat layer baru diatas images yang sudah ada, dari gambar diatas bisa kalian lihat ada 4 container menggunakan 1 images yang sama.

Kenapa perlu dibuatkan layer baru?

Coba kalian lihat pada Dockerfile sebelumnya. Padahal ada banyak intruksi dalam Dockerfile, tapi hanya intruksi RUN, ADD, COPY yang membuat layer. Kalian cukup ingat ini saja, suatu intruksi yang melibatkan perubahan file sistem dalam images berarti membuatkan 1 layer.

Yang artinya, setiap container berjalan pasti akan merubah file sistem. Seperti menambah cache, log, socket dan banyak hal lainnya yang tentu berbeda isinya pada tiap-tiap container. Itulah kenapa perlu dibuatkan 1 layer khusus untuk container.

Referensi

--

--

Do Exploit

I share stories about what I've learned in the past and now. Let's connect to Instagram! @do.exploit