Bahagian 2: Docker - Pengurusan Lanjutan
Bahagian 2 banyak melibatkan perkara berkaitan pemasangan beberapa perisian/services, menghubungkan dan konfigurasi database dan web, penetapan variable, penetapan berkaitan network, pembangunan aplikasi dari node.js dan publish imej docker pada Docker hub.
Topik Hari Ini:
- Jadikan Web Server Dari Beberapa Folder (Nginx).
- Memahami Environment Variable dan Penggunaannya.
- Memasang dan Menghubungkan Container Dengan Alamat IP.
- Memasang dan Menghubungkan Container Dengan Hostname.
- Penggunaan Dockerfile untuk Bina Container.
- Terbitkan (Publish) Imej ke Docker Hub.
- Bina Aplikasi node.js, kompil dan Publish.
- Konsep Microservices.
docker run --name websaya -d \
-v ~/containers/website2:/usr/share/nginx/html/website2:ro \
-p 8080:80 -d nginx
MEMAHAMI ENVIRONMENT VARIABLE DAN PENGGUNAANNYA
Environment Variable menyimpan maklumat tertentu seperti lokasi folder, fail, tetapan penggunaan bahasa pada OS dan sebagainya. Maklumat tersebut telah ditetapkan pada nama variable tertentu. Arahan yang digunakan pada Linux ialah "env".
Contoh:
SHELL=/bin/bash
PWD=/home/kamil/
LOGNAME=kamil
HOME=/home/kamil
LANG=C.UTF-8
Contoh penggunaan untuk penetapan environment variable kata laluan :
docker run -d -e MYSQL_ROOT_PASSWORD=K@taL4luAn mysql
Menambah Environment Variable Pada Container Tertentu:
docker exec <container name> env
MEMASANG DAN MENGHUBUNGKAN CONTAINER DENGAN ALAMAT IP
Memasang dan Menghubungkan Container Wordpress, PhpMyAdmin dan MySQL:
docker pull phpmyadmin
docker run mysql
Menjalankan phpmyadmin dengan Port Forwarding:
docker run -p 8084:80 -d phpmyadmin
NOTA: Gunakan nombor port lain kerana port 8080 sudah digunakan pada "wordpress".
docker run -p 8084:80 -d -e PMA_HOST=<alamat IP MySQL> phpmyadmin
Dapatkan Alamat IP Bagi Docker Container Untuk MySQL
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
...
docker run -p 8084:80 -d -e PMA_HOST=172.17.0.3 phpmyadmin
NOTA: Setelah alamat IP MySQL diperolehi, barulah phpmyadmin boleh menggunakan database dari IP tersebut.
Menentukan Nama Container dan Hosname Sendiri
docker run -it --name busybox002 -h busybox-host002 busybox
NOTA: Pada ketika ini, tak boleh ping guna hostname. Hanya guna alamat IP sahaja yang boleh.
Memaparkan Penetapan Network Bridge
docker network inspect bridge
Penetapan Segmen Network Sendiri
docker network create abc_network (buat satu nama segmen baru)
docker network ls (periksa senarai semua nama segmen)
docker network inspect abc_network (periksa nama segment baru yang telah dibuat)
docker run -it --network abc_network busybox (menjalankan busybox menggunakan network segmen baru)
Contoh:
docker run -it --name busybox004 -h busybox-host004 --network abc_network busybox
MEMASANG DAN MENGHUBUNGKAN CONTAINER DENGAN HOSTNAME
Untuk Membuat Segmen Rangkaian Sendiri:
docker network create abc_network
Untuk Membuat Container MySQL:
--network abc_network \
-e MYSQL_ROOT_PASSWORD=K@taL4luAn \
-d mysql
Untuk Membuat Container PhpMyAdmin:
--network abc_network \
-p 8080:80 \
-e PMA_HOST=mysql_host \
Penggunaan Dockerfile Untuk Bina Container
1. Buat satu fail dengan nama "Dockerfile".
2. Masukkan maklumat berikut dan simpan:
FROM nginx:1.27.2-alpineCOPY index.html /usr/share/nginx/html
3. Masuk ke dalam folder bagi lokasi fail "index.html".
4. Taip arahan berikut untuk bina pakej:
docker build -t catsy .
5. Uji dengan arahan berikut untuk menjalankan docker pakej yang telah dibina:
docker run -d -p 8082:80 catsy
Terbitkan (Publish) Imej ke Docker Hub:
1. Lawat laman web berikut dan daftar masuk: https://hub.docker.com
2. Pergi ke Settings > Personal access tokens > New access token
3. Tekan Generate new token
4. Salin dan tampal arahan yang diberi:
NOTA: Digalakkan untuk membina sesuatu imej dengan versi yang spesifik.
6. Tetapkan tag sebagai label kepada imej tersebut:
docker tag catsy <docker hub username>/catsy:v1.0
7. Muat naik pakej imej tersebut ke docker hub:
docker push <docker hub username>/catsy:v1.0
8. Periksa samada imej baru sudah tersedia:
docker images
9. Buang imej baru tersebut untuk diperiksa semula:
docker rmi catsy
10. Sekarang muat turun imej baru:
docker pull <docker hub username>/catsy:v1.0
11. Uji imej baru tersebut samada boleh dijalankan atau tidak:
docker run -p 9000:80 <docker hub username>/catsy:v1.0
NOTA: Tukar nombor port 9000 kepada nombor lain mengikut kesesuaian.
NOTA: "Chuck Docker" on Youtube.
Bina Aplikasi node.js, Kompil dan Publish:
Cipta fail-fail berikut dan salin isi kod yang diperlukan (rujuk Gist):
- index.html - https://gist.github.com/alternat0r/054b12927c5a9ebf8706ae4e251f1b8b
- Dockerfile - https://gist.github.com/alternat0r/0274517685ab7bbbbff2fd9353184842
- package.json -https://gist.github.com/alternat0r/0e2e6d2043da9eca2b08cfb5eeff5ebb
- package-lock.json -https://gist.github.com/alternat0r/424b36593014919c83c15896a83e20c8
docker images
docker run --name mywebsite -p 4000:4000 -d mywebsite
Cuba layar alamat IP tersebut dengan nombor 4000 untuk pengesahan.
KONSEP MICROSERVICES
Terdapat 2 jenis konsep yang diguna pakai:
1. Monolithic
2. Microservices
Monolithic
| | Frontend | Database | Business Logic | |
| | Frontend | Database | Business Logic | |
- Dibangunkan setiap servis dan aplikasi dalam satu server tunggal.
- Perlu clone keseluruhan imej/server setiap kali untuk menambah prestasi.
- Perlu menjalankan keseluruhan eko-sistem setiap kali terdapat penambahan beban kerja. Sangat tidak efisien.
\ \----> [ database ]
- Teknik ini ialah dengan mengasingkan fungsi setiap servis. Hanya satu fungsi kerja sahaja diperlukan untuk setiap container.
- Setiap servis boleh dipasang secara bebas dan berasingan.
- Setiap servis yang berlainan boleh bergandingan.
- Membolehkan pembangunan secara autonomi dari pelbagai kumpulan dan jenis pelantar.
- Boleh diurus/bangun/ditulis oleh kumpulan kerja yamg kecil.
- Mengurangkan pengasingan sesuatu masalah.
- Menghapuskan kebergantungan pada vendor dan teknologi yang spesifik.
- Mudah untuk difahami.
- Lebih banyak masalah, bertambah rumit untuk diselesaikan.
- Adakah kumpulan kerja sudah dilatih, bersedia dan sudah melakukan ujian?
- Jangan mula gunakan pada infrastruktur yang lebih kompleks.
- Ketika melakukan ujian ia kelihatan mudah tetapi betul ke? Seseorang yang mahir perlu mengesahkannya.
- Sukar untuk dilakukan dalam kumpulan yang pelbagai.
- Satu kemaskini pada microservice boleh jadi akan memberi impak pada microservice yang lain. Contoh:
- Pangkalan data yang pelbagai?
- Masalah latensi.
- Ralat yang bersifat sementara dan sukar dijangka.