สวัสดีครับ บทความนี้ผมจะพูดถึงเรื่อง Docker compose ซึ่งผมมองว่ามันเป็นหัวใจหลักของ Docker เลยก็ว่าได้เพราะมันจะช่วยให้การจัดการ Docker ทั้ง project ของเราเป็นเรื่องง่าย ก่อนที่จะอ่านบทความนี้จะต้องรู้ใน
เรื่องของ docker image, docker container และมีความเข้าใจเรื่อง Docker มาบ้างแล้ว ไม่งั้นเดี๋ยวจะงง
จากก่อนหน้านี้เวลาเราจัดการ Docker Container ไม่ว่าจะเป็นการ Start, Stop, volume ฯลฯ เราจะใช้คําสั่ง docker … ซึ่งจะเป็นการจัดการ Docker Container เพียงตัวเดียวเท่านั้น ถ้ามีหลาย Container ก็ต้องจัดการทีละ Container ถ้าใช้งานโดยทั่วไป Container ไม่เยอะก็ไม่มีปัญหาอะไร แต่ถ้า Project ไหนที่มี Container เยอะๆ จะเป็นเรื่องยากที่เราจะจัการ Container ได้ทั้งหมด Docker Compose จะมาช่วยให้เราสามารถจัดการ Container ทั้งหมดให้เป็นเรื่องง่าย โดยการควบคุม Container ทั้งหมดจะอยู่ใน file docker-compose.yml ส่วนรายละเอียดของ file docker-compose.yml ผมจะพูดในหัวข้อท้ายๆครับ หลังจากที่ทําความเข้าใจเกี่ยวกับ Docker Compose แล้ว เพื่อให้เข้าใจมากขึ้นเรามาทํา Workshop กันครับ
ใน Workshop นี้เราจะสร้างเว็บขึ้นมา 3 หน้า(ใช้ nginx+nodejs) ดังนี้
ซึ่งเราจะออกแบบโดยมี Container ดังนี้
โครงสร้างความสัมพันธ์ของแต่ละ Container มีดังนี้
ในการใช้งาน Docker Compose สามารถทําได้หลายรูปแบบ ในบทความนี้ผมจะออกแบบโครงสร้างของ ไฟล์ต่างๆดังนี้
-[workshop-docker-compose]
+-[build]
| +-[lb]
| | |-dockerfile
| | └ default.conf
| |
| +-[nodejs1]
| | |-dockerfile
| | └ hello.js
| |
| +-[nodejs2]
| |-dockerfile
| └ hello.js
|
+-[src]
| +-[lb]
| └ index.html
|
└ docker-compost.yml
จากโครงสร้างของไฟล์ด้านบน ผมจะแยกเก็บข้อมูลเป็นส่วนๆดังนี้
จะเห็นว่าผมสร้าง dockerfile ขึ้นมา 3 file แยกไว้ตาม folder ต่างๆ ทั้งสามไฟล์นี้จะทําหน้าที่สร้าง Docker Image ของแต่ละ Container และไฟล์อื่นๆที่ผมสร้างขึ้นมีหน้าที่ดังนี้
หัวใจหลักของ Docker Compose จะอยู่ที่ไฟล์ docker-compose.yml ซึ่งภายในจะเป็น script ที่ระบุคุณสมบัติต่างๆ และความสัมพันธ์ของ Container ทั้งหมดของระบบ
มา Install Dcoker Compose กันก่อนครับ ทําตามวิธีนี้ได้เลยครับ คําสั่งในการ Install คือ
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
ต่อไป กําหนดสิทธิให้สามารถ Execute ได้ ใช้คําสั่งนี้
chmod +x /usr/local/bin/docker-compose
เมื่อทุกอย่างเรียบร้อย ก็ทดสอบการ install โดยการ check version
docker-compose --version
จะได้ประมาณนี้
docker-compose version: 1.8.0
ในหัวข้อนี้เราจะมาลองเล่นกันก่อนว่า Docker Compose มันดีอย่างไง มันช่วยให้ชีวิตดีขึ้นหรือไม่ โดยผมสร้าง Workshop ไว้แล้วอยู่บน github ซึ่ง Workshop นี้จะมีการทํางานและโครงสร้างตามที่ผมบอกไปในหัวข้อ ภาพรวมของ Workshop เริ่มแรกเข้าไปโหลด workshop มาก่อนครับ ที่นี่ครับ github.com/mrthiti/workshop-docker-compose.git หรือจะ clone โดยใช้คําสั่งนี้
git clone https://github.com/mrthiti/workshop-docker-compose.git
เราจะได้โฟลเดอร์ workshop-docker-compose มา ให้เราเข้าไปในโฟลเดอร์ workshop-docker-compose แล้วใช้คําสั่ง
docker-compose up -d --build
เมื่อเราใช้คําสั่งนี้แล้ว ระบบจะทําการสร้าง Image ต่างๆ ตามที่เราเขียน script ไว้ในไฟล์ docker-compose.yml แล้วก็ทําการ run container ให้เราด้วย ซึ่งใน Workshop นี้หลังจากที่เรียกคําสั่งนี้ไป เราจะได้เว็บตามที่เราออกแบบไว้ทุกประการ ทดลองผลการรันคําสั่งโดยทําตามนี้ ลองเข้าไปที่ http://your_pi_server:3000/ เราจะได้
ลองเข้าไปที่ http://your_pi_server:3000/node1 เราจะได้
ลองเข้าไปที่ http://your_pi_server:3000/node2 เราจะได้
เห็นมั้ยครับเราใช้คําสั่งเพียงคําสั่งเดียว (docker-compose up -d —build) สามารถที่จะรันเว็บของเราได้ทั้งเว็บ และอีกอย่างคือ ผมสามารจะนําไปรันบนเครื่องใดก็ได้ ถ้าต้องการ stop container ทั้งหมดก็สามารถใช้คําสั่งนี้ได้เลยครับ
docker-compose down
ในหัวข้อถัดไปเราจะมาดูวิธีการเขียน Script ของ docker compose กันครับ
การเขียน script ของ Docker Compose นั้นคือ การเขียนบอก Docekr Compose ว่า เราจะสร้าง image อะไรบ้าง และ image ต่างๆมันมีความสัมพันธ์กันอย่างไร โดยเราจะเขียนไว้ในไฟล์ docker-compose.yml เรามาดูตัวอย่างพื้นฐานการเขียนกันครับ (จากไฟล์ docker-compose.yml ของ workshop)
version: "2"
services:
lb:
build: ./build/lb
container_name: lb
volumes:
- ./src/lb:/usr/share/nginx/html
links:
- nodejs1
- nodejs2
ports:
- 3000:80
nodejs1:
build: ./build/nodejs1
container_name: nodejs1
nodejs2:
build: ./build/nodejs2
container_name: nodejs2
ผมจะอธิบายคําสั่งต่างๆดังนี้ครับ
คําสั่งต่างๆใน Workshop นี้เป็นส่วนหนึ่งครับ ยังมีคําสั่งอื่นๆอีก โดยเราสามารถจะศึกษาเพิ่มเติมได้ที่ docs.docker.com/compose/
เราอาจจะมองว่า 1 Service ก็คือ 1 Containerก็ได้ครับ
docker compose มันเป็นเรื่องที่ค่อนข้างเข้าใจยากหน่อย คุณสามารถศึกษาได้จาก Workshop ของผมเพิ่มเติม ลองเล่นลองแก้ไขคําสั่งต่างๆดูครับ จะทําให้เข้าใจมากยิ่งขึ้น
สวัสดีครับ บทความนี้เราจะมาเรียนรู้การใช้งานคําสั่ง git log เพื่อดู commit history กันครับ
วิธี เปลี่ยน port ของ ssh เพื่อเพิ่มความปลอดภัยให้กับ server
ในบทความที่แล้ว (Docker Swarm คืออะไร) ผมได้อธิบายไปแล้วว่า Docker Swarm คืออะไร และการใช้งานแบบคร่าวๆ สําหรับในบทความนี้ผมจะมาทดลองให้ดูว่าเมื่อนํา Docker Swarm มาใช้งานแล้วจะเป็นอย่างไรบ้าง ก่อนอื่นมาดูกันก่อนว่าคําสั่งพื้นฐานของ Docker Swarm ที่จะต้องใช้มีอะไรบ้าง