---
# System prepended metadata

title: Docker Fundamental

---

# DOCKER FUNDAMENTAL 
![Screenshot 2024-03-21 124418](https://hackmd.io/_uploads/ry6HKBtC6.png)

## Table of Content
[TOC]
### 1. Apa itu Docker?
####  Tahapan deploying application
 1. Before Docker 
![Screenshot 2024-03-21 131151](https://hackmd.io/_uploads/HkQAk8KAT.png)

Penjelasan :
pada hal ini jika kita ingin deploy aplikasi ke server kita harus menginstall seluruh dependensi yang akan dibutuhkan. Disini kita harus menginstall Web server, library, Data base, dan lain lain. ini akan membutuhkan waktu yang lama jika kita akan scaling aplikasi di sever yang berbeda beda.

 2. After Docker
![Screenshot 2024-03-21 131325](https://hackmd.io/_uploads/BkPLbLK0p.png)

Penjelasan :
Nah dengan adanya docker ini membuat dependensi yang dibutuhkan aplikasi sudah dikemas dalam satu package dengan aplikasi yang nantinya tinggal dikirim ke server. Ini sangat mengefisiensi waktu karena ketika kita akan mengirim paket ke beberapa server kita tidak perlu menginstall dependensi" yang dibutuhkan di setiap servernya. 


#### Perbedaan container dengan VM :
![Screenshot 2024-03-21 132753](https://hackmd.io/_uploads/S19gNIKRT.png)

Penjelasan :
Pada virtual machine manager kita harus menginstall operating system jika kita ingin membuat VM lagi, Namun pada container manager kita tidak perlu menginstall OS lagi dikarenakan server servenya akan mengikuti operating system bawaan. Perlu diketahui juga kita tidak perlu khawatir dengan kerusakan yang terjadi pada server jika server rusak itu tidak akan mempengaruhi Operating System bawaanya karena telah di isolasi oleh Container Manager.

### 2.Contoh Teknologi Container

#### A. Docker 
Docker merupakan platform untuk mendevelop, mengirim, dan menjalankan aplikasi. Docker memungkinkan Anda untuk memisahkan aplikasi dari infrastruktur sehingga Anda dapat mengirimkan perangkat lunak dengan cepat. 

#### B. Podman
Sama halnya dengan docker. Podman menjalankan, membagikan aplikasi dengan menggunakan Open Containers Initiative (OCI) Containers dan Container Images. 

#### C. LXC
LXC ini membangun lingkungan yang mirip dengan standar Linux tanpa harus menggunakan kernel terpisah.

#### D. LXD
LXD adalah sebuah kontainer sistem generasi berikutnya dan pengelola mesin virtual. LXD menawarkan pengalaman pengguna yang terpadu di sekitar sistem Linux lengkap yang berjalan di dalam kontainer atau mesin virtual.LXD berbasis image dan menyediakan image untuk sejumlah besar distribusi Linux.

### 3. Lab 1.1 Preparation of Lab Environment
#### setting up the vm
1. Pada materi kali ini dibutuhkan 2 VM dengan spesifikasi sebagai berikut :
![Screenshot 2024-03-21 142412](https://hackmd.io/_uploads/BkyAxwKRT.png)

2. Set up NAT network 
![Screenshot 2024-03-21 143333](https://hackmd.io/_uploads/BJTRfDY0T.png)
3. Set up Host only 
![Screenshot 2024-03-21 144437](https://hackmd.io/_uploads/rJftSDFR6.png)
4. Buat VM 1 dengan nama Docker-Node1
![Screenshot 2024-03-21 144346](https://hackmd.io/_uploads/rkpaBvFCT.png)
5. Cloning VM1
![Screenshot 2024-03-21 144752](https://hackmd.io/_uploads/SJy_8PFRa.png)
#### Network Configuration and Hosts Configuration on VM Docker-Node01

1. Menjalankan docker node1 dan login dengan user = student dan pass = Adinusa2023
2. edit file etc/netplan
![Screenshot 2024-03-21 162729](https://hackmd.io/_uploads/r1W0aOYAT.png)
3. apply konfigurasi network terakhir
![Screenshot 2024-03-21 163252](https://hackmd.io/_uploads/HkXqgKYRT.png)
4. ubah hostname
![Screenshot 2024-03-21 164113](https://hackmd.io/_uploads/HyRpgYtRp.png)
5. map host on etc/hosts/
![Screenshot 2024-03-21 163803](https://hackmd.io/_uploads/rkyZ-FtCa.png)
6. lakukan juga pada node02

#### buat SSH keygen
1. buat ssh keygen pada node1 dan node2
![Screenshot 2024-03-21 170001](https://hackmd.io/_uploads/SJ7HSFtRT.png)
2. copyn public key ke semua node
![Screenshot 2024-03-21 171443](https://hackmd.io/_uploads/SymnuttAp.png)
3. check login apakah bisa tanpa password?
![Screenshot 2024-03-21 171541](https://hackmd.io/_uploads/HyklFFtRa.png)
4. Melakukan konfigurasi nusactl (Docker Fundamental Learning from Adinusa) dengan membuat file /home/student/.nusactl/hosts.yaml pada Docker-Node01 dan mengisinya dengan konfigurasi berikut:
![Screenshot 2024-03-21 174607](https://hackmd.io/_uploads/r1sZe5tA6.png)
5. Automate ssh-add automatically when logged in
![Screenshot 2024-03-21 200331](https://hackmd.io/_uploads/BkKEl2FRT.png)
6. Login ke adinusa 
![Screenshot 2024-03-22 004112](https://hackmd.io/_uploads/rJXaMl90p.png)
setelah eror seharian
7. grading 
![Screenshot 2024-03-22 004653](https://hackmd.io/_uploads/SkuVme5C6.png)
8. Lab 1.1
![Screenshot 2024-03-22 124457](https://hackmd.io/_uploads/HJ2lo59AT.png)


## Introduction Docker 

### Pengenalan Docker
Docker, Inc. adalah perusahaan yang dibentuk untuk mengembangkan Docker CE dan Docker EE. Perusahaan ini juga menyediakan layanan dukungan berbasis SLA untuk Docker EE. Terakhir, mereka menawarkan layanan konsultasi kepada perusahaan yang ingin mengambil aplikasi yang sudah ada dan mengkontainerisasikannya sebagai bagian dari program Modernisasi Aplikasi Tradisional (MTA) Docker.
Docker saat ini memisahkan lini produknya ke dalam dua segmen. Ada Community Edition (CE), yang bersumber tertutup namun sepenuhnya gratis, dan kemudian ada Enterprise Edition (EE), yang juga bersumber tertutup dan perlu dilisensikan setiap tahun. Produk-produk perusahaan ini didukung oleh dukungan 24/7 dan didukung oleh perbaikan bug.

### Instalasi Docker 
1. update pada VM1 dan VM2
![Screenshot 2024-03-22 131445](https://hackmd.io/_uploads/By97Mi90p.png)
2. melakukan instalasi paket paket 
![Screenshot 2024-03-22 131846](https://hackmd.io/_uploads/S1xyQi5Aa.png)
3. Membuat dirketori baru
![Screenshot 2024-03-22 133636](https://hackmd.io/_uploads/rJL-DiqCT.png)
4. menyimpan kunci publik docker GPG ke dalam direktori
![Screenshot 2024-03-22 133743](https://hackmd.io/_uploads/HJcrwj50a.png)
5. ![Screenshot 2024-03-22 134546](https://hackmd.io/_uploads/BJCXti5Ra.png)
6. melakukan update 
![Screenshot 2024-03-22 135417](https://hackmd.io/_uploads/Bk2msjqCa.png)
7. install dockenyaa
![Screenshot 2024-03-22 162251](https://hackmd.io/_uploads/H19pCpqCp.png)

8. Melihat versi docker
![Screenshot 2024-03-22 162740](https://hackmd.io/_uploads/r1HHk0q0T.png)
9. Melihat detail instalasi docker
![Screenshot 2024-03-22 162740](https://hackmd.io/_uploads/SyIokA9A6.png)

10. Menambah user di docker group
![Screenshot 2024-03-22 163401](https://hackmd.io/_uploads/rk05xR90T.png)
11. Tes instalasi docker
![Screenshot 2024-03-22 163527](https://hackmd.io/_uploads/Hk1ZbRcA6.png)
12. Tampilkan image yang di download
![Screenshot 2024-03-22 163711](https://hackmd.io/_uploads/SkKU-CcRT.png)
13. Display all container (active or exit).
![Screenshot 2024-03-22 163711](https://hackmd.io/_uploads/ryFAbCqAT.png)


### Lab 2.2

1. Mencari image redis dari docker hub dan harbor
untuk Dockerhub :
![Screenshot 2024-03-22 201755](https://hackmd.io/_uploads/S1O7BZiAT.png)
untuk Hrbor:
![Screenshot 2024-03-22 202116](https://hackmd.io/_uploads/SyyyLWjCa.png)
2. Menjalankan image redis
![Screenshot 2024-03-22 203330](https://hackmd.io/_uploads/Skn3OZs0T.png)
.
![Screenshot 2024-03-22 203530](https://hackmd.io/_uploads/BkBNY-iC6.png)
.
![Screenshot 2024-03-22 203631](https://hackmd.io/_uploads/H1qKKZoRp.png)
3. Menampilkan container yang berjalan

![Screenshot 2024-03-22 203935](https://hackmd.io/_uploads/HkxNqbjRa.png)
4. Menampilkan semua docker container
![Screenshot 2024-03-22 204429](https://hackmd.io/_uploads/SyZLjWoC6.png)
5. Menampilkan deskripsi detail dari container
![Screenshot 2024-03-22 204758](https://hackmd.io/_uploads/ry-Qh-o06.png)
6. Menampilkan logs dari container
![Screenshot 2024-03-22 205207](https://hackmd.io/_uploads/ryDzpZjRp.png)
7. Menampilkan live stream resource yang dipakai container
![Screenshot 2024-03-22 205326](https://hackmd.io/_uploads/Hy89Tbi0a.png)
8. Menampilkan proses berjalannya container
![Screenshot 2024-03-22 205516](https://hackmd.io/_uploads/BkU0a-sCa.png)
9. Menonaktifkan continer redis1
![Screenshot 2024-03-22 205823](https://hackmd.io/_uploads/BklqAZi0p.png)

### Running Docker(practice 2)

1. Mencari image nginx dari Dockerhub dan Harbor
untuk mencari dari Dockerhub
![Screenshot 2024-03-22 210237](https://hackmd.io/_uploads/B1nYJGs0p.png)
untuk mencari dari Harbor
![Screenshot 2024-03-22 210443](https://hackmd.io/_uploads/SkEflfo0p.png)

2. Menjalankan image nginx dan meneruskan ke port host
![Screenshot 2024-03-22 213441](https://hackmd.io/_uploads/BJMNwMo0T.png)
3. Menampilkan deskripsi nginx container
![Screenshot 2024-03-22 213627](https://hackmd.io/_uploads/r1wKDzjR6.png)
4. Menjalankan image nginx dan mendeclare container port
![Screenshot 2024-03-22 213737](https://hackmd.io/_uploads/Sy5AwfsCa.png)
5. Test Browsing
![Screenshot 2024-03-22 213912](https://hackmd.io/_uploads/r147uGoAp.png)
6. Menampilkan container(active atau exit)
![Screenshot 2024-03-22 214259](https://hackmd.io/_uploads/HyQbFfsCT.png)
7. Menampilkan image docker
![Screenshot 2024-03-22 214403](https://hackmd.io/_uploads/r1-BFfjAp.png)


### Lab 2.3 (part2)
1. Mencari image nginx dari Dockerhub dan Harbor
![Screenshot 2024-03-22 215617](https://hackmd.io/_uploads/rJb73foRa.png)
untuk harbour:
![Screenshot 2024-03-22 215649](https://hackmd.io/_uploads/HJuShzoRp.png)

2. Menjalankan image nginx1 dan meneruskan dari port host ke container
![Screenshot 2024-03-22 225907](https://hackmd.io/_uploads/HJvkiXs0T.png)

3. Menampilkan deskripsi container nginx
![Screenshot 2024-03-22 230040](https://hackmd.io/_uploads/ByU4oXsCa.png)
4. Menjalankan NGINX image dengan nama nginx2
![Screenshot 2024-03-22 230215](https://hackmd.io/_uploads/rJI5iXjA6.png)
5. Menampilkan container (active/exit)
![Screenshot 2024-03-22 230339](https://hackmd.io/_uploads/rJpl27sAa.png)
6. Check NGINX output di container
![Screenshot 2024-03-22 230744](https://hackmd.io/_uploads/H1WJp7s06.png)
7. Akses container
![Screenshot 2024-03-22 230829](https://hackmd.io/_uploads/HJpZ67sAp.png)
8. Update and install editor on the container.
![Screenshot 2024-03-22 231313](https://hackmd.io/_uploads/Sy97CXoRp.png)
9. Mengedit index.html dan memindahkannya ke direktori /usr/share/nginx/html
![Screenshot 2024-03-22 232043](https://hackmd.io/_uploads/rynyl4o0p.png)
![Screenshot 2024-03-22 232119](https://hackmd.io/_uploads/rk1feVoAT.png)
10. Restart service nginx
![Screenshot 2024-03-22 232207](https://hackmd.io/_uploads/S1CSl4jC6.png)
11. jalankan kembali nginx
![Screenshot 2024-03-22 232318](https://hackmd.io/_uploads/rkEKgVo0T.png)
12. Menampilkan container
![Screenshot 2024-03-23 152051](https://hackmd.io/_uploads/S1EZ-z2C6.png)
13. Check Nginx output pada container
![Screenshot 2024-03-23 155643](https://hackmd.io/_uploads/Hy-qFf20p.png)
14. Menampilkan deskripsi container
![Screenshot 2024-03-23 155832](https://hackmd.io/_uploads/SJwCKf3Aa.png)
![Screenshot 2024-03-23 155849](https://hackmd.io/_uploads/rJTCYM2CT.png)
15. Menampilkan log conttent di container
![Screenshot 2024-03-23 160048](https://hackmd.io/_uploads/rJ_85G20T.png)
16. Menampilkan live resource yang digunakan container
![Screenshot 2024-03-23 160541](https://hackmd.io/_uploads/rk_ujfnAT.png)
![Screenshot 2024-03-23 160607](https://hackmd.io/_uploads/ByM9iGnAT.png)
17. Menampilkan proses berjanlannya container
![Screenshot 2024-03-23 160739](https://hackmd.io/_uploads/Hy6J3MhAa.png)
### Docker run(practice 4)

1. Search image ubuntu from DockerHub & Harbor
from DoclerHub
![Screenshot 2024-03-23 160935](https://hackmd.io/_uploads/H11D3GnR6.png)
from Habor
![Screenshot 2024-03-23 161037](https://hackmd.io/_uploads/Hk2q2fnCa.png)
2. ambil image ubuntu dari harbor
![Screenshot 2024-03-23 162256](https://hackmd.io/_uploads/Sk1Y1XhRp.png)
3. Menjalankan kontainer ubuntu dan akses ke konsol.
![Screenshot 2024-03-23 162535](https://hackmd.io/_uploads/Bk7QemnRT.png)
4. Jalankan kontainer ubuntu dan hapus saat keluar dari kontainer.
![Screenshot 2024-03-23 162702](https://hackmd.io/_uploads/SyDOe72Ra.png)

### Lab 2.4 : Docker Run - Part 3
1. Menjalankan kontainer mysql dengan parameter tambahan.
![Screenshot 2024-03-23 165553](https://hackmd.io/_uploads/BJs4DXhCa.png)
2. Ambil image phpmyadmin from harbor.
![Screenshot 2024-03-23 170308](https://hackmd.io/_uploads/B1klFQ2Ap.png)
3. Menjalankan kontainer phpmyadmin dan menghubungkannya dengan kontainer mysql.
![Screenshot 2024-03-23 170456](https://hackmd.io/_uploads/SJu8Km3RT.png)
4. Login ke browser dengan http://10.10.10.11:8090 
![Screenshot 2024-03-23 170701](https://hackmd.io/_uploads/HyF-qQ2Ap.png)

### Docker run (practice 6)
1. Jalankan kontainer ubuntu dengan nama ubuntu1 & ubuntu2.
![Screenshot 2024-03-23 193438](https://hackmd.io/_uploads/ByKq2HhCa.png)
![Screenshot 2024-03-23 193558](https://hackmd.io/_uploads/rJZ6hB2Ca.png)

2. Menampilkan list container
![Screenshot 2024-03-23 193704](https://hackmd.io/_uploads/H1hbTBnRp.png)
3. pause container ubuntu
![Screenshot 2024-03-23 193801](https://hackmd.io/_uploads/S1SrprnRp.png)
4. cek container ubuntu ketika paused
![Screenshot 2024-03-23 193908](https://hackmd.io/_uploads/ryiuTB3CT.png)

5. cek resource ketika container di pause
![Screenshot 2024-03-23 193942](https://hackmd.io/_uploads/Byj6aBhAp.png)
![Screenshot 2024-03-23 194008](https://hackmd.io/_uploads/S1ZC6HhCa.png)

6. unpause container ubuntu1
![Screenshot 2024-03-23 194117](https://hackmd.io/_uploads/HyizABhAp.png)

### docker run (practice 07)
1.  Membuat wadah database dengan spesifikasi terbatas.
![Screenshot 2024-03-23 194608](https://hackmd.io/_uploads/rJz7y830T.png)
2. Buat wadah wordpress dan sambungkan ke wadah database.
![Screenshot 2024-03-23 194839](https://hackmd.io/_uploads/ryA3y82C6.png)
3. Check logs, running process, and resource.
![Screenshot 2024-03-23 195000](https://hackmd.io/_uploads/HJL7gInR6.png)
![Screenshot 2024-03-23 195016](https://hackmd.io/_uploads/r1UQlI206.png)
- 
![Screenshot 2024-03-23 195154](https://hackmd.io/_uploads/HkOFxIn06.png)
-
![Screenshot 2024-03-23 195251](https://hackmd.io/_uploads/B1RCgInA6.png)
![Screenshot 2024-03-23 195328](https://hackmd.io/_uploads/rJSJ-83Ra.png)

4. Test browsing.
![Screenshot 2024-03-23 195813](https://hackmd.io/_uploads/rJdDMU3AT.png)
![Screenshot 2024-03-23 200001](https://hackmd.io/_uploads/r1kOMIhC6.png)



## Modul 3

### Lab 3.1
1. Membuat dan masuk directory baru
![Screenshot 2024-03-25 130743](https://hackmd.io/_uploads/S1vpVqRRT.png)
2. .Buat file container untuk data volume dengan nama my-volume
![Screenshot 2024-03-25 130849](https://hackmd.io/_uploads/ry--BcCCa.png)
![Screenshot 2024-03-25 130951](https://hackmd.io/_uploads/H1GHB500a.png)
![Screenshot 2024-03-25 131036](https://hackmd.io/_uploads/BkpDr9AR6.png)

3. Ambil volume untuk dipindah ke kontainer
![Screenshot 2024-03-25 131203](https://hackmd.io/_uploads/S1H6Hq006.png)

### Lab 3.2
1. .Buat direktori kerja baru
![Screenshot 2024-03-25 131344](https://hackmd.io/_uploads/SkK78qCA6.png)

2. Membuat server NFS dengan docker
![Screenshot 2024-03-25 131437](https://hackmd.io/_uploads/rkbvUcC06.png)

Menjalankan pada node02

1. Instal paket yang diperlukan, pasang volume pada klien NFS, lalu buat file untuk memeriksa volume
![Screenshot 2024-03-25 131636](https://hackmd.io/_uploads/SymAIcRCT.png)
-
![Screenshot 2024-03-25 134819](https://hackmd.io/_uploads/r1PrC5AAp.png)
-
![Screenshot 2024-03-25 135019](https://hackmd.io/_uploads/Hya3AqART.png)
-
![Screenshot 2024-03-25 134903](https://hackmd.io/_uploads/rJk_A9CCp.png)
2. Verifikasi
![Screenshot 2024-03-25 135115](https://hackmd.io/_uploads/HyOZysA0a.png)

### Lab 3.2
1. Buat Docker Volume
![Screenshot 2024-03-25 135458](https://hackmd.io/_uploads/BJ10ko0Ap.png)
2. Menampilkan list docker volume
![Screenshot 2024-03-25 135540](https://hackmd.io/_uploads/HkTfxiAA6.png)

3. Menampilkan Docker volume detail
![Screenshot 2024-03-25 135626](https://hackmd.io/_uploads/r1nXxoARp.png)
4.  Menjalankan kontainer dengan akses baca dan tulis volume.
![Screenshot 2024-03-25 135907](https://hackmd.io/_uploads/ryVJbjRA6.png)

5. Menampilkan IP address dari container
![Screenshot 2024-03-25 135925](https://hackmd.io/_uploads/SyRCeoCCa.png)

6. Test browsing pada container
![Screenshot 2024-03-25 140028](https://hackmd.io/_uploads/rkM7-jCC6.png)
7. Buat file index.html dan pindahkan ke direktori volume sumber.
![Screenshot 2024-03-25 140122](https://hackmd.io/_uploads/HybLWoCCT.png)
8. Test browsing
![Screenshot 2024-03-25 140230](https://hackmd.io/_uploads/BJw5-sRAp.png)
9. Menjalankan kontainer dengan akses baca volume.
![Screenshot 2024-03-25 140322](https://hackmd.io/_uploads/BytT-iR0p.png)
10. Lihat detail kontainer nginx-rovol
![Screenshot 2024-03-25 140410](https://hackmd.io/_uploads/Sk9lfs0Ap.png)
11. TUGAS
![Screenshot 2024-03-25 140449](https://hackmd.io/_uploads/SkcmfiRCa.png)


### Lab 3.4
Dijalankan pada node02
1. Membuat direktori dan share file index.htm
![Screenshot 2024-03-25 140803](https://hackmd.io/_uploads/rJ7kms00a.png)
2. Lakukan Instalasi plugin sshfs and set plugin sshfs
![Screenshot 2024-03-25 141148](https://hackmd.io/_uploads/S1cCQoC0T.png)
- ls
![Screenshot 2024-03-25 141208](https://hackmd.io/_uploads/SyhJEoA0a.png)
- docker plugin disable [PLUGIN ID]
![Screenshot 2024-03-25 141304](https://hackmd.io/_uploads/HJJMEjRRa.png)
- 
![Screenshot 2024-03-25 141335](https://hackmd.io/_uploads/SJk4Eo0Aa.png)
- 
![Screenshot 2024-03-25 141403](https://hackmd.io/_uploads/S1jSVsA0p.png)
-
![Screenshot 2024-03-25 141432](https://hackmd.io/_uploads/BJLD4jCRT.png)
3. Membuat docker volume dengan driver ssfhs
![Screenshot 2024-03-25 141533](https://hackmd.io/_uploads/BkSjNj0AT.png)
4. Jalankan container dengan volume 
![Screenshot 2024-03-25 141754](https://hackmd.io/_uploads/SJrVSoCAa.png)
5. Test browsing.
![Screenshot 2024-03-25 141906](https://hackmd.io/_uploads/BkYOHoCAa.png)
6. Tugas 
![Screenshot 2024-03-25 142023](https://hackmd.io/_uploads/rk-ASjR0T.png)

### Lab 3.5
1. Menampilkan daftar jaringan pada jaringan docker saat ini.
![Screenshot 2024-03-25 142338](https://hackmd.io/_uploads/H1htLjARa.png)
2. Jalankan 2 wadah alpine yang menjalankan cangkang abu
![Screenshot 2024-03-25 142447](https://hackmd.io/_uploads/SklCIsAC6.png)
3. Buat jaringan docker baru dan lampirkan ke kontainer alpine1.
![Screenshot 2024-03-25 142546](https://hackmd.io/_uploads/HyobwsAA6.png)
4. Periksa alamat IP kontainer alpine2.
![Screenshot 2024-03-25 142642](https://hackmd.io/_uploads/r14SDo0Rp.png)
5. Akses ke kontainer alpine1 dan cek ip
![Screenshot 2024-03-25 142816](https://hackmd.io/_uploads/BJxoPjRRp.png)
6. test ping internet
![Screenshot 2024-03-25 142909](https://hackmd.io/_uploads/HkMCviART.png)
7. Ping test to IP Address of alpine2 container (Success)
![Screenshot 2024-03-25 143050](https://hackmd.io/_uploads/By_4usRCp.png)
8. Ping test to name of alpine2 container  (failed).
![Screenshot 2024-03-25 143156](https://hackmd.io/_uploads/rk0__s0Cp.png)
9. Exit from container alpine1 without closing the shell Press Ctrl+P, Ctrl+Q.

10. TUGAS
![Screenshot 2024-03-25 143311](https://hackmd.io/_uploads/ryfAOo00a.png)

### Lab 3.6: Host Network
1. Jalankan kontainer dari citra nginx dengan hos jaringan.
![Screenshot 2024-03-25 144041](https://hackmd.io/_uploads/HyDt9jAC6.png)
2.  Test browsing to localhost.
![Screenshot 2024-03-25 144114](https://hackmd.io/_uploads/Bkts5s00a.png)
3. Verification IP Address and bound port 80.
![Screenshot 2024-03-25 144228](https://hackmd.io/_uploads/HyTeosCCp.png)
4. Tugas 
![Screenshot 2024-03-25 144319](https://hackmd.io/_uploads/Sy9Qij0Ca.png)

## Modul 4 Membuat custom Docker Container Image

### Docker Images

Di Linux, semuanya adalah file. Seluruh sistem operasi pada dasarnya adalah sebuah sistem berkas dengan berkas dan folder yang disimpan pada disk lokal. Ini adalah fakta penting yang perlu diingat ketika melihat apa itu image container. Seperti yang akan kita lihat, image pada dasarnya adalah tarball besar yang berisi sistem berkas. Lebih khusus lagi, image berisi sistem berkas berlapis.

Image container adalah template tempat container dibuat. Image ini tidak hanya terdiri dari satu blok monolitik tetapi terdiri dari banyak lapisan. Lapisan pertama dalam gambar juga disebut lapisan dasar. Kita dapat melihat ini dalam grafik berikut:

layer images :
![Screenshot 2024-03-25 145119](https://hackmd.io/_uploads/HydWaiARa.png)

Gambar sebagai tumpukan lapisan Setiap lapisan individual berisi file dan folder. Setiap lapisan hanya berisi perubahan pada sistem berkas sehubungan dengan lapisan di bawahnya. Driver penyimpanan menangani detail mengenai cara lapisan-lapisan ini berinteraksi satu sama lain. Tersedia berbagai driver penyimpanan yang memiliki kelebihan dan kekurangan dalam situasi yang berbeda.

Lapisan-lapisan gambar kontainer semuanya tidak dapat diubah. Tidak dapat diubah berarti bahwa setelah dibuat, lapisan tidak dapat diubah. Satu-satunya operasi yang mungkin memengaruhi lapisan adalah penghapusan fisik. Kekekalan layer ini penting karena membuka banyak sekali peluang, seperti yang akan kita lihat.

kita dapat melihat seperti apa custom images untuk aplikasi web:
![Screenshot 2024-03-25 145634](https://hackmd.io/_uploads/HyZBAoCR6.png)
Contoh citra kustom berdasarkan Alpine dan Nginx
 

Lapisan dasar kita di sini terdiri dari distribusi Linux Alpine. Kemudian, di atasnya, terdapat lapisan Nginx. Terakhir, lapisan ketiga berisi semua berkas yang membentuk aplikasi web, seperti berkas HTML, CSS, dan JavaScript.

Docker Hub adalah open registry untuk kontainer. Setiap lapisan hanya berisi data perubahan yang memiliki korelasi dengan lapisan sebelumnya. Konten setiap lapisan dipetakan ke folder khusus pada sistem host, yang biasanya berupa subfolder dari /var/lib/docker/.

Seperti yang telah kita bahas, citra kontainer dibuat dari tumpukan lapisan yang tidak dapat diubah atau hanya dapat dibaca. Saat Docker Engine membuat kontainer dari citra seperti itu, ia menambahkan lapisan kontainer yang dapat ditulis di atas tumpukan lapisan yang tidak dapat diubah. Tumpukan kita sekarang terlihat sebagai berikut:
![Screenshot 2024-03-25 150017](https://hackmd.io/_uploads/S127yhAAp.png)
![Screenshot 2024-03-25 150030](https://hackmd.io/_uploads/SyWEkn0Ap.png)

Dalam docker dapat menjalankan banyak container dengan layer images yang sama. Teknik ini, tentu saja, menghasilkan pengurangan sumber daya yang luar biasa dalam sumber daya yang dikonsumsi, hal ini juga dapat membantu mengurangi waktu pemuatan container, karena hanya lapisan container tipis yang harus dibuat setelah lapisan gambar dimuat ke dalam memori, yang hanya terjadi pada container pertama.

### Docker Registry
Docker Registry adalah aplikasi open source yang dapat Anda jalankan di mana pun Anda inginkan dan menyimpan Docker. Secara general Docker registry merupakan alternatif fitur dari Docker Hub

Ada beberapa fitur Docker Registry yaitu :
-Mengelola registri Anda sendiri, dan terdapat semua layanan repositori sebagai privat, publik, atau gabungan di antara keduanya
-Skalabilitas registri sesuai kebutuhan, berdasarkan berapa banyak dijadikan host atau berapa banyak permintaan dapat dilayani
-Based on command line

### Docker Hub


Docker Hub adalah cara termudah di dunia untuk membuat, mengelola, dan mengirimkan aplikasi kontainer tim Anda.
Repositori Docker Hub memungkinkan Anda berbagi citra kontainer dengan tim, pelanggan, atau komunitas Docker secara luas.

### Memanipulasi Image pada kontainer
Ada berbagai cara untuk mengelola image container secara devops.  Ada dua cara untuk melakukan hal ini:
1. Menyimpan citra kontainer ke file *.tar.

2. Menerbitkan (push) citra kontainer ke registri citra

### Membangun kontainer khusus dengan docker file

Dockerfile adalah berkas teks yang berisi serangkaian instruksi yang ditentukan pengguna. Dockerfile digunakan untuk merakit/membangun kontainer.

Sebelum kita melanjutkan ke pembahasan pada file sebelumnya, kita harus segera menyinggung tentang Alpine Linux.

Apa itu alpine Linux??
Alpine Linux adalah distribusi Linux non-komersial yang dikembangkan secara independen dan kecil yang dirancang untuk keamanan, efisiensi, dan kemudahan penggunaan. Meskipun kecil (lihat bagian berikut), ia menawarkan fondasi yang kuat untuk image kontainer karena repositori paketnya yang luas, dan juga berkat port tidak resmi grsecurity/PaX, yang ditambal ke dalam kernelnya, ia menawarkan perlindungan proaktif terhadap lusinan potensi serangan zero-day dan kerentanan lainnya.

Alpine Linux, karena ukurannya, dan kekuatannya, telah menjadi basis citra default untuk citra kontainer resmi yang disediakan oleh Docker. Oleh karena itu, kita akan menggunakannya di sepanjang buku ini. Untuk memberikan gambaran kepada Anda betapa kecilnya image resmi untuk Alpine Linux, mari kita bandingkan dengan beberapa distribusi lain yang tersedia pada saat buku ini ditulis:

![Screenshot 2024-03-25 152128](https://hackmd.io/_uploads/ry_z4hCCp.png)


Seperti yang dapat Anda lihat dari keluaran Terminal, Alpine Linux hanya berukuran 4,41 MB, berbeda dengan image terbesar, yaitu Fedora, yang berukuran 253 MB. Instalasi bare-metal dari Alpine Linux berukuran sekitar 130 MB, yang masih hampir setengah dari ukuran image container Fedora.

### Lab 4.1: Exploring Dockerfile


1. Clone Repository
![Screenshot 2024-03-25 152608](https://hackmd.io/_uploads/SJM4rhRRa.png)
2. Masuk ke directory
![Screenshot 2024-03-25 152701](https://hackmd.io/_uploads/BJNPS30RT.png)

3. Buat image repositori sebelumnya dan beri nama node-latihan01
![Screenshot 2024-03-25 153537](https://hackmd.io/_uploads/BJ5vvh0Ap.png)
4. Jalankan kontainer dengan image yang telah dibuat sebelumnya dan buka port ke 8080
![Screenshot 2024-03-25 153644](https://hackmd.io/_uploads/Bk0sw2CCa.png)
5. Coba akses kontainer
![Screenshot 2024-03-25 153739](https://hackmd.io/_uploads/SyXkuhA0T.png)

#### Dockerfile (practice 02)
1. Buat direktory latihan02
![Screenshot 2024-03-25 153939](https://hackmd.io/_uploads/HJOPd2AAT.png)
2.Buat Dockerfile
![Screenshot 2024-03-25 155222](https://hackmd.io/_uploads/B12cohACa.png)
3. Create image From Dockerfile.
![Screenshot 2024-03-25 155833](https://hackmd.io/_uploads/S1aa22RAp.png)
4. Display the image that has been created.
![Screenshot 2024-03-25 155928](https://hackmd.io/_uploads/rJBba20RT.png)
5. Test run the image.
![Screenshot 2024-03-25 160038](https://hackmd.io/_uploads/rJNLph0AT.png)
6. Display the container.
![Screenshot 2024-03-25 160133](https://hackmd.io/_uploads/ryCOTnAC6.png)
7. Tugas
![Screenshot 2024-03-25 160320](https://hackmd.io/_uploads/ryDJR30C6.png)


#### Dockerfile (practice 03)


1. Login with Docker ID

![Screenshot 2024-03-25 160938](https://hackmd.io/_uploads/B11K1aCRT.png)
2. Create directory latihan03.
![Screenshot 2024-03-25 161127](https://hackmd.io/_uploads/rJ_Ck6AAp.png)
3. creating file flask,requirements.txt,and Docker file
![Screenshot 2024-03-25 161455](https://hackmd.io/_uploads/Skwse6AC6.png)
4. Create image from Dockerfile.
![Screenshot 2024-03-25 161928](https://hackmd.io/_uploads/SJE2-T0Ra.png)
5. Tag image with docker username.
![Screenshot 2024-03-25 200140](https://hackmd.io/_uploads/S1uQLeJJA.png)
6. Push image to dockerhub.
![Screenshot 2024-03-25 200757](https://hackmd.io/_uploads/H1uhvx11C.png)

7. Running the image .
![Screenshot 2024-03-25 200828](https://hackmd.io/_uploads/rJgXaDeJ1C.png)

8. Test browsing.
![Screenshot 2024-03-25 200859](https://hackmd.io/_uploads/HJo6wlJkC.png)

 9. TUGAS 
![Screenshot 2024-03-25 201057](https://hackmd.io/_uploads/SJQg_lyyR.png)


#### Lab 4.3
1. Create directory latihan-quiz01. Then, enter the directory.
![Screenshot 2024-03-25 203720](https://hackmd.io/_uploads/SJiVCeyk0.png)
2. Clone repository from https://github.com/rivawahyuda/mywebsite.git
![Screenshot 2024-03-25 203821](https://hackmd.io/_uploads/BknIAgkkC.png)
3. Create Dockerfile inside directory latihan-quiz01 with the conditions:
using image: registry.adinusa.id/btacademy/nginx:latest
![Screenshot 2024-03-25 204116](https://hackmd.io/_uploads/rk4Mkb11C.png)
4. Create image with name latihan-quiz01-image.
![Screenshot 2024-03-25 204213](https://hackmd.io/_uploads/rk4rkWJkR.png)
5. Run container with image latihan-quiz01-image, expose port 80, and named quiz01.
![Screenshot 2024-03-25 205418](https://hackmd.io/_uploads/SJtfzZ1kA.png)
6. test browsing
![Screenshot 2024-03-25 205504](https://hackmd.io/_uploads/H15LMZkyA.png)

## DOCKER COMPOSE
### 1. Docker compose
Docker Compose merupakan alat untuk mengatur dan menjalankan container pada satu host docker, baik pada development, Continuous Integration, pengujian, ataupun demo. Alat ini menggunakan pendekatan deklaratif dalam menjalankan containernya. Dimana, dalam mendeskripsikan dan menjalankan aplikasi dalam beberapa container tidak menginputkan pemrograman prosedur pasti yang harus diikuti ketika menemui sebuah masalah.
Docker Compose sangat berguna ketika ingin menjalankan beberapa container sekaligus/ multilayanan

### Hands on Lab 5.1
Pada bagian ini berfokus dalam menginstall Docker Compose. Berikut langkah untuk menyelesaikannya:
1. Download & Install Compose.
![Screenshot 2024-03-26 114535](https://hackmd.io/_uploads/SJRx7CJ1A.png)
2. cek version
![Screenshot 2024-03-26 114556](https://hackmd.io/_uploads/HJzfXAyyC.png)
3. Create a directory my_wordpress and go to the directory
![Screenshot 2024-03-26 144605](https://hackmd.io/_uploads/SJsrTegkR.png)
4. create docker-compose file.
![Screenshot 2024-03-26 144831](https://hackmd.io/_uploads/HyRAplxyR.png)
-
![Screenshot 2024-03-26 145741](https://hackmd.io/_uploads/HJWMxZekR.png)


5. Run compose.
![Screenshot 2024-03-26 144913](https://hackmd.io/_uploads/B1tbRxx1R.png)
6. Display the list of containers and test browsing to the wordpress page that has been created
![Screenshot 2024-03-26 145547](https://hackmd.io/_uploads/BJQqy-gJC.png)
7. Tugas
![Screenshot 2024-03-26 145828](https://hackmd.io/_uploads/SkQ4gZlkR.png)


## Docker Continous Integration (CI)
Continuous Integration (CI) adalah pengembangan yang mengharuskan pengembang mengintegrasikan kode ke dalam repositori bersama beberapa kali dalam sehari. Setiap check-in kemudian diverifikasi oleh build otomatis. CI tidak menghilangkan bug, tetapi membuatnya lebih mudah ditemukan dan dihapus. CI/CD menggabungkan pengembangan dengan pengujian, memungkinkan pengembang untuk membangun suatu kode secara kolaboratif, mengirimkannya ke cabang, dan memeriksa masalah. Hal ini memungkinkan pengembang untuk tidak hanya membangun kode mereka, tetapi juga menguji kode mereka di semua jenis lingkungan dan sesering mungkin untuk menangkap bug di awal siklus pengembangan aplikasi. Karena Docker dapat berintegrasi dengan alat bantu seperti Jenkins dan GitHub, pengembang dapat mengirimkan kode di GitHub, menguji kode, dan secara otomatis memicu pembangunan menggunakan Jenkins, dan setelah citra selesai, citra dapat ditambahkan ke registri Docker. Hal ini menyederhanakan proses, menghemat waktu dalam proses pembangunan dan penyiapan, sekaligus memungkinkan pengembang menjalankan pengujian secara paralel dan mengotomatiskannya sehingga mereka dapat terus bekerja pada proyek lain saat pengujian dijalankan.

proses CI :
![Screenshot 2024-03-26 154726](https://hackmd.io/_uploads/rJWns-g1C.png)
1. Developers melakukan komit ke GitHub

2. GitHub menggunakan webhook untuk memberi tahu Jenkins tentang pembaruan

3. Jenkins menarik repositori GitHub, termasuk berkas Docker yang mendeskripsikan citra, serta aplikasi dan kode uji.

4. Jenkins membangun citra Docker pada simpul budak Jenkins

5. enkins menginstansiasi kontainer Docker pada simpul budak, dan menjalankan pengujian yang sesuai

6. Jika pengujian berhasil, citra kemudian didorong ke Dockerhub atau Docker Trusted Registry.

## Docker Swarm & Portainer
Memanipulasi gambar kontainer yang sudah dibuat sebelumnya untuk membuat dan mengelola layanan terkontainerisasi.

Tujuan

Menjelaskan tentang docker swarm dan portainer

Membangun citra kontainer costum dengan portainer

### Docker Swarm
#### What is Swarm?
Swarm adalah sebuah klaster yang terdiri atas satu atau lebih komputer yang menjalankan Docker. Swarm dapat terdiri atas satu mesin atau lebih, sehingga Anda dapat menggunakan fungsionalitas swarm pada mesin lokal Anda.
 Comment

Dengan diperkenalkannya mode swarm, Docker menerima kemampuan orkestrasi, pengelompokan, dan penjadwalan bawaan. Fitur untuk menangani banyak mesin, seperti pemeriksaan kesehatan, penyeimbangan beban, dan banyak hal bagus lainnya sekarang disertakan secara out-of-the-box.

Dua layanan yang sebelumnya merupakan tambahan eksternal, yang bekerja di atas mesin Docker telah disertakan secara native - Swarm dan Docker Compose. Namun, keduanya tidak hanya dikemas dengan itu.

Tidak seperti Swarm mandiri yang lama, fungsionalitasnya sekarang dibangun ke dalam mesin Docker itu sendiri. Itu adalah layanan terpisah, bukan bagian dari daemon docker dan berinteraksi dengan API Docker (seperti yang masih dilakukan oleh Kubernetes dan kawan-kawan. Anda dapat membaca lebih lanjut tentang konsep ini di sini dan memulai dengan tutorial ini Dengan mengaktifkan mode swarm dan berkas docker-compose.yml yang ditulis menurut spesifikasi versi 3, Anda dapat mengeluarkan perintah docker stack yang memunculkan tumpukan layanan.

Ketika Anda menjalankan kontainer dengan perintah Docker, mode swarm tidak digunakan secara default. Jika Anda menggunakan mode swarm, Anda berurusan dengan tingkat abstraksi yang lebih tinggi - layanan, bukan kontainer. Anda dapat menangani kedua jenis ini pada mesin yang sama.

Saat kontainer berjalan dalam mode layanan, mode swarm mengambil alih dan mengelola siklus hidup layanan. Mode ini berusaha memunculkan sejumlah replika yang diinginkan, seperti yang ditentukan dalam definisi. Bagian dari fungsi tersebut sangat mirip dengan Kubernetes.

#### About Portainer
Portainer adalah alat manajemen kontainer universal yang dapat bekerja dengan Docker dan Kubernetes untuk membuat penyebaran dan pengelolaan aplikasi dan layanan dalam kontainer menjadi lebih mudah dan efisien. Portainer memiliki lebih dari 650.000 pengguna dan 21.700 bintang GitHub, sehingga banyak digunakan dan populer.
 Comment

Portainer adalah UI manajemen yang ringan yang memungkinkan Anda untuk dengan mudah mengelola lingkungan Docker Anda yang berbeda (host Docker atau cluster Swarm). Portainer dimaksudkan agar mudah diterapkan dan digunakan. Portainer terdiri dari satu kontainer yang dapat berjalan pada mesin Docker apa pun (dapat digunakan sebagai kontainer Linux atau kontainer asli Windows, juga mendukung platform lain). Portainer memungkinkan Anda untuk mengelola semua sumber daya Docker Anda (kontainer, image, volume, jaringan, dan lainnya)! Ini kompatibel dengan mesin Docker mandiri dan dengan mode Docker Swarm.

Selama setahun terakhir, Portainer telah menjadi alat andalan saya untuk mengelola penyebaran kontainer. Salah satu alasan utamanya adalah karena Portainer benar-benar membuat bekerja dengan kontainer menjadi mudah dipahami. Bagi saya, hal itu menjadikannya platform manajemen yang jelas bagi admin dan pengembang dari semua tingkat keahlian.


#### Lab 7.1 - Create Swarm
1. Initialization Docker Swarm
![Screenshot 2024-03-26 163058](https://hackmd.io/_uploads/SJWyLMg1R.png)
2. Copy command docker join(eksekusinya di node 2)
![Screenshot 2024-03-26 165158](https://hackmd.io/_uploads/rJ7RqGgyA.png)
![Screenshot 2024-03-26 165820](https://hackmd.io/_uploads/Bks8hMx1C.png)
3. Check if node02 already join
![Screenshot 2024-03-26 165927](https://hackmd.io/_uploads/Sylc2Ml1A.png)


#### Lab 7.2 - Deploy Service to Swarm
Note :
- Pada bagian ini kita harus dapat memastikan nginx berjalan dengan membuat 2 replika dan dapat di akses di semua node
- Pastikan juga layanan pengguna berjalan dengan spesifikasi yang ditentukan
1. Membuat sercive/layanan nginx dengan 2 replika 
![Screenshot 2024-03-27 121035](https://hackmd.io/_uploads/rJoucmZk0.png)
2. Cek servicenya berjalan dengan baik di 2 node
![Screenshot 2024-03-27 121513](https://hackmd.io/_uploads/BkG_jXbJA.png)
3. tes browsing dari node1 dan node2
![Screenshot 2024-03-27 121656](https://hackmd.io/_uploads/ByXy37ZJR.png)
4. Mengecek detail rinci informasi tentang service kita
![Screenshot 2024-03-27 122811](https://hackmd.io/_uploads/B1nOCQbkC.png)
5. Mengecek dimana service bekerja 
![Screenshot 2024-03-27 124403](https://hackmd.io/_uploads/HJM4MNW10.png)
//dapatr dilihat service bekerja pada node1 dan node2
6. Membuat container dengan limit cpu dan memory
![Screenshot 2024-03-27 125142](https://hackmd.io/_uploads/HJZ-4Eb1R.png)
// --reserve-cpu 1: Parameter ini menentukan jumlah CPU yang harus dialokasikan secara minimum untuk setiap kontainer yang berjalan dalam layanan. Di sini, Anda telah menetapkan 1 unit CPU sebagai reserve (minimum) untuk setiap kontainer.
Perbedaan reserve dengan limit pada parameter diatas??
- reserve merupakan batasan minimum suatu semisal sumber daya seperti CPU, harus ada minimum ... disuatu container
- limit, kalau limit merupakan batasan maksimum semisal sumber daya yang dapat digunakan container

7. Memastikan spesifikasi container dengan nama rafi
![Screenshot 2024-03-27 130013](https://hackmd.io/_uploads/rysgI4Wk0.png)


#### Lab 7.3
Note:
- Membuat 1 layanan replica
- dan mengupdate layanan image sistyo/myweb:latest

1. membuat layanan baru dengan nama web2 dengan 3 replica
![Screenshot 2024-03-27 131804](https://hackmd.io/_uploads/ByGN9EZJ0.png)
2. mengubah jumlah replica yang kita buat 
![Screenshot 2024-03-27 132209](https://hackmd.io/_uploads/HJ-miNbJA.png)
3. mengecek apakah replicanya sudah berubah
![Screenshot 2024-03-27 132358](https://hackmd.io/_uploads/S1TFs4-1A.png)
- Melihat berjalannya layanan 
![Screenshot 2024-03-27 132518](https://hackmd.io/_uploads/Hy6RiEbJC.png)
4. Memperbarui image dari layanan web2 kita menjadi sistyo/myweb
![Screenshot 2024-03-27 134119](https://hackmd.io/_uploads/rkGiJBWkR.png)
dapat kita lihat apakah imagenya sudah berubah?
![Screenshot 2024-03-27 134234](https://hackmd.io/_uploads/S1ybgB-JA.png)

#### Lab7.4
Note :
- pada bagian ini berfokus menginstall layanan pontainer dan menghubungkannya dengan  node02

1. Menginstall  portainer di node 01

![Screenshot 2024-03-27 135853](https://hackmd.io/_uploads/H11pmHWkR.png)
2. Access Portainer Dashboard
dengan mengakses 10.10.10.11:9000
![Screenshot 2024-03-27 141033](https://hackmd.io/_uploads/SkupwHb1R.png)
3. Menghubungkan portainer dengan node2
dengan arahan :
Click menu Environments -> Add environmets
Select Docker Swarm -> Start Wizard
Select Agent -> Copy command to run in node01
![Screenshot 2024-03-27 154254](https://hackmd.io/_uploads/Syumn8bJC.png)
4. Memastikan node 2 sudah terhubung
![Screenshot 2024-03-27 154554](https://hackmd.io/_uploads/H1ZXTUb1A.png)

#### Lab7.5
Note :
- Pada bagian ini kita akan membuat kontainer dengan usernamekita-web

1. acces pontainer
http://10.10.10.11:9000
2. buat container dengan langkah berikut:
Select Home -> node02
Click Containers -> + Add Container
Fill the name Column with [username]-web
Fill the Image Coloumn with nginx:latest
Click Publish a new network port -> Fill host coloumn 8080 and container coloumn 80
Node pod-username-node02
Click Deploy the Container
3. berhasil terbuat
![Screenshot 2024-03-27 160856](https://hackmd.io/_uploads/B19KMvby0.png)
4. Cek logs,inspect,stast dari quick menu container
![Screenshot 2024-03-27 161134](https://hackmd.io/_uploads/Skc2stZJC.png)
5. Akses pontainer yang kita buat
![Screenshot 2024-03-27 190646](https://hackmd.io/_uploads/rkhlhKb1C.png)
dengan ip node 2 dan port 8000
10.10.10.12:8000


#### Lab 7.6
Note:
Pada bagian ini kita berfokus untuk membuat image serta push image ke registry
1. Buat image dan dockerfile
![Screenshot 2024-03-27 193716](https://hackmd.io/_uploads/SJEZJsbkA.png)
2. Push image ke repo-gunawanrafi
![Screenshot 2024-03-27 203024](https://hackmd.io/_uploads/HyHKJsb10.png)


## Logging Driver
Manajemen logging ini sangat penting bagi DevOps karena sangat membantu untuk menemukan bug, dan menemukan masalah dengan cepat.
Mengapa begitu? apasih itu logging?
Logging merujuk pada proses mencatat kejadian atau aktivitas yang terjadi dalam sebuah sistem atau aplikasi. Ini melibatkan pengumpulan, penyimpanan, dan analisis catatan atau pesan yang dihasilkan oleh berbagai komponen sistem, seperti aplikasi, layanan, atau infrastruktur.

contoh konfigurasi logging driver 
```bash!
# Add Docker's official GPG key:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}
```

### Lab 8.1: Configuring Logging Driver
Note:
Mencoba membuat log ke dalam directory
1. Membuat file daemon.jason file
![Screenshot 2024-03-27 212627](https://hackmd.io/_uploads/BkhRhoWJC.png)
2. Restart Daemon dan Docker.
![Screenshot 2024-03-27 212834](https://hackmd.io/_uploads/S1xm6oWJR.png)
3. Run container.
![Screenshot 2024-03-27 213146](https://hackmd.io/_uploads/H1OyCjWkA.png)
4. Mengecek logsnya
![Screenshot 2024-03-27 213247](https://hackmd.io/_uploads/SyAzCiZ1R.png)

## Health Check
Digunakan untuk menentukan apakah aplikasi sudah siap dan dapat menjalankan fungsinya.Secara garis besarnya untuk mengecek kesehatan pada kontainer apakah berfungsi dengan baik atau tidak  
Instruksi HEALTHCHECK memiliki dua bentuk:
- Perintah CMD HEALTHCHECK [OPTIONS] (memeriksa kesehatan kontainer dengan menjalankan perintah di dalam kontainer)
- HEALTHCHECK NONE (menonaktifkan pemeriksaan kesehatan apa pun yang diwarisi dari citra dasar)

setelah melihat intruksi diatas, disini juga terdapat opsi opsi untuk mendukung intruksi HEALTHCHECK [OPTION]
Opsi- opsinya adalah:
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)

Ada juga command yang menunjukkan kesehatan kontainer:
0: success - container sehat dan siap digunakan
1: unhealthy - container tidak berfungsi dengan benar
2: reserved - jangan gunakan kode keluar ini

Contoh perintah ketika menjalankan Health Check saat mendefinisikan image:
![Screenshot 2024-03-27 220513](https://hackmd.io/_uploads/HJ46HnZ10.png)
Contoh perintah ketika menjalankan Health Check bersamaan dengan container:
![Screenshot 2024-03-27 220611](https://hackmd.io/_uploads/B1mb8nWJR.png)

### Lab 9.1: Health Check

Note:
- Mmebuat http-healthcheck dalam kondisi tidak sehat/unhealthy.
1. Membuat direktori kerja
![Screenshot 2024-03-27 221149](https://hackmd.io/_uploads/rkUrD2-k0.png)
2. Membuat Dockerfile
![Screenshot 2024-03-27 221910](https://hackmd.io/_uploads/rJQfthWkC.png)
3. Mmebuat image
![Screenshot 2024-03-27 222038](https://hackmd.io/_uploads/B1FIt3ZyC.png)
4. Menjalankan image
![Screenshot 2024-03-27 222148](https://hackmd.io/_uploads/HJzoFh-10.png)
5. Check image
![Screenshot 2024-03-27 222256](https://hackmd.io/_uploads/ByqgqnZy0.png)
6. Check with curl.
![Screenshot 2024-03-27 222406](https://hackmd.io/_uploads/HydX53ZkC.png)

7. Check for unhealthy.
![Screenshot 2024-03-27 222522](https://hackmd.io/_uploads/H1rdqhZ1C.png)
8. Docker container status
![Screenshot 2024-03-27 222618](https://hackmd.io/_uploads/BybhcnWyC.png)
9. Check with curl.
![Screenshot 2024-03-27 222713](https://hackmd.io/_uploads/ryB1s2WyA.png)


#### Lab 9.1(practice02)
Note :
Membuat container dalam keadaan healthy

1. Buat directory
![Screenshot 2024-03-28 124448](https://hackmd.io/_uploads/r1ACQKzJC.png)
2. Membuat file server.js

![Screenshot 2024-03-28 124546](https://hackmd.io/_uploads/rJczNtzyR.png)
3. Membuat dockerfile
![Screenshot 2024-03-28 124707](https://hackmd.io/_uploads/H1jwNFz1C.png)
4. Create image from dockerfile.
 ![Screenshot 2024-03-28 124743](https://hackmd.io/_uploads/rkAt4YzyC.png)
5. Jalankan Image
![Screenshot 2024-03-28 124830](https://hackmd.io/_uploads/S1CnNYf10.png)
6. Check container
![Screenshot 2024-03-28 125028](https://hackmd.io/_uploads/SJoVrtzy0.png)

## Security
1. Security pada Docker 
Docker menggunakan kernel namespaces dan cgroups untuk menyediakan isolasi antara kontainer dan host.Jadi, proses yang terjadi pada satu container tidak dapat di jalankan oleh contaianer lain karena telah terisolasi. Dengan control groups kita dapat menghitung dan membatasi sumber daya yang digunakan, agar setiap container dapat sumber daya yang adil.
Saat menjalankan container docker kita juga akan menjalankan Docker Daemon untuk menjalankan perintah perintah di latar belakang.Docker Daemon ini merupakan proses inti yang mengelola kontainer Docker dan menyediakan layanan Docker.Karena Docker Daemon memiliki akses ke sumber daya yang sensitif,untuk mengaksesnya harus mendapat izin seperti halnya root users. 
2. CIS docker
Docker CIS (Center for Internet Security) adalah serangkaian pedoman keamanan yang disusun oleh CIS untuk membantu organisasi meningkatkan keamanan implementasi dan pengelolaan Docker. CIS Docker Benchmark adalah dokumen referensi yang memberikan panduan langkah demi langkah tentang cara mengkonfigurasi dan mengelola sistem Docker secara aman.Benchmark CIS juga  menyediakan pemeriksaan konfigurasi, seperti menetapkan resource, mengurangi hak istimewa, dan read only mode saat menjalankan image.
3. Secure Computing Mode
Secure Computing Mode (seccomp) adalah fitur pada kernel Linux yang digunakan untuk membatasi akses dan tindakan yang tersedia dalam sebuah kontainer. Dengan menggunakan seccomp, pengguna dapat mengontrol operasi sistem yang dapat dilakukan oleh proses di dalam kontainer, sehingga memperkuat keamanan lingkungan Docker atau sistem yang menjalankan kontainer.fitur ini hanya akan tersedia jika Docker telah dikompilasi dengan dukungan seccomp dan kernel sistem telah dikonfigurasi dengan opsi CONFIG_SECCOMP diaktifkan.
4. Secret
Dalam konteks Docker Swarm, "secret" adalah sejenis data rahasia yang seharusnya tidak ditransmisikan melalui jaringan atau disimpan tanpa terenkripsi dalam Dockerfile atau dalam kode sumber aplikasi Anda. Secrets ini bisa berupa informasi sensitif seperti nama pengguna dan kata sandi, kunci SSH, sertifikat SSL, atau data penting lainnya seperti nama database atau server internal. Tujuannya adalah untuk melindungi data sensitif ini dari akses yang tidak sah atau penyalahgunaan.
Dengan docker swarm data data ini diolah secara central dan diberikan ke container container yang membutuhkan. Secrets dienkripsi selama transit dan saat berada dalam istirahat di Docker swarm. Hanya layanan-layanan yang telah diberikan akses eksplisit yang dapat mengakses secret tertentu, dan hanya saat tugas-tugas layanan tersebut sedang berjalan.
Perlu diketahui juga secrets ini hanya ada di docker swarm tidak ada di container mandiri.
## Storage Driver 
Storage driver berperan dalam memberikan akses kepada pengguna ke dalam lapisan container writeable.jadi kita dapat menciptakan data di lapisan ini.Disini kita juga dapat menulis file dan menulis perubahan sistem file pada container. Namun perlu diketahui, data yang ditulis dilapisan ini tidak akan bertahan ketika container dihapus.
Contoh contoh storage drivers :
1. Overlays 
Ini adalah storage driver yang disukai dan direkomendasikan untuk semua distribusi Linux yang didukung saat ini. Tidak memerlukan konfigurasi tambahan. Overlay2 memungkinkan penggunaan lapisan overlay untuk menyimpan perubahan yang dilakukan pada container dan memberikan performa yang baik.
2. Aufs
Aufs adalah storage driver yang pernah disukai sebelum Docker versi 18.06, terutama saat berjalan di Ubuntu 14.04 dengan kernel 3.13 yang tidak mendukung overlay2. Namun, aufs tidak lagi direkomendasikan karena peningkatan performa dan keandalan overlay2.
3. fuse-overlayfs
Fuse-overlayfs digunakan terutama untuk menjalankan Docker mode rootless di host yang tidak mendukung overlay2 mode rootless. Namun, pada Ubuntu dan Debian 10, tidak perlu menggunakan fuse-overlayfs karena overlay2 sudah dapat berfungsi bahkan dalam mode rootless.
4. devicemapper
Devicemapper didukung tetapi lebih cocok untuk lingkungan produksi jika menggunakan direct-lvm. Direct-lvm memiliki performa yang lebih baik daripada loopback-lvm, yang memiliki performa yang buruk. Pada awalnya, devicemapper adalah storage driver yang direkomendasikan untuk CentOS dan RHEL karena kernel mereka tidak mendukung overlay2. Namun, versi terbaru dari CentOS dan RHEL kini mendukung overlay2, yang sekarang menjadi driver yang direkomendasikan.
5. btrfs dan zfs
Storage driver ini digunakan jika mereka adalah filesystem dasar (filesystem dari host tempat Docker diinstal). Kedua filesystem ini memungkinkan opsi canggih seperti pembuatan "snapshot", tetapi memerlukan pemeliharaan dan setup yang lebih rumit.
6. vfs
Storage driver ini dimaksudkan untuk keperluan pengujian dan situasi di mana tidak ada filesystem copy-on-write yang dapat digunakan. Performa storage driver ini buruk dan tidak direkomendasikan untuk penggunaan produksi.

### Lab 11.1
1. Membuat file konfigurasi daemon dan menentukan storage druver yang digunakan 'nvs'
![Screenshot 2024-03-28 141940](https://hackmd.io/_uploads/HkjGccfyR.png)
2. restart service docker
![Screenshot 2024-03-28 142949](https://hackmd.io/_uploads/rJN535fyR.png)
setelah kita melakukan konfigurasi kita harus me restart agar konfigurasi tersebut dapat diterapkan
3. Check the docker info.
![Screenshot 2024-03-28 143510](https://hackmd.io/_uploads/By96pqzyC.png)
![Screenshot 2024-03-28 143555](https://hackmd.io/_uploads/ryT1C5GyC.png)
4.  Check with docker pull.
![Screenshot 2024-03-28 143649](https://hackmd.io/_uploads/SyUm05fkC.png)
5. Check docker directory
![Screenshot 2024-03-28 143745](https://hackmd.io/_uploads/ryDPA5Gk0.png)

## Logging and Eror handling
Logging dan Penanganan Kesalahan merupakan bagian penting dalam pengelolaan kontainer Docker. Perintah docker logs atau docker service logs menampilkan output jika menjalankan nya di terminal interaktif. Biasanya, pada perintah UNIX dan LINUX akan menghasilkan 3 aliran input/output saat berjalan,yang disebut STDIN,STDOUT, dan STDERR.STDIN berisi masukan dari keyboard. STDOUT biasanya output normal printah, dan STDERR biasanya digunakan untuk mengeluarkan pesan kesalahan/error.

Contoh melakukan log check:
1. Check history image.
![Screenshot 2024-03-28 173404](https://hackmd.io/_uploads/SJsjDTM1A.png)
2.  Run nginx.
![Screenshot 2024-03-28 173452](https://hackmd.io/_uploads/HyyJOazJC.png)
3. Check the filesystem on nginx
![Screenshot 2024-03-28 173719](https://hackmd.io/_uploads/S1aPdpMyA.png)
perintah ini sebenanarnya digunakan untuk menampilkan perubahan yang terjadi pada sistem file container dengan nama nginx1 sejak kontainer tersebut dibuat.
- C menunjukkan perubahan pada direktori atau file yang sudah ada sebelumnya.
- A menunjukkan penambahan direktori atau file yang belum ada sebelumnya.
4. Cek log 
- menampilkan logs dengan detail
![Screenshot 2024-03-28 174149](https://hackmd.io/_uploads/SJSFYazkC.png)
- Menampilkan logs dengan timestamp
![Screenshot 2024-03-28 174256](https://hackmd.io/_uploads/ryC3YTM10.png)
- menampilkan logs dari nginx
![Screenshot 2024-03-28 174858](https://hackmd.io/_uploads/HJ_QiaM1A.png)


