# DOCKER FUNDAMENTAL

## Table of Content
[TOC]
### 1. Apa itu Docker?
#### Tahapan deploying application
1. Before Docker

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

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 :

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 :

2. Set up NAT network

3. Set up Host only

4. Buat VM 1 dengan nama Docker-Node1

5. Cloning VM1

#### 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

3. apply konfigurasi network terakhir

4. ubah hostname

5. map host on etc/hosts/

6. lakukan juga pada node02
#### buat SSH keygen
1. buat ssh keygen pada node1 dan node2

2. copyn public key ke semua node

3. check login apakah bisa tanpa password?

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:

5. Automate ssh-add automatically when logged in

6. Login ke adinusa

setelah eror seharian
7. grading

8. Lab 1.1

## 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

2. melakukan instalasi paket paket

3. Membuat dirketori baru

4. menyimpan kunci publik docker GPG ke dalam direktori

5. 
6. melakukan update

7. install dockenyaa

8. Melihat versi docker

9. Melihat detail instalasi docker

10. Menambah user di docker group

11. Tes instalasi docker

12. Tampilkan image yang di download

13. Display all container (active or exit).

### Lab 2.2
1. Mencari image redis dari docker hub dan harbor
untuk Dockerhub :

untuk Hrbor:

2. Menjalankan image redis

.

.

3. Menampilkan container yang berjalan

4. Menampilkan semua docker container

5. Menampilkan deskripsi detail dari container

6. Menampilkan logs dari container

7. Menampilkan live stream resource yang dipakai container

8. Menampilkan proses berjalannya container

9. Menonaktifkan continer redis1

### Running Docker(practice 2)
1. Mencari image nginx dari Dockerhub dan Harbor
untuk mencari dari Dockerhub

untuk mencari dari Harbor

2. Menjalankan image nginx dan meneruskan ke port host

3. Menampilkan deskripsi nginx container

4. Menjalankan image nginx dan mendeclare container port

5. Test Browsing

6. Menampilkan container(active atau exit)

7. Menampilkan image docker

### Lab 2.3 (part2)
1. Mencari image nginx dari Dockerhub dan Harbor

untuk harbour:

2. Menjalankan image nginx1 dan meneruskan dari port host ke container

3. Menampilkan deskripsi container nginx

4. Menjalankan NGINX image dengan nama nginx2

5. Menampilkan container (active/exit)

6. Check NGINX output di container

7. Akses container

8. Update and install editor on the container.

9. Mengedit index.html dan memindahkannya ke direktori /usr/share/nginx/html


10. Restart service nginx

11. jalankan kembali nginx

12. Menampilkan container

13. Check Nginx output pada container

14. Menampilkan deskripsi container


15. Menampilkan log conttent di container

16. Menampilkan live resource yang digunakan container


17. Menampilkan proses berjanlannya container

### Docker run(practice 4)
1. Search image ubuntu from DockerHub & Harbor
from DoclerHub

from Habor

2. ambil image ubuntu dari harbor

3. Menjalankan kontainer ubuntu dan akses ke konsol.

4. Jalankan kontainer ubuntu dan hapus saat keluar dari kontainer.

### Lab 2.4 : Docker Run - Part 3
1. Menjalankan kontainer mysql dengan parameter tambahan.

2. Ambil image phpmyadmin from harbor.

3. Menjalankan kontainer phpmyadmin dan menghubungkannya dengan kontainer mysql.

4. Login ke browser dengan http://10.10.10.11:8090

### Docker run (practice 6)
1. Jalankan kontainer ubuntu dengan nama ubuntu1 & ubuntu2.


2. Menampilkan list container

3. pause container ubuntu

4. cek container ubuntu ketika paused

5. cek resource ketika container di pause


6. unpause container ubuntu1

### docker run (practice 07)
1. Membuat wadah database dengan spesifikasi terbatas.

2. Buat wadah wordpress dan sambungkan ke wadah database.

3. Check logs, running process, and resource.


-

-


4. Test browsing.


## Modul 3
### Lab 3.1
1. Membuat dan masuk directory baru

2. .Buat file container untuk data volume dengan nama my-volume



3. Ambil volume untuk dipindah ke kontainer

### Lab 3.2
1. .Buat direktori kerja baru

2. Membuat server NFS dengan docker

Menjalankan pada node02
1. Instal paket yang diperlukan, pasang volume pada klien NFS, lalu buat file untuk memeriksa volume

-

-

-

2. Verifikasi

### Lab 3.2
1. Buat Docker Volume

2. Menampilkan list docker volume

3. Menampilkan Docker volume detail

4. Menjalankan kontainer dengan akses baca dan tulis volume.

5. Menampilkan IP address dari container

6. Test browsing pada container

7. Buat file index.html dan pindahkan ke direktori volume sumber.

8. Test browsing

9. Menjalankan kontainer dengan akses baca volume.

10. Lihat detail kontainer nginx-rovol

11. TUGAS

### Lab 3.4
Dijalankan pada node02
1. Membuat direktori dan share file index.htm

2. Lakukan Instalasi plugin sshfs and set plugin sshfs

- ls

- docker plugin disable [PLUGIN ID]

-

-

-

3. Membuat docker volume dengan driver ssfhs

4. Jalankan container dengan volume

5. Test browsing.

6. Tugas

### Lab 3.5
1. Menampilkan daftar jaringan pada jaringan docker saat ini.

2. Jalankan 2 wadah alpine yang menjalankan cangkang abu

3. Buat jaringan docker baru dan lampirkan ke kontainer alpine1.

4. Periksa alamat IP kontainer alpine2.

5. Akses ke kontainer alpine1 dan cek ip

6. test ping internet

7. Ping test to IP Address of alpine2 container (Success)

8. Ping test to name of alpine2 container (failed).

9. Exit from container alpine1 without closing the shell Press Ctrl+P, Ctrl+Q.
10. TUGAS

### Lab 3.6: Host Network
1. Jalankan kontainer dari citra nginx dengan hos jaringan.

2. Test browsing to localhost.

3. Verification IP Address and bound port 80.

4. Tugas

## 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 :

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:

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:


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:

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

2. Masuk ke directory

3. Buat image repositori sebelumnya dan beri nama node-latihan01

4. Jalankan kontainer dengan image yang telah dibuat sebelumnya dan buka port ke 8080

5. Coba akses kontainer

#### Dockerfile (practice 02)
1. Buat direktory latihan02

2.Buat Dockerfile

3. Create image From Dockerfile.

4. Display the image that has been created.

5. Test run the image.

6. Display the container.

7. Tugas

#### Dockerfile (practice 03)
1. Login with Docker ID

2. Create directory latihan03.

3. creating file flask,requirements.txt,and Docker file

4. Create image from Dockerfile.

5. Tag image with docker username.

6. Push image to dockerhub.

7. Running the image .

8. Test browsing.

9. TUGAS

#### Lab 4.3
1. Create directory latihan-quiz01. Then, enter the directory.

2. Clone repository from https://github.com/rivawahyuda/mywebsite.git

3. Create Dockerfile inside directory latihan-quiz01 with the conditions:
using image: registry.adinusa.id/btacademy/nginx:latest

4. Create image with name latihan-quiz01-image.

5. Run container with image latihan-quiz01-image, expose port 80, and named quiz01.

6. test browsing

## 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.

2. cek version

3. Create a directory my_wordpress and go to the directory

4. create docker-compose file.

-

5. Run compose.

6. Display the list of containers and test browsing to the wordpress page that has been created

7. Tugas

## 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 :

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

2. Copy command docker join(eksekusinya di node 2)


3. Check if node02 already join

#### 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

2. Cek servicenya berjalan dengan baik di 2 node

3. tes browsing dari node1 dan node2

4. Mengecek detail rinci informasi tentang service kita

5. Mengecek dimana service bekerja

//dapatr dilihat service bekerja pada node1 dan node2
6. Membuat container dengan limit cpu dan memory

// --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

#### 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

2. mengubah jumlah replica yang kita buat

3. mengecek apakah replicanya sudah berubah

- Melihat berjalannya layanan

4. Memperbarui image dari layanan web2 kita menjadi sistyo/myweb

dapat kita lihat apakah imagenya sudah berubah?

#### Lab7.4
Note :
- pada bagian ini berfokus menginstall layanan pontainer dan menghubungkannya dengan node02
1. Menginstall portainer di node 01

2. Access Portainer Dashboard
dengan mengakses 10.10.10.11:9000

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

4. Memastikan node 2 sudah terhubung

#### 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

4. Cek logs,inspect,stast dari quick menu container

5. Akses pontainer yang kita buat

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

2. Push image ke repo-gunawanrafi

## 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

2. Restart Daemon dan Docker.

3. Run container.

4. Mengecek logsnya

## 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:

Contoh perintah ketika menjalankan Health Check bersamaan dengan container:

### Lab 9.1: Health Check
Note:
- Mmebuat http-healthcheck dalam kondisi tidak sehat/unhealthy.
1. Membuat direktori kerja

2. Membuat Dockerfile

3. Mmebuat image

4. Menjalankan image

5. Check image

6. Check with curl.

7. Check for unhealthy.

8. Docker container status

9. Check with curl.

#### Lab 9.1(practice02)
Note :
Membuat container dalam keadaan healthy
1. Buat directory

2. Membuat file server.js

3. Membuat dockerfile

4. Create image from dockerfile.

5. Jalankan Image

6. Check container

## 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'

2. restart service docker

setelah kita melakukan konfigurasi kita harus me restart agar konfigurasi tersebut dapat diterapkan
3. Check the docker info.


4. Check with docker pull.

5. Check docker directory

## 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.

2. Run nginx.

3. Check the filesystem on nginx

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

- Menampilkan logs dengan timestamp

- menampilkan logs dari nginx
