ครั้งกระโน้น เราเคยคุยกันเรื่อง Docker (ลิงก์ด้านล่าง) ซึ่งเราสามารถหา image ได้จาก https://hub.docker.com มาใช้งาน

ลองใช้ Docker กัน
มันคือเครื่องมือตัวนึงที่ให้เราสร้าง environment เสมือนขึ้นมา คล้ายๆ Virtual Machine ฮะแต่ใช้ทรัพยากรเครื่องน้อยกว่าเพราะเน้นใช้งานผ่าน command line

แต่นั่นมันคือ 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 ก็ดูตามลิงก์ข้างล่างนี้ได้

Compose specification
Compose file reference

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 ที่ลิงก์ข้างล่างนี้ได้ฮะ

GitHub - bluebirz/sample-docker-compose
Contribute to bluebirz/sample-docker-compose development by creating an account on GitHub.