Virtual Machine
Dalam dunia Infrastructure, kita sudah terbiasa dengan yang namanya VM (Virtual
Machine)
Saat membuat sebuah VM, biasanya kita akan menginstall sistem operasi juga di VM nya
Masalah ketika kita menggunakan VM adalah proses yang lambat ketika pembuatan VM
nya, dan butuh waktu untuk boot sistem operasi di dalam VM tersebut ketika kita
menjalankan VM atau me-restart VM tersebut
Misalkan kita memiliki data center sendiri seperti gambar diatas, maka dalam
infrastructure kita perlu menginstall hypervisor (vm manager) contohnya seperti
VMware, virtualbox.
Jika kita install sebuah virtual machine dalam hypervisor kita perlu untuk mengintall
sistem operasi dari vm tersebut seperti linux, ubuntu dll. Walaupun kita tidak
membutuhkan sistem operasi, namun untuk menjalankan vm wajib menginstall
Operating systemnya.
Misalkan kita memiliki 3 virtual machine 3-3nya memiliki sistem operasi sendiri
Container
Berbeda dengan VM, Container sendiri berfokus pada sisi Aplikasi
Container sendiri sebenarnya berjalan diatas aplikasi Container Manager yang berjalan
di sistem operasi.
Yang membedakan dengan VM adalah, pada Container, kita bisa mem-package aplikasi
dan dependency-nya tanpa harus menggabungkan sistem operasi
Container akan menggunakan sistem operasi host dimana Container Manager nya
berjalan, oleh karena itu, Container akan lebih hemat resource dan lebih cepat jalan
nya, karena tidak butuh sistem operasi sendiri
Jika kita menggunakan container, dapat langsung menggunakan sistem operasi bawaan
dari container manager. Sementara itu, virtual machine memerlukan OS yang harus
diinstall terlebih dahulu agar dapat digunakan dan dijalankan.
Ukuran Container biasanya hanya hitungan MB sesuai dengan ukuran dari aplikasi kita,
berbeda dengan VM yang bisa sampai GB karena di dalamnya ada sistem operasinya
Diagram Container
Gambar diatas terdiri dari infrastructure yang didalamnya memiliki sistem operasi (ex :
windows / mac/ linux). Dalam sistem operasinya kita akan menginstall docker (salah
satu container manager).
Dengan menggunakan container manager docker ini kita dapat membuat container-
container ( App A, App B, App C, App D, App E, App F )yang berisi aplikasinya saja tanpa
ada lagi sistem operasinya
Antar container A,B,C,D,E dan F terisolasi jadi container tidak akan menggangu
container lainnya.
Apa perbedaan dengan langsung menginstall aplikasi tanpa menggunakan docker ?
Docker itu terisolasi maka tidak akan menganggu container lainnya. Contoh :
misalkan kita menginstall databse MySQL, lalu installnya ada 3 di laptop tanpa
menggunakan container maka akan terjadi bentrok antar 3 yang MySQL yang diinstall,
seperti portnya bentrok sehingga harus mengganti portnya.
Kalau menggunakan container, dia terisolasi dalam satu container tersebut. Jika
kita menginstall MyQSL pada masing-masing container itu tidak masalah karena
container bersifat terisolasi.
DOCKER
Docker adalah salah satu implementasi Container Manager yang saat ini paling populer
Docker merupakan teknologi yang masih baru, karena baru diperkenalkan sekitar tahun
2013
Docker adalah aplikasi yang free dan Open Source, sehingga bisa kita gunakan secara
bebas
https://www.docker.com/
Docker Architecture
Docker menggunakan arsitektur Client-Server
Docker client berkomunikasi dengan Docker daemon (server)
Saat kita menginstall Docker, biasanya didalamnya sudah terdapat Docker Client dan
Docker Daemon
Docker Client dan Docker Daemon bisa berjalan di satu sistem operasi yang sama
Docker Client dan Docker Daemon berkomunikasi menggunakan REST API
Perintah-perintah dilakukan pada sisi client. Namun perintah tersebut tidak diesksekusi
pada sisi client. Perintah tersebut dikirim ke docker daemon (docker server) untuk
mengeksekusi perintahnya.
Menginstall Docker
Docker bisa di install hampir disemua sistem operasi
Untuk menginstall di Windows dan Mac, kita bisa menggunakan Docker Desktop
https://docs.docker.com/get-docker/
Untuk Linux, kita bisa install dari repository sesuai distro linux masing-masing
https://docs.docker.com/engine/install/
Mengecek Instalasi Docker
Untuk mengecek apakah Docker Daemon sudah berjalan, kita bisa gunakan
perintah : docker version pada terminal. Jika berhasil maka akan muncul informasi
seperti pada gambar dibawah ini.
Docker Registry
Docker Registry adalah tempat kita menyimpan Docker Image.
Dengan menggunakan Docker Registry, kita bisa menyimpan Image yang kita buat, dan
bisa digunakan di Docker Daemon dimanapun selama bisa terkoneksi ke Docker Registry
Lalu pada hasil search terdapat redis yang merupakan docker official image, kita klik
redis tersebut.
Setelah kita klik maka akan muncul tampilan seperti dibawah ini dan kita pilih Tags yang
berada di samping overview.
Setelah kita pilih tag maka akan muncul tag-tag dari redis. Tag merupakan version dari
aplikasi tersebut dalam docker.
Sebagai contoh kita dapat menggunakan tag latest (version latest)
Lalu kita jalankan command docker pull redis:latest pada terminal sehingga docker akan
mendownload redis.
Menghapus Docker Image :
Dapat menggunakan command : docker image rm namaimage:tag
Untuk memastikan bahwa image tersebut sudah dihapus, dapat dicek dengan docker
image ls dan lihat apakah masih ada nama image tersebut.
Docker Container
Jika Docker Image seperti installer aplikasi, maka Docker Container mirip seperi
aplikasi hasil installernya.
Satu Docker Image bisa digunakan untuk membuat beberapa Docker Container,
asalkan nama Docker Containernya berbeda.
Jika kita sudah membuat Docker Container, maka Docker Image yang digunakan tidak
bisa dihapus, hal ini dikarenakan sebenarnya Docker Container tidak meng-copy isi
Docker Image, tapi hanya menggunakannya isinya saja.
Status Container :
Saat kita membuat container, secara default container tersebut tidak akan
berjalan
Mirip seperti ketika kita install aplikasi, jika kita tidak jalankan, maka aplikasi
tersebut tidak akan berjalan, sama halnya dengan container.
Oleh karena itu, setelah membuat container, kita perlu menjalankannya jika
memang ingin menjalankan containernya.
Melihat Container :
Untuk Untuk melihat semua container, baik yang sedang berjalan atau tidak di
Docker Daemon, kita bisa gunakan perintah :
docker container ls -a
Sedangkan jika kita ingin melihat container yang sedang berjalan saja, kita bisa
gunakan perintah :
docker container ls
Membuat Container :
Apabila saat membuat sebuah container image yang digunakan belum diinstall
maka docker akan secara otomatis mendownload image tersebut.
Untuk membuat container, dapat menggunakan command :
docker container create --name namacontainer namaimage:tag
Setelah berhasil maka akan muncul id dari container yang telah dibuat. id yang
dihasilkan random dan pasti berbeda dari container yang lain (unique).
Sekarang kita coba cek container yang sudah dibuat. Container redis memiliki
Status Created.
Menjalankan Container :
Untuk menjalankan container yang sudah dibuat, dapat menggunakan command :
docker container start namacontainer atau docker container start idcontainer
Seperti yang dapat kita lihat pada gambar diatas status dari container berubah
menjadi Up About a minute dan juga muncul port dari container yaitu 6379/tcp.
Menghentikan Container :
Untuk menghentikan container dapat menggunakan command :
docker container stop namacontainer atau docker container stop idcontainer
Seperti yang dapat dilihat statusnya berubah menjadi exited dan portnya dihapus.
Menghapus Container :
Untuk menghapus container dapat menggunakan command :
docker container rm namacontainer
Seperti yang dapat dilihat bahwa tidak ada lagi container contohredis.
Contoh Kasus :
Misalkan contoh kasus dimana kita memiliki 2 container dan memiliki port yang
sama maka, container tersebut tidak akan bentrok karena port yang digunakan
bukan menggunakan sistem operasi kita melainkan menggunakan port dari
masing-masing container tersebut karena container bersifat terisolasi.
Container Log
Kadang ketika terjadi masalah dengan aplikasi yang terdapat dalam container, kita
perlu melihat log dari aplikasinya.
Hal ini dilakukan untuk melihat detail kejadian apa yang terjadi di aplikasi,
sehingga akan memudahkan kita ketika mendapat masalah.
Atau jika ingin melihat log secara realtime dapat menggunakan command :
docker container logs -f namacontainer
Jika ada log baru maka log tersebut akan otomatis keluar
Container Exec
Saat kita membuat container, aplikasi yang terdapat di dalam container hanya bisa
diakses dari dalam container itu sendiri.
Oleh karena itu, kadang kita perlu masuk ke dalam container nya itu sendiri untuk
misalnya melihat aplikasi atau mengakses langsung aplikasi.
Untuk masuk ke dalam container, kita bisa menggunakan fitur Container Exec,
dimana digunakan untuk mengeksekusi kode program yang terdapat di dalam
container
Masuk Ke Container :
Untuk masuk ke dalam container, kita bisa mencoba mengeksekusi program bash
script yang terdapat di dalam container dengan bantuan Container Exec :
docker container exec -i -t namacontainer /bin/bash
-i adalah argument interaktif, menjaga input tetap aktif
-t adalah argument untuk alokasi pseudo-TTY (terminal akses)
Dan /bin/bash contoh kode program yang terdapat di dalam container
Container Port
Saat menjalankan container, container tersebut terisolasi di dalam Docker
Artinya sistem Host (misal Laptop kita), tidak bisa mengakses aplikasi yang ada di dalam
container secara langsung, salah satu caranya adalah harus menggunakan Container
Exec untuk masuk ke dalam container nya.
Biasanya, sebuah aplikasi berjalan pada port tertentu, misal saat kita menjalankan
aplikasi Redis, dia berjalan pada port 6379, kita bisa melihat port apa yang digunakan
ketika melihat semua daftar container
Port hanya berjalan dalam container dan tidak dapat diakses dari luar seperti localhost.
Port Forwarding :
Docker memiliki kemampuan untuk melakukan port forwarding, yaitu
meneruskan sebuah port yang terdapat di sistem Host nya ke dalam Docker
Container
Cara ini cocok jika kita ingin mengekspos port yang terdapat di container ke luar
melalui sistem Host nya
Pertama, untuk menggunakan image nginx kita pull terlebih dahulu imagenya :
docker image pull nginx:latest
Setelah itu kita buat container dengan port forwading. port 8080 mewakili port
dari sistem OS kita, sedangkan 80 itu port containernnya.
docker container create --name contohnginx --publish 8080:80 nginx:latest
Seperti yang dapat dilihat portnya muncul setelah container dijalankan. kita bisa
cek dengan mengakses localhost:8080 pada browser di device.
Jika kita ingin melakukan port forwarding lebih dari satu, kita bisa tambahkan
dua kali parameter --publish
--publish juga bisa disingkat menggunakan -p
2. Setelah itu kita bisa buat sebuah container baru untuk mongodb dengan env
variabelnya menggunakan command berikut : docker container create --
name contohmongo --publish 3030:3030 --env
MONGO_INITDB_ROOT_USERNAME=richie --env
MONGO_INITDB_ROOT_PASSWORD=richie mongo:latest
5. Sekarang kita cek apakah port dari contohmongo sudah dijalankan dengan
menggunakan command : docker container ls
Container Stats
Saat menjalankan beberapa container, di sistem host, penggunaan resource seperti CPU
dan Memory hanya terlihat digunakan oleh Docker saja.
Kadang kita ingin melihat detail dari penggunaan resource untuk tiap containernya
Untungnya docker memiliki kemampuan untuk melihat penggunaan resource dari tiap
container yang sedang berjalan.
Kita bisa menggunakan perintah :
docker container stats
Memory :
Saat membuat container, kita bisa menentukan jumlah memory yang bisa
digunakan oleh container ini, dengan menggunakan perintah --memory diikuti
dengan angka memory yang diperbolehkan untuk digunakan
Kita bisa menambahkan ukuran dalam bentu b (bytes), k (kilo bytes), m (mega
bytes), atau g (giga bytes), misal 100m artinya 100 mega bytes
CPU :
Selain mengatur Memory, kita juga bisa menentukan berapa jumlah CPU yang
bisa digunakan oleh container dengan parameter --cpus
Jika misal kita set dengan nilai 1.5, artinya container bisa menggunakan satu dan
setengah CPU core
Contoh Penerapan :
1. Pertama-tama kita buat dulu container baru dengan command :
docker container create --name smallnginx --memory 100m --cpus 0.5 --publish
8081:81 nginx:latest
2. Setelah container berhasil dibuat, kita cek dulu apakah container terbuat dengan
command : docker container ls -a
4. setelah dijalankan kita bisa liat statistic dari container tersebut dengan :
docker container stats
5. Seperti yang dapat dilihat bahwa limit dari memorynya menjadi 100MB dan cpu
yang dipakai hanya 0.5 saja. Misalkan CPU-nya mencapai 100%, maka hal ini
tidak menjadi masalah karena hanya memakan 0.5 core CPU saja. Sama halnya
dengan Memory Usage.
BIND MOUNTS
Bind Mounts merupakan kemampuan melakukan mounting (sharing) file atau folder
yang terdapat di sistem host ke container yang terdapat di docker
Fitur ini sangat berguna ketika misal kita ingin mengirim konfigurasi dari luar container,
atau misal menyimpan data yang dibuat di aplikasi di dalam container ke dalam folder di
sistem host
Jika file atau folder tidak ada di sistem host, secara otomatis akan dibuatkan oleh Docker
Untuk melakukan mounting, kita bisa menggunakan parameter --mount ketika
membuat container
Isi dari parameter --mount memiliki aturan tersendiri
Melakukan Mounting :
Untuk melakukan mounting, kita bisa menggunakan perintah berikut :
docker container create --name namacontainer --mount
“type=bind,source=folder,destination=folder,readonly” image:tag
Contoh Penerapan :
1. Misalkan kita ingin membuat sebuah mongodb data pada container dan juga
dapat disimpan dalam sistem kita sendiri.
5. Setelah itu kita buat container baru yang bisa melakukan mount terhadap device
kita menggunakan command :
docker container create --name contohmongo --publish 27017:27017 --mount
"type=bind,source=/Users/richieoey/Documents/Mitra Integrasi
Informatika/Materi Pembelajaran/Belajar-Docker-Dasar/mongo-
data,destination=/data/db" --env MONGO_INITDB_ROOT_USERNAME=richie
--env MONGO_INITDB_ROOT_PASSWORD=richie mongo:latest
6. Jika berhasil maka kita jalankan container tersebut dengan : docker container
start contohmongo
Dan pada folder setelah dijalankan akan muncul seperti ini yang mengartikan
bahwa mongodb berhasil dijalankan dan disimpan dalam folder local.
7. Kelebihan dari mounting ini yaitu jika kita menghapus container maka datanya
tetap tersimpan dalam device kita, tetapi data dalam containernya hilang. Dan
misalkan kita buat containernya kembali datanya tetap aman asalkan masi
tersimpan pada folder local.
DOCKER VOLUME
Fitur Bind Mounts sudah ada sejak Docker versi awal, di versi terbaru direkomendasikan
menggunakan Docker Volume
Docker Volume mirip dengan Bind Mounts, bedanya adalah terdapat management
Volume, dimana kita bisa membuat Volume, melihat daftar Volume, dan menghapus
Volume
Volume sendiri bisa dianggap storage yang digunakan untuk menyimpan data, bedanya
dengan Bind Mounts, pada bind mounts, data disimpan pada sistem host, sedangkan
pada volume, data di manage oleh Docker
Membuat Volume :
Untuk membuat volume, dapat menggunakan perintah :
docker volume create namavolume
Menghapus Volume :
Volume yang tidak digunakan oleh container bisa kita hapus, tapi jika volume
digunakan oleh container, maka tidak bisa kita hapus sampai container nya di
hapus
Untuk menghapus volume, kita bisa gunakan perintah :
docker volume rm namavolume
Container Volume
Volume yang sudah kita buat, dapat digunakan di dalam container
Keuntungan menggunakan volume adalah, jika container kita hapus, data akan tetap
aman di volume
Cara menggunakan volume di container sama dengan menggunakan bind mount, kita
bisa menggunakan parameter --mount, namun dengan menggunakan type volume dan
source nama volume
2. Buat sebuah folder untuk menyimpan backup dan simpan path direktorinya
3. Buat container baru dengan dua mount, volume yang ingin kita backup ke folder
backup yang dibuat, dan bind mount folder dari sistem host
docker container create --name nginxbackup --mount
"type=bind,source=/Users/richieoey/Documents/Mitra Integrasi
Informatika/Materi
Pembelajaran/Belajar-Docker-Dasar/backup,destination=/backup" --mount
"type=volume,source=mongodata,destination=/data" nginx:latest
6. Lalu kita cek apakah terdapat folder backup dan data dengan command :
ls -l
7. Lakukan backup menggunakan container dengan cara meng-archive isi volume,
dan simpan di bind mount folder
tar cvf /backup/backup.tar.gz /data
Network Driver :
Saat kita membuat Network di Docker, kita perlu menentukan driver yang ingin
kita gunakan, ada banyak driver yang bisa kita gunakan, tapi kadang ada syarat
sebuah driver network bisa kita gunakan.
bridge, yaitu driver yang digunakan untuk membuat network secara virtual yang
memungkinkan container yang terkoneksi di bridge network yang sama saling
berkomunikasi
host, yaitu driver yang digunakan untuk membuat network yang sama dengan
sistem host. host hanya jalan di Docker Linux, tidak bisa digunakan di Mac atau
Windows
none, yaitu driver untuk membuat network yang tidak bisa berkomunikasi
Melihat Network :
Untuk melihat network di Docker, kita bisa gunakan perintah :
docker network ls
Membuat Network :
Untuk membuat network baru, kita bisa menggunakan perintah :
docker network create --driver namadriver namanetwork
Menghapus Network :
Untuk menghapus Network, kita bisa gunakan perintah :
docker network rm namanetwork
Network tidak bisa dihapus jika sudah digunakan oleh container. Kita harus
menghapus container nya terlebih dahulu dari Network
CONTAINER NETWORK
Setelah kita membuat Network, kita bisa menambahkan container ke network
Container yang terdapat di dalam network yang sama bisa saling berkomunikasi
(tergantung jenis driver network nya)
Container bisa mengakses container lain dengan menyebutkan hostname dari container
nya, yaitu nama container nya
Contoh Penerapan :
1. Misalkan kita ingin membuat sebuah container mongo dengan mongo express.
3. Lalu setelah itu buat container untuk mongo nya dengan network yang dibuat :
docker container create --name contohnetwork --network mongonetwork --env
MONGO_INITDB_ROOT_USERNAME=richie --env
MONGO_INITDB_ROOT_PASSWORD=richie mongo:latest
4. Setelah itu untuk menggunakan mongo express kita pull terlebih dahulu
imagenya :
docker image pull mongo-express:latest
5. Lalu kita buat container untuk mongo express dengan network yang dibuat dan
memerlukan env ME_CONFIG_MONGODB_URL. Pada gambar dibawah, untuk
rootnya kita ganti dengan username dan untuk examplenya ganti dengan
password yang telah dibuat dan mongo yang merupakan hostnya kita ganti
dengan contohnetwork yang merupakan container yang telah dibuat
sebelumnya dan kita publish pada port 8081:
docker container create --name mongodbexpress --network mongonetwork --
publish 8081:8081 --env
ME_CONFIG_MONGODB_URL="mongodb://richie:richie@contohnetwork:27017
/" mongo-express:latest
6. Setelah itu kita start masing-masing containernya :
docker container start contohnetwork
docker container start mongodbexpress
7. Dan pada Browser kita cek localhost:8081 dan akan muncul page seperti gambar
dibawah maka koneksi dari mongoexpress ke container image mongo
(contohnetwork) berhasil dilakukan.
Menggunakan Inspect :
Untuk melihat detail dari image, gunakan :
docker image inspect namaimage
Perintah Prune :
Untuk menghapus semua container yang sudah stop, gunakan :
docker container prune
Untuk menghapus semua image yang tidak digunakan container, gunakan :
docker image prune
Untuk menghapus semua network yang tidak digunakan container, gunakan :
docker network prune
Untuk menghapus semua volume yang tidak digunakan container, gunakan :
docker volume prune
Atau kita bisa menggunakan satu perintah untuk menghapus container, network
dan image yang sudah tidak digunakan menggunakan perintah :
docker system prune