Server Overview
คอนเซปต์คร่าวๆก็คือว่าเหมือน server มันรัน service (i.e., web server, mysql server, varolant server, etc.) ไว้ รอ client ต่อเข้ามามาใช่ป่ะ ทีนี้มันจะมีวิธีรัน 2 แบบก็คือ
- รัน service ปกติ (เหมือนตอนเชอรี่รัน kmuttBot อ่ะ) ก็คือเอาโปรแกรมที่จะรันใส่เข้าไปแล้วก็รันทิ้งไว้ในเซิฟเวอร์เฉยๆเลย
- รันผ่าน 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 ก็ได้นะ
อันนี้จะเป็น 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 เยอะมากก ลองดูได้ที่
- Docker: https://docs.docker.com/engine/reference/commandline/cli/
- Docker Compose: https://docs.docker.com/compose/reference/#command-options-overview-and-help
หรือลองดูพวก 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 ทิ้ง
ลองเล่นๆดูก็ได้นะ ถ้าอยากรู้ตรงไหนก็บอกได้ 🫣