From 5fe30c2e5bee5cb111349e570dd7282854838187 Mon Sep 17 00:00:00 2001 From: rulanugrh Date: Thu, 8 Feb 2024 00:08:53 +0700 Subject: [PATCH] feat: add materi manage resource --- basic/09_manage_resource/Dockerfile | 26 +++++++ basic/09_manage_resource/README.md | 75 +++++++++++++++++++++ basic/09_manage_resource/docker-compose.yml | 55 +++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 basic/09_manage_resource/Dockerfile create mode 100644 basic/09_manage_resource/README.md create mode 100644 basic/09_manage_resource/docker-compose.yml diff --git a/basic/09_manage_resource/Dockerfile b/basic/09_manage_resource/Dockerfile new file mode 100644 index 0000000..bedb77c --- /dev/null +++ b/basic/09_manage_resource/Dockerfile @@ -0,0 +1,26 @@ +# FROM yang artinya base image +# Disini kalian bisa memanggil image sesuai kebutuhan kalian +FROM nginx + +# ARG digunakan untuk memberikan default value untuk variabel +# Ini sering digunakan jika ada beberapa hal yang memiliki data sama +ARG SAMPLEARG=rulanugrh + +# LABEL digunakan untuk custom labeling saja +# Biasanya berisi informasti tentang image itu sendiri +LABEL maintainer=${SAMPLEARG} + +# WORKDIR ialah work directory yang akan bisa ketahuan +# ketika kalian login kedalam container +# biasanya ini dilakukan untuk setup default directory dari image tersebut +WORKDIR /var/www/html + +# COPY ialah command untuk copy dari local ke dalam image +# alias apapun itu akan langsung di copy ke dalam image +COPY . . + +# EXPOSE yang digunakan untuk setup default value publisher port untuk keluar +EXPOSE 8080 + +# CMD digunakan untuk setup command ketika container running +CMD [ "nginx", "-g", "daemon off" ] \ No newline at end of file diff --git a/basic/09_manage_resource/README.md b/basic/09_manage_resource/README.md new file mode 100644 index 0000000..626de4a --- /dev/null +++ b/basic/09_manage_resource/README.md @@ -0,0 +1,75 @@ +## Manage Resource + +Secara default docker sendiri telah membuat system semakin flexibel. Dimana kalian bisa mengatur resource sesuai yang kalian butuhkan. Namun ini termasuk kompleks, karena jika salah manage yang terjadi adalah app yang sudah kita bundling tidak akan bekerja dengan semestinya. Ada beberapa hal yang harus kamu ketahui untuk manage resource yang diperlukan + +### **_CPU_** +| flag | desckripsi | +|--------------------|---------------------------------------------------------------------------------------------------------| +| `--cpus` | _flag ini digunakan untuk mengatur resource cpu_ | +| `--cpu-period` | _flag yang digunakan untuk mengatur resource dari maximal waktu process_ | +| `--cpu-quota` | _flag ini digunakan untuk mengatur cpu sebelum menyentuh batas maximal dari period yang telah disetup_ | +| `--cpu-rt-runtime` | _flag yang digunakan untuk mengatur batas maximal untuk proses runtime dari docker daemon per second-nya_ | +| `--cap-add=sys_nice` | _ini sering digunakan untuk mengatur proses runtime cpu agar berjalan secara stabil_ | + +Beberapa flag diatas sering digunakan untuk management sebuah cpu. Hal ini dilakukan jika ada suatu service yang tidak memerlukan nilai cpu yang tinggi dan dengan ini otomatis bisa dialokasikan ke service yang membutuhkan resource cpu yang besar seperti message broker, concurency program, dsb . Kalian bebas mau mengatur resource memory by command ketika buat container atau di `docker-compose` nya. Misal kita ambil contoh aja disini, kita punya CPU 1 dan untuk service `nginx` kita butuh cuma `30%` saja + +``` +$ docker run -it --cpus=".3" sample-image /bin/bash +``` +Kalau dalam docker composenya kalian bisa tambahkan statement `deploy` dan `limits` untuk mengatur resource yang ada + +```yml +# version untuk saat ini ialah version 3.9 +# untuk installasi kalian bisa jalanin saja script di root folder ini `install.sh` +version: '3.9' +# services define apa saja yang akan dilakukan build +# bahkan sampai pembuatan container dan running juga +services: + + # ini adalah service webapp, kalian bebas custom sesuai keinginan kalian + webapp: + + # build syntax yang digunakan untuk building Dockerfile yang kita punya + build: + context: . + dockerfile: dockerfile + + # deploy syntax yang disetup ketika lagi dalam proses deployment + deploy: + # resources statement digunakan untuk mengatur limit terhadap container yang kita gunakan + resources: + # nah disini pointnya, yang kita mau manage ada disini + # seperti manage cpu dengan 30% dari yang kita miliki + # resource memory yang ingin kita gunakan + limits: + cpus: '0.3' + memory: 200m + pids: 1 + + # nama container , sebenarnya biar mudah saja di kelola + # karena secara default docker sudah membuat nama container secara otomatis + container_name: webapp + + # publisher port yang dimana ini akan digunakan untuk lient akses ke container kita + # port yang image bisa kalian baca di official docsnya + ports: + - 4000:80 + +``` + +### **_Memory_** +Selain dari CPU kita juga bisa mengatur memory sesuai yang akan kita gunakan. Resource memory digunakan untuk aplikasi yang membutuhkan lebih banyak, seperti service yang berhubungan dengan data. Ada beberapa flag yang sering digunakan untuk mengatur resource memory + +| flag | desckripsi | +|------------------------|-----------------------------------------------------------------------------------------------------------------| +| `-m or --memory` | _flag ini digunakan untuk mengatur resource memory yang ingin dipakai, default satuanya adalah megabyte_ | +| `--memory-swap` | _manage resource yang digunakan untuk mengatur memory swap_ | +| `--memory-reservation` | _soft limiter dengan kata lain ini digunakan untuk mengatur memory yang lebih rendah dari statement `--memory`_ | +| `--kernel-memory` | _manage resource dari kernel yang memiliki batas minimal 6m_ | + +Kalian bisa mengatur resource baik melewati command ketika build container ataupun didalam docker-compose nya. + +``` +$ docker run --rm -d -p 3000:8080 -m 500m --name=sample-container webapp +``` +Untuk sample contoh di docker-compose kalian bisa liat di [contoh](docker-compose.yml) atau di atas juga ada \ No newline at end of file diff --git a/basic/09_manage_resource/docker-compose.yml b/basic/09_manage_resource/docker-compose.yml new file mode 100644 index 0000000..e0150ad --- /dev/null +++ b/basic/09_manage_resource/docker-compose.yml @@ -0,0 +1,55 @@ +# version untuk saat ini ialah version 3.9 +# untuk installasi kalian bisa jalanin saja script di root folder ini `install.sh` +version: '3.9' +# services define apa saja yang akan dilakukan build +# bahkan sampai pembuatan container dan running juga +services: + + # ini adalah service webapp, kalian bebas custom sesuai keinginan kalian + webapp: + + # build syntax yang digunakan untuk building Dockerfile yang kita punya + build: + context: . + dockerfile: dockerfile + + # deploy syntax yang disetup ketika lagi dalam proses deployment + deploy: + # resources statement digunakan untuk mengatur limit terhadap container yang kita gunakan + resources: + # nah disini pointnya, yang kita mau manage ada disini + # seperti manage cpu dengan 30% dari yang kita miliki + # resource memory yang ingin kita gunakan + limits: + cpus: '0.3' + memory: 200m + pids: 1 + + # nama container , sebenarnya biar mudah saja di kelola + # karena secara default docker sudah membuat nama container secara otomatis + container_name: webapp + + # env, ini tergantung setiap image, ada env yang penting beberapa image + # seperti database yang butuh env password, user, dan default db name + # namun disini cuma contoh saja + environment: + - OWNER=Bellshade + - LINK_GITHUB=https://github.com/bellshade/Docker + + # publisher port yang dimana ini akan digunakan untuk lient akses ke container kita + # port yang image bisa kalian baca di official docsnya + ports: + - 4000:80 + + # depends_on tandanya ia linked ke db + # dimana setiap data nya akan bisa diakses oleh service webapp + # bahkan sampai hostnamenya juga bisa digunakan + # usecase ini sering terjadi jika punya app berbasis statefull + depends_on: + - db + + # networks ini digunakan untuk semua service yang ada memiliki segment yang sama + # setiap network punya driver nya masing masing + # next kita bahas ini + networks: + - connection \ No newline at end of file