มาลอง docker-compose กันเถอะ
ครั้งกระโน้น เราเคยคุยกันเรื่อง Docker (ลิงก์ด้านล่าง) ซึ่งเราสามารถหา image ได้จาก https://hub.docker.com มาใช้งาน
แต่นั่นมันคือ image ที่มีพร้อมไว้แล้ว ซึ่งบางครั้งก็ไม่ตอบโจทย์เราที่อยากให้มีนั่นนี่พร้อมมาเลยใน image เดียว แทนที่เราจะโหลด image มาแล้วโหลด package ที่เราต้องการ สู้เราสร้างเองไม่ดีกว่าหรือฮะ
เรามาทำความรู้จักกับ Dockerfile และ docker-compose กันฮะ
Dockerfile vs Docker-compose
Dockerfile เป็น file ที่มีชื่อว่า "Dockerfile" ตรงตามตัวเป๊ะ มันคือไฟล์ที่เราสามารถเขียนคำสั่งให้สร้าง image ที่สามารถใส่โค้ดโปรแกรมของเราเองเข้าไปได้ตั้งแต่ต้น เพื่อใช้สร้าง container อีกทีนึง
ตัวอย่างเช่น Dockerfile ที่เป็น NodeJS แล้วเมื่อรันขึ้นมาจะได้เป็นเว็บที่มีคำว่า "Hello World"
ส่วน Docker-compose ก็เป็น YAML file ที่มีชื่อว่า "docker-compose.yaml"เหมือนกันฮะ แต่ความสามารถของมัน คือ การสร้าง cluster ของ container โดยกำหนดได้ว่าจะให้มีกี่ container จะ 1, 2, หรือมากกว่านั้นก็ได้ และแต่ละ container มีลักษณะอย่างไร ก็กำหนดได้หมดเลยฮะ
ตัวอย่างเช่น สร้าง container สำหรับ PostgreSQL ไว้เก็บข้อมูลสินค้า และอีก container เป็น NodeJS ที่เป็นหน้าเว็บแสดงข้อมูลจาก PostgreSQL
ตัวอย่าง Docker-compose file
ตัวอย่างบล็อกนี้ จะเป็นแบบง่ายๆ แค่ให้สร้าง container เป็น Debian จำนวน 2 ตัว ตัวนึงเป็น Debian โล่งๆ และอีกตัวนึงเป็น Debian ที่ลง package curl
เอาไว้ และตัวนี้จะต้องสร้างหลังตัวแรก
งั้นเรามาลงมือกันฮะ
1. สร้าง dockerfile
We expect a Debian image with curl. It is a custom image so we need to create it ourselves as below. Simple.
เราโฟกัสที่ Debian ที่ลง curl
และแน่นอน มันคือ custom image ดังนั้น เราจำเป็นต้องลงมือเขียน dockerfile ด้วยตัวเอง แบบนี้ฮะ
คำสั่งที่บรรทัด 3 คือ คำสั่งให้ติดตั้ง package curl
นั่นเองฮะ
แค่นี้ก็เสร็จแล้ว ลองใช้คำสั่งข้างล่างนี้ เพื่อสั่งให้ build image และ container ได้เลย
docker build . -t <image_name>:<image_version>
docker run -it <image_name>:<image_version>
2. สร้าง docker-compose.yaml
ต่อไปก็เป็นขั้นตอนการเขียน docker-compose.yaml
. ซึ่งเราจะสามารถกำหนดในไฟล์นี้ได้นะฮะ ว่าอยากให้มีกี่ container เชื่อมต่อกันอย่างไร มี shared volume มั้ย และรายละเอียดปลีกย่อยต่างๆ
สำหรับ YAML มันเป็นไฟล์ที่นิยมใช้เขียน configuration โดยมีโครงสร้างคล้ายกับ JSON แต่ดีกว่าตรงที่ไม่มีปีกกาฟุ่มเฟือยให้เห็น และมีความสามารถอื่น เช่น กำหนดเป็นตัวแปร เพื่ออ้างอิงในที่อื่นของไฟล์ได้ฮะ
ตัวอย่างข้างบนนี้ คือ เราจะได้มา 2 containers คือ "debian1" กับ "debian2" และสังเกตว่ามี key stdin_open
กับ tty
ซึ่งบอกว่า container นี้สามารถรันแบบ interactive คือป้อนคำสั่งเข้าไปได้โดยตรงฮะ
For more information about the configurations, can take your time follow the link below.
ถ้าอยากรู้เพิ่มเติมเรื่องการกำหนด key อะไรดีใน docker-compose ก็ดูตามลิงก์ข้างล่างนี้ได้
3. Up
เอาล่ะ เราจะต้องเอาทั้ง dockerfile และ docker-compose.yaml ไปไว้ใน folder เดียวกัน ก่อนจะรันคำสั่งนี้ฮะ
docker-compose up -d
flag -d
หมายถึง detached mode หรือก็คือให้มันรันอยู่เบื้องหลังนั่นเองฮะ
ตอนรัน ควรจะได้ผลลัพท์ประมาณรูปนี้นะ

เช็คด้วย docker ps -a
จะได้มาเป็น 2 container ตามนี้ฮะ

4. Down
เมื่อเราจะเลิกใช้แล้ว ก็เก็บกวาดด้วยคำสั่งนี้ฮะ เพื่อลบ container ทิ้งไป
docker-compose down
หรือจะให้หมดจด ลบ image ลบ mounted volume ไปด้วยเลยก็ใช้คำสั่งนี้ได้ฮะ
docker-compose down --volumes --rmi all

เท่านี้ก็เสร็จตามตัวอย่างโจทย์ ลองเอาไปประยุกต์กันดูฮะ
ถ้าต้องการไฟล์ตัวอย่างของ dockerfile
และ docker-compose.yaml
ก็ไปตาม repo ที่ลิงก์ข้างล่างนี้ได้ฮะ