change chapter 4-super admin

This commit is contained in:
Suphonchai Phoonsawat 2024-11-19 11:13:47 +07:00
parent ecff3cf47f
commit 88f18b8273
5 changed files with 87 additions and 43 deletions

View file

@ -60,19 +60,20 @@ Container คือ เทคโนโลยีที่แบ่งแยกแ
# สรุปเปรียบเทียบ
ต่อไปนี้เป็นตารางเปรียบเทียบระหว่าง Virtual Machine (VM) และ Container ที่แสดงให้เห็นความแตกต่างในด้านต่างๆ:
| **คุณสมบัติ** | **Virtual Machine (VM)** | **Container** |
|----------------------------|---------------------------------------------------------------|----------------------------------------------------------|
| **สถาปัตยกรรม** | ใช้ Hypervisor เพื่อสร้าง VM แยกแต่ละตัว พร้อม Guest OS | ใช้ Host OS ร่วมกันในระดับโปรเซส ไม่ต้องใช้ Hypervisor |
| **Guest OS** | แต่ละ VM มี Guest OS ของตนเอง | ไม่มี Guest OS แยก ใช้ OS เดียวกันทั้งหมด |
| **ขนาด** | มีขนาดใหญ่ เนื่องจากต้องรวม Guest OS | ขนาดเล็กกว่า เนื่องจากใช้ OS ร่วมกัน |
| **ประสิทธิภาพ** | ประสิทธิภาพต่ำกว่าเนื่องจากมี Overhead ของ Guest OS | ประสิทธิภาพสูงกว่า เนื่องจากไม่มี Overhead ของ OS แยก |
| **การเริ่มต้นใช้งาน** | ใช้เวลานาน เนื่องจากต้องบูท Guest OS | ใช้เวลาน้อยกว่าเนื่องจากไม่ต้องบูท OS |
| **การใช้งานทรัพยากร** | ใช้ทรัพยากรสูง เนื่องจากต้องแยก OS และ Kernel | ใช้ทรัพยากรน้อยกว่าเนื่องจากใช้ OS ร่วมกัน |
| **ความยืดหยุ่นในการพกพา** | พกพาได้เฉพาะบนแพลตฟอร์มที่รองรับ Hypervisor | พกพาสะดวก ใช้ได้ทุกที่ที่มี Container Engine |
| **การแยกความปลอดภัย** | การแยกระดับสูงเนื่องจากมี Kernel และ OS แยกแต่ละตัว | การแยกระดับโปรเซส อาจมีข้อจำกัดด้านความปลอดภัย |
| **การจัดการ** | ซับซ้อนกว่าในการจัดการเนื่องจากต้องดูแล OS และ Kernel แยกกัน | จัดการง่ายกว่าเพราะใช้ OS เดียวกันทั้งหมด |
| **กรณีใช้งาน** | ใช้ในศูนย์ข้อมูลขนาดใหญ่หรือการทดสอบแยกหลายระบบ | ใช้ใน DevOps การพัฒนาแอปฯที่ต้องการยืดหยุ่นสูง |
| **คุณลักษณะ** | **Virtual Machine (VM)** | **Container** |
|-------------------------|-----------------------------------------------|--------------------------------------------|
| **การจำลองระบบ** | จำลองระบบปฏิบัติการทั้งหมด | ใช้เคอร์เนลร่วมกับโฮสต์ |
| **ระบบปฏิบัติการ** | แต่ละ VM มีระบบปฏิบัติการของตัวเอง | ใช้ระบบปฏิบัติการเดียวกับโฮสต์ |
| **ประสิทธิภาพ** | ใช้ทรัพยากรมากเพราะต้องรัน OS ทั้งระบบ | ใช้ทรัพยากรน้อยเพราะแชร์ OS กับโฮสต์ |
| **ขนาดไฟล์** | ขนาดใหญ่ (รวม OS และแอปพลิเคชัน) | ขนาดเล็ก (มีเพียงแอปพลิเคชันและไลบรารี) |
| **เวลาในการเริ่มต้น** | ช้ากว่า เนื่องจากต้องบูต OS | เร็วกว่า เพราะรันแค่กระบวนการของแอป |
| **การแยกการทำงาน** | แยกการทำงานได้เต็มรูปแบบ | แยกผ่าน namespace และ cgroups |
| **การพกพา (Portability)** | ขึ้นอยู่กับ Hypervisor และ OS | ง่ายต่อการพกพาผ่าน Docker หรือ Podman |
| **การใช้งาน** | เหมาะสำหรับแอปพลิเคชันขนาดใหญ่หรือหลาย OS | เหมาะสำหรับแอปพลิเคชันที่ปรับขยายได้ |
| **การจัดการ** | ซับซ้อนกว่า เพราะต้องจัดการทั้ง VM และ OS | ง่ายกว่า โดยใช้เครื่องมือจัดการ Container |
| **ทรัพยากรที่ใช้** | ใช้ CPU, RAM และ Storage มากกว่า | ใช้น้อยกว่าเพราะไม่มี OS เต็มรูปแบบ |
| **ตัวอย่างเครื่องมือ** | VMware, Hyper-V, VirtualBox | Docker, Kubernetes, Podman |
# Docker คืออะไร?
@ -295,6 +296,57 @@ docker network ls # แสดงรายการเน็ต
docker network create [network_name] # สร้างเน็ตเวิร์กของ docker
```
# การใช้งานไฟล์ Docker Compose
## Docker Compose File คืออะไร?
**Docker Compose File** เป็นไฟล์ที่มีรูปแบบเป็น YAML (มักมีชื่อไฟล์ docker-compose.yml) ซึ่งใช้สำหรับการกำหนดค่าและจัดการการทำงานของ **หลายคอนเทนเนอร์** ในโปรเจกต์เดียวกัน ช่วยให้นักพัฒนาสามารถกำหนดบริการต่างๆ ที่คอนเทนเนอร์จะต้องรัน เช่น ฐานข้อมูล เว็บเซิร์ฟเวอร์ และบริการอื่นๆ ได้ในที่เดียว
## Docker Compose File มีไว้ทำไม?
1. จัดการบริการหลายตัวพร้อมกัน
เมื่อโปรเจกต์มีหลายคอนเทนเนอร์ เช่น ฐานข้อมูล (MySQL), แอปพลิเคชัน (Node.js), และเครื่องมืออื่นๆ Docker Compose จะช่วยจัดการทุกอย่างในไฟล์เดียว
2. ลดความซับซ้อนของคำสั่ง
แทนที่จะต้องใช้คำสั่ง docker run หลายครั้งเพื่อรันคอนเทนเนอร์ต่างๆ สามารถใช้คำสั่งเดียว (docker-compose up) เพื่อรันทุกบริการพร้อมกัน
3. กำหนดค่าที่ซับซ้อน
สามารถกำหนดค่าเครือข่าย, การเชื่อมโยงคอนเทนเนอร์, พอร์ต, Volume, และ Environment Variable ได้ในไฟล์เดียว
4. ทำให้การพกพาโปรเจกต์ง่ายขึ้น
แชร์ docker-compose.yml ไฟล์ให้ผู้อื่นเพื่อสร้างสภาพแวดล้อมที่เหมือนกันได้อย่างง่ายดาย
## Docker Compose File ใช้งานเพื่ออะไร?
1. การตั้งค่าบริการในระบบที่ซับซ้อน
เช่น การตั้งค่าแอปพลิเคชันที่ต้องใช้ฐานข้อมูล Redis และ RabbitMQ ร่วมกัน
2. การพัฒนาและทดสอบในเครื่อง
สร้างสภาพแวดล้อมที่เหมือนกับ Production บนเครื่องนักพัฒนา
3. การจัดการ Volume และ Network
กำหนด Volume สำหรับเก็บข้อมูล และ Network เพื่อให้บริการต่างๆ สื่อสารกัน
4. รองรับการสเกลระบบ
สามารถเพิ่มจำนวนคอนเทนเนอร์ในแต่ละบริการได้ง่ายโดยใช้ docker-compose up --scale
## ตัวอย่างของไฟล์ docker-compose.yaml
เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx เป็นเวปเซิร์ฟเวอร์ ที่พอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงาน nginx จะเริ่มตัวเองเองถ้าโฮสเปิดขึ้นเครื่องใหม่ ทำงานในเน็ตเวิร์ก hrms การใช้งานใช้เว็บบราวเซอร์ไปที่ http://IP:9082
```yaml
services:
web:
image: nginx
volumes:
- ./html:/usr/share/nginx/html:ro
ports:
- "9082:80"
restart: unless-stopped
networks:
hrms:
networks:
hrms:
external: true
```
## การใช้งานคำสั่ง docker compose
docker compose จะรันคอนเทนเนอร์ของ docker หลายๆตัวพร้อมกันได้ โดยดูการตั้งค่าจากไฟล์ compose.yaml หรือ docker-compose.yaml
ที่อยู่ในโฟลเดอร์ที่เรียกคำสั่ง ในการทำงานทั่วไปเพื่อที่จะให้ง่ายต่อการใช้งาน จะใช้ docker compose เป็นหลัก ซึ่งจะมีผลเฉพาะ service ที่เขียนไว้ในไฟล์ compose
@ -303,7 +355,13 @@ docker compose จะรันคอนเทนเนอร์ของ docker
```sh
docker compose ps # ดูรายการ service ที่ทำงานอยู่
docker compose up -d # เรียกทุก service ขึ้นมาทำงาน
docker compose up -d [service_name] # เรียกเฉพาะ serfvice ที่ต้องการขึ้นมาทำงาน
docker compose up -d [service_name] # เรียกเฉพาะ service ที่ต้องการขึ้นมาทำงาน
docker compose down # หยุดและลบบริการทั้งหมด
docker compose logs # ดู Log ของบริการทั้งหมด
docker compose logs -f [service_name] # ดู Log เฉพาะ service ที่ต้องการ
```
โฟลเดอร์ที่ใช้เริ่มต้นสร้างโปรแกรม บริการต่างๆในหัวข้อต่อๆไปจะสร้างภายใต้ ~/docker/hrms และใช้เน็ตเวิร์กชื่อ hrms ในการสื่อสารระหว่างกัน ทำให้สามารถเรียกใช้ชื่อ service แทน IP Address ได้เหมือนมี DNS ภายใน
@ -323,25 +381,6 @@ nano compose.yaml # สร้างไฟล์ compose
nano html/index.html # สร้างหน้าเวปสำหรับทดสอบ
```
ไฟล์ compose.yaml
เป็นตัวอย่างแบบง่ายเพื่อใช้งาน nginx เป็นเวปเซิร์ฟเวอร์ ที่พอร์ต 9082 บนเครื่องโฮส ถ้าไม่สั่งหยุดการทำงาน nginx จะเริ่มตัวเองเองถ้าโฮสเปิดขึ้นเครื่องใหม่ ทำงานในเน็ตเวิร์ก hrms การใช้งานใช้เว็บบราวเซอร์ไปที่ http://IP:9082
```yaml
services:
web:
image: nginx
volumes:
- ./html:/usr/share/nginx/html:ro
ports:
- "9082:80"
restart: unless-stopped
networks:
hrms:
networks:
hrms:
external: true
```
## Services
การออกแบบใช้สถาปัตยกรรม Microservice จะประกอบจากหลาย Service เพื่อความเป็นระเบียบจะแบ่งไว้สามโฟลเดอร์ apisix(API Gateway), bmahrms-service(3rd Party service), bmahrms(HRMS services)
@ -470,14 +509,14 @@ curl https://bma-hrms-id.bangkok.go.th -vvv
โปรแกรมกลุ่มนี้ที่พัฒนาโดย 3rd Party หรือ Frappet ไม่ได้มีฟังก์ชั่นงานเจาะจงสำหรับ HRMS ถูกใช้โดยโปรแกรมของ HRMS(เช่นฐานข้อมูล,เวปเซิร์ฟเวอร์ ฯลฯ) จะแยกมาใส่โฟลเดอร์ bmahrms-service
การติดตั้งให้นำ compose.yaml และ คอนฟิกมาใส่โฟลเดอร์ bmahrms-service ให้เรียบร้อยก่อนใช้งาน สร้างโฟลเดอร์แต่ละ servie ทำดังนี้
- Keycloak(bmahrms-postgres bmahrms-id) เซิร์ฟเวอร์สำหรับจัดการยูสเซอร์และการ Authentication ในระบบ
- MySQL(bmahrms-mysql) เป็นฐานข้อมูลของระบบ
- MiniO(bmahrms-s3) เป็น Object Storage แบบเดียวกับ AWS s3 ใช้สำหรับเก็บไฟล์ มีประสิทธิ์ภาพสูงสามารถรับโหลดหนัก มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์
- Windmill รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล
- Portainer(bmahrms-portainer) ระบบจัดการ container มี UI ใช้งานง่าย สามารถใช้แทนคำสั่ง docker ได้
- RabbitMQ(bmahrms-mq) ระบบจัดคิวในการสือสารใน Microservice มีความน่าเชื่อถือสูง สามารถรับโหลดหนักๆในช่วงเวลาสั้นๆได้ โดยไม่ต้องเพิ่มทรัพยากรโดยไม่จำเป็น เช่นระบบการลงเวลา
- Frappet Report Server(bmahrms-report-server) ใช้สำหรับสร้างรายงานจากเอกสารต้นแบบ ออกแบบเองได้ในรูปของ ไฟล์ docx และ xlsx เอกสารที่สร้างสามารถส่งออกเป็น docx, xlsx, pdf ได้
- Frappet EDM ใช้สำหรับจัดการเอกสารที่ปลอดภัยรองรับโหลดจำนวนมากได้ จะมีระบบย่อยเบื้องหลังหลายตัว (bmahrms-edm,bmahrms-elasticsearch,bmahrms-kibana,bmahrms-mq)
- **Keycloak (bmahrms-postgres bmahrms-id)** เซิร์ฟเวอร์สำหรับจัดการยูสเซอร์และการ Authentication ในระบบ
- **MySQL (bmahrms-mysql)** เป็นฐานข้อมูลของระบบ
- **MiniO (bmahrms-s3)** เป็น Object Storage แบบเดียวกับ AWS s3 ใช้สำหรับเก็บไฟล์ มีประสิทธิ์ภาพสูงสามารถรับโหลดหนัก มีความปลอดภัยกว่าเก็บด้วยระบบไฟล์ทั่วไป สามารถขยายเพิ่มได้ในอนาคต ถูกใช้ในหลายระบบที่ต้องการเก็บไฟล์
- **Windmill** รันเวิร์กโฟลว์การทำงานอัตโนมัติจากสคริปต์ หลักๆใช้เพื่อรันตัวสำรองข้อมูล
- **Portainer (bmahrms-portainer)** ระบบจัดการ container มี UI ใช้งานง่าย สามารถใช้แทนคำสั่ง docker ได้
- **RabbitMQ (bmahrms-mq)** ระบบจัดคิวในการสือสารใน Microservice มีความน่าเชื่อถือสูง สามารถรับโหลดหนักๆในช่วงเวลาสั้นๆได้ โดยไม่ต้องเพิ่มทรัพยากรโดยไม่จำเป็น เช่นระบบการลงเวลา
- **Frappet Report Server (bmahrms-report-server)** ใช้สำหรับสร้างรายงานจากเอกสารต้นแบบ ออกแบบเองได้ในรูปของ ไฟล์ docx และ xlsx เอกสารที่สร้างสามารถส่งออกเป็น docx, xlsx, pdf ได้
- **Frappet EDM** ใช้สำหรับจัดการเอกสารที่ปลอดภัยรองรับโหลดจำนวนมากได้ จะมีระบบย่อยเบื้องหลังหลายตัว (bmahrms-edm,bmahrms-elasticsearch,bmahrms-kibana,bmahrms-mq)
docker/bmahrms-service/compose.yaml ให้แก้ตัวแปรให้เหมาะสมตาม
@ -1160,7 +1199,7 @@ services:
การตั้งค่าเฉพาะของแต่ละ service และการตั้งค่า route การตั้งค่า route ส่วนใหญ่จะทำคล้ายๆกัน ส่วนที่เป็น Frontend จะเป็นการเซ็ตโดเมน(URL)ของแต่ละโปรแกรม ส่วนที่เป็น Backend จะเป็นการรวมหลาย backend เข้าในโดเมนเดียวกันแต่อยู่คนละ Subfolder ซึ่งเป็นการรวม Microservice เข้าด้วยกัน
### keycloak (bmahrms-id)
### Keycloak (bmahrms-id)
ใช้สำหรับการ login ในระบบ (Identity Server) การสือสารหลัง API Gateway จะเป็น https แบบ self-signed
@ -1371,3 +1410,8 @@ curl http://127.0.0.1:9180/apisix/admin/consumers \
}'
```
# บทสรุป
ในยุคดิจิทัลที่เทคโนโลยีเปลี่ยนแปลงอย่างรวดเร็ว การออกแบบระบบซอฟต์แวร์ให้ตอบสนองความต้องการที่ซับซ้อนและเปลี่ยนแปลงได้ตลอดเวลาเป็นสิ่งจำเป็น สถาปัตยกรรม Microservice เป็นหนึ่งในแนวทางที่ได้รับการยอมรับอย่างกว้างขวาง เนื่องจากมีจุดเด่นด้านความยืดหยุ่น การปรับขยาย และการแยกส่วนการทำงานของระบบให้เป็นอิสระต่อกัน การนำเทคโนโลยีทันสมัยอย่าง Docker, RabbitMQ, Keycloak และ MinIO มาร่วมใช้งานใน Microservice ทำให้ระบบมีประสิทธิภาพยิ่งขึ้น ทั้งในด้านการพัฒนา การจัดการ และการรองรับการใช้งานในระดับสูง
การผสมผสานเทคโนโลยีอย่าง Docker, RabbitMQ, Keycloak และ MinIO ช่วยยกระดับความสามารถของระบบให้สอดคล้องกับความต้องการทางธุรกิจในยุคที่การแข่งขันสูง สถาปัตยกรรมนี้ไม่เพียงตอบสนองต่อความซับซ้อนของการพัฒนา แต่ยังช่วยเพิ่มความเร็ว ความเสถียร และความปลอดภัยของระบบ ทำให้ Microservice เป็นทางเลือกที่ทันสมัยและเหมาะสมสำหรับการพัฒนาระบบในยุคปัจจุบัน

Binary file not shown.

BIN
public/output.docx Normal file

Binary file not shown.