Skip to main content

Server Overview

คอนเซปต์คร่าวๆก็คือว่าเหมือน server มันรัน service (i.e., web server, mysql server, varolant server, etc.) ไว้ รอ client ต่อเข้ามามาใช่ป่ะ ทีนี้มันจะมีวิธีรัน 2 แบบก็คือ

  1. รัน service ปกติ (เหมือนตอนเชอรี่รัน kmuttBot อ่ะ) ก็คือเอาโปรแกรมที่จะรันใส่เข้าไปแล้วก็รันทิ้งไว้ในเซิฟเวอร์เฉยๆเลย
  2. รันผ่าน Docker ซึ่งมันคือตัวที่จะคอยจัดการ service ได้ว่าเราอยากรันตัวไหน ip อะไร เปิด port อะไร เหมือนเป็นตัวที่เข้ามาคุม service ของเราให้เป็นระเบียบมากขึ้นอ่ะ เราก็จะเช็คง่ายขึ้นว่าเรารันอะไรอยู่บ้าง ตัวไหนพังบ้าง อะไรงี้

ทีนี้รันปกติเชอรี่ก็เคยลองไปแล้วใช่ป่ะ งั้นลองแบบ Docker มั่งดีกว่า ถ้าอยากรู้ in-depth เกี่ยวกับ docker ลองอ่านดูตามนี้ก็ได้: https://www.techtarget.com/searchitoperations/tip/Explore-the-benefits-of-containers-on-bare-metal-vs-on-VMs แต่อย่าอ่านเลย ยาวไป55555 ลองเล่นเลยง่ายกว่า

Docker Overview

เวลาเราอยากจะรันอะไรใน Docker คือแทนที่เราจะกดรัน service เอง เราใช้ไฟล์ docker-compose.yml เป็นตัวกำหนดสิ่งที่เราจะรันแทนอ่ะ เหมือนเป็นไฟล์ที่บอกว่าเราจะรันอะไร แล้ว config อะไรมั่งไรงี้ พอเราเขียนไฟล์นี้ครั้งเดียว เวลาจะรันครั้งต่อๆไปก็ใช้ไฟล์นี้ต่อได้เลย โดยแต่ละ service ที่เรารัน จริงๆมันคือ container ซึ่งจะเป็นคล้ายๆ vm เล็กๆเครื่องนึง แต่เป็น vm ที่ใช้รันแค่โปรแกรมที่เราต้องการอันเดียวอ่ะ

งั้นลองตัวอย่างอันนึง เชอรี่ลองดูในไฟล์ ~/vm-cherry/web/docker-compose.yml ก็ได้นะ

Screenshot 2023-08-02 at 4.30.39 PM.png

อันนี้จะเป็น 1 compose ที่มี 1 service ชื่อ web (line 4-20) แต่จริงๆ 1 compose อาจจะมีหลาย service ก็ได้ โดยในแต่ละ service จะมีการตั้งค่าต่างๆ เช่น

  • image โปรแกรมที่จะเอามารัน ถ้าสมมุติเราอยากรัน web server ก็มีหลายตัวให้เลือกเลย เช่น nginx, apache, caddy, traefik แต่นี่เชียร์ nginx เพราะ custom อะไรได้เยอะดี
    • ถ้าสนใจตัวอื่น ลองเสิชทำนอง "nginx vs apache" หรือว่า "apache docker compose setup" จะมีบอกเหมือนกัน
  • network เราจะมองว่า service ใน docker เป็นเหมือน vm เครื่องนึง ดังนั้นแต่ละ service ก็จะมี ip เป็นของตัวเองอ่ะ กรณีเซิฟพี่ก็จะ assign ip ให้เชอรี่เป็น 172.19.7.xxx อ่ะ เชอรี่ก็ตั้ง ip ให้แต่ละ service เองได้เลยย
  • ports เป็น array ของ port ที่จะเปิดให้เข้าไปหา service ตัวนั้นอ่ะ เช่น web ให้ใช้ port 80 ไรงี้
    • มันมีระบบ port mapping ด้วย คือการ map port จริงกับ port ของ service อ่ะ เช่น เราอยากเข้าเว็บที่ port 80 แต่ backend เชอรี่เขียนให้รันที่ port 3000 งั้นเราก็เขียนเป็น "80:3000" หมายถึงว่าเราเข้า server ที่ port 80 (e.g. test.ryyyyyy.com:80) แล้วมันจะไปเรียก backend ที่รันอยู่ port 3000 อ่ะ
  • volumes เป็น array ของ folder ที่จะ map เข้าไปหา service เหมือนกัน ว่าเราอยากให้ service นั้นๆเก็บไฟล์ตรงไหนบ้าง แล้วจะ map มาเป็นโฟลเดอร์จริงๆในเครื่องที่โฟลเดอร์ไหน เช่น ./data ก็คือโฟลเดอร์ data ในเครื่องเชอรี่จริงๆ จะแทนที่เหมือนเป็นโฟลเดอร์ /usr/share/nginx/html ใน container อะไรแบบนี้
  • จริงๆมี config ให้ปรับได้อีกเยอะะะ ลองดูได้ที่ https://docs.docker.com/compose/compose-file/compose-file-v3/

ทีนี้สมมุติเชอรี่เขียน compose เสดเรียบร้อยละ อยากลองเอาไปรันดู ก็ cd เข้าไปที่โฟลเดอร์ที่มี docker compose อยู่อ่ะ แล้วใช้คำสั่ง docker compose up มันก็จะเอาไปสั่งรันจริงๆเลย ทีนี้มันจะมีคำสั่ง docker เยอะมากก ลองดูได้ที่

หรือลองดูพวก cheat sheet อาจจะง่ายกว่า (มั้ง) https://spacelift.io/blog/docker-commands-cheat-sheet

แต่ที่ใช้หลักๆก็จะมี

  • docker ps ลิสต์ docker container ที่รันอยู่ทั้งหมด
  • docker ps -a ลิสต์ docker container ที่มีอยู่ทั้งรันและไม่รัน
  • docker stats ดูสถานะ cpu/ram/etc. ของ container ที่รันอยู่
  • docker compose up ใช้ apply docker-compose.yml ที่สร้างขึ้นมา ถ้าเราแก้อะไรไปก็รัน command นี้ซ้ำใหม่ได้ มันก็จะ apply ทับลงไปอ่ะ
    • ถ้าไม่มี container อยู่เดิม มันก็จะ create & start ใหม่ตาม config ที่ตั้งไว้
    • ถ้ามีอยู่เดิม มันจะ delete container เดิมทิ้ง แล้ว create & start ใหม่ตาม config ที่ตั้งไว้
  • docker compose up -d ปกติเวลาเรา apply แล้วมันจะติดอยู่ในหน้า log ของ container ไม่กลับมาที่ shell หลักใช่ป่ะ ลองอันนี้มันจะรันเป็น background แทนอ่ะ
  • สมมุติตอนนี้เรารัน container เป็น background เอาไว้ ถ้าใช้ docker compose stop จะปิด container ใน compose แต่ไม่ลบทิ้ง แล้วเปิดกลับมาใหม่ได้ด้วย docker compose start อ่ะ
    • docker compose start ต่างกับ docker compose up ตรงที่ใช้ start container กลับมาเฉยๆ ถึง docker-compose.yml เปลี่ยนมันก็จะไม่ apply ให้อ่ะ
  • docker compose down ใช้ stop & delete container ใน compose ทิ้ง

ลองเล่นๆดูก็ได้นะ ถ้าอยากรู้ตรงไหนก็บอกได้ 🫣