Docker Part 8 - Docker compose 1

Docker Compose 1

ในตอนก่อนๆเราได้เรียนรู้วิธีการสร้าง Container ผ่านคำสั่ง docker run กันมาแล้ว ซึ่งทุกอย่างก็ดูดีเหมือนไม่มีอะไร แต่ปัญหาเกิดขึ้นเมื่อเราต้องการเอา Container หลายๆตัวมาทำงานร่วมกัน ดังภาพ

จากภาพนั้นสมมุติเราต้องเขียน Web application สั่งอาหารลูกค้าโดยต้องแสดงร้านอาหารและอาหารให้ลูกค้า จากนั้นพอเลือกอาหารเสร็จลูกค้าจะสั่ง Order อาหาร ประมาณนั้น ซึ่งเรา Design ออกมาได้ Component ดังภาพ มี Apache เป็น Proxy มี Order app กับ Order db ในการทำงานเกี่ยวกับการสั่งอาหาร Restaurant app , Restaurant db ทำงานเกี่ยวกับการแสดงอาหารและค้นหาอาหาร จากภาพถ้าคิดแบบง่ายๆ เราต้องใช้ Container 5 ตัวในการทำงาน

โปรแกรมเมอร์ไม่ชอบทำอะไรยุ่งยากซ้ำๆ

แค่จากภาพเราก็พอจะรู้แล้วว่าเวลาจะต้อง Run container 5 ตัวในการทำงาน ซึ่งต้องมาสั่ง 5 ครั้งไม่ว่าจะต้องสั่ง run ครั้งแรก หรือ ตอนสั่ง start ด้วยความน่าเบื่อนี้ส่วนใหญ่ก็จะทำ script กัน แต่ด้วยความน่าเบื่อที่ต้องทำ script อีกก็เลยมาเปลี่ยนมาทำสิ่งที่เรียกว่า docker-compose file แทน docker-compose file คือไฟล์ที่มี syntax แบบ yml ซึ่งไฟล์จะอยู่ในลักษณะการ Config ซึ่งก็คือการบอกว่า ต้อง run container ไหนบ้าง จาก image ไหน bind port อะไรยังไง ซึ่งพอเราเขียนไฟล์นี้เสร็จ เราสามารถสั่งงานโดยใช้ docker-compose ตัว docker-compose จะเข้าไปอ่าน config เหล่านั้นและแปลงเป็นคำสั่งพวก docker run ให้เราทั้งหมด

จะเห็นว่าจากต้อง run 5 command กลายเป็นเขียนไฟล์ config กำหนด แล้วกด run คำสั่งเดียว เขียนเสร็จแล้วสามารถ share ไปให้คนอื่นใช้ต่อได้ด้วย โดยไม่ต้องกลัวว่าอีกเครื่องจะ run script ได้ไหม ขอแค่เครื่องนั้น ลง docker-compose ก็พอ

Install docker compose กันก่อน

วิธีลง docker-compose นั้นมีวิธีบอกอยู่แล้วแถมเป็น official ด้วย โดยสามารถดูได้ตามนี้เลย https://docs.docker.com/compose/install/ โดยใครใช้ OS อะไรก็ใช้แบบนั้นที่เขาแนะนำได้เลย

Docker run ใช้แบบนี้ Docker compose ต้องใช้ยังไง

เรามาเริ่มใช้ docker-compose กันเลย โดยจากที่ผมอธิบายไป docker-compose ต้องการไฟล์ config ที่บอกว่าต้องสร้าง container อะไรบ้างแล้วมันจะไปแปลงเป็นไปคำสั่ง docker run ให้ ดังนั้นถ้าเรามีคำสั่ง docker run ในหัว เราก็จะต้องแปลงมันไปอยู่ในรูปแบบของ docker-compose file เพื่อให้ทำงานอย่างที่เราต้องการ อันนี้อาจแปลกๆ แต่จริงๆไม่แปลก เพราะเราเป็น Programmer เรารู้วิธีการสั่งงานแบบนึง ทีนี้เราอยากจะไปใช้เครื่องมืออีกแบบแต่อยากให้ผลเหมือนเดิม เราก็เลยต้องเทียบว่าวิธีเก่าทำแบบนี้ วิธีใหม่ทำยังไงให้ได้ผลแบบเก่า เป็นวิธีคิดและวิธีทำง่ายๆไม่แปลกสำหรับ Programmer

สมมุติผมอยากสร้าง container : mysql ขึ้นมาด้วยคำสั่ง docker run แบบนี้

1
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7

เราจะสั่งให้ทำงานด้วย docker-compose ยังไง

ทำการสร้างไฟล์ docker-compose.yml

จาก docker run ด้านบน เราสามารถแปลงให้มาอยู่ใน docker-compose.yml ได้ดังนี้

1
2
3
4
5
6
7
8
9
version: '3'

services :
my_db :
image: "mysql:5.7"
ports :
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root

จากนั้นทำการสั่งย้าย current directory ไปอยู่ที่เดียวกับที่ไฟล์ docker-compose.yml อยู่จากนั้นสั่ง

1
docker-compose up

บนหน้าจอจะขึ้นประมาณนี้จะเห็นว่ามันคล้ายๆสั่ง docker run เลยแต่มีสีสันเพิ่มเข้ามา

อธิบาย docker-compose.yml

จริงๆถ้าใครเคยสั่ง docker run จนชิน พอมาเห็นไฟล์ docker-compose.yml จะเข้าใจทันทีเลยว่าจะเปลี่ยนจาก docker run เป็น docker-compose.yml ยังไงโดยแทบไม่ต้องอธิบายเลย

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: '3'
# ตรง version คือบอกว่าเราใช้ docker-compose file version อะไร อันนี้มีผลมากนะครับเพราะบาง
# config จะมาใน version ใหม่ๆ บาง config ก็ถูกยกเลิกใน version ใหม่


services :
# ส่วนนี้คือการบอกว่าถึงส่วนที่จะ config บอกว่าต้อง run container อะไรบ้าง

my_db :
# ตรง my_db คือชื่อ service หรือมองว่า ถ้าจะอ้างถึง container กลุ่มนี้ให้ใช้ชื่อว่า my_db

image: "mysql:5.7"
# image ตรงนี้บอกว่าจะ container นี้ run ด้วย image อะไร
ports :
- "3306:3306"
# ports ตรงนี้บอกว่า จะให้ container นี้ bind port อะไรกับเครื่องจริงบ้าง เทียบเท่ากับ -p
environment:
MYSQL_ROOT_PASSWORD: root
# environment ตรงนี้เป็นการบอกว่า containter นี้จะมี environment อะไรบ้าง เทียบเท่ากับ -e

คำสั่งอื่นๆที่ใช้บ่อยใน docker-compose

  • docker-compose down

อันนี้คือสั่งลบ container ทั้งหมดที่เราประกาศไว้ใน docker-compose.yml เทียบเท่ากับ docker rm -f

  • docker-compose start

อันนี้คือสั่ง start container ทั้งหมดที่เราประกาศไว้ใน docker-compose.yml เทียบเท่ากับ docker start

  • docker-compose stop

อันนี้คือสั่ง stop container ทั้งหมดที่เราประกาศไว้ใน docker-compose.yml เทียบเท่ากับ docker stop

สรุป

สำหรับตอนนี้ขอตัดจบเพียงเท่านี้เพราะรู้สึกว่าเริ่มจะเยอะละ ในตอนนี้เราได้รู้ว่า docker-compose คืออะไร มีไว้ทำไม วิธีเขียน docker-compose.yml วิธีการเรียกใช้งานไม่ว่าจะสร้าง ลบ start stop ในตอนต่อไปเราจะลองสร้าง docker-compose.yml แบบที่กำหนดให้มี container หลายตัว ทำให้แต่ละตัวเชื่อมต่อกัน

ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล

Toktak

คราวนี้มาเป็นไอดอลแนว Sexy หน่อย เป็นไอดอลที่เห็นตอนแรกแล้วไม่รู้สึกอะไร แต่พอดูบ่อยๆค่อยๆเห็นหลายๆลุคนี้แบบ โอ้ยน่าสนใจจริงๆ

Toktak

เพลงประกอบการเขียน Blog

อีกเพลงใน RE MV Project ของทาง Grammy เป็นอีกเพลงที่ได้ยินทำนองแล้วจะอ๋อทันที โดยตอนดูรายการผู้กำกับบอกว่าผู้หญิงในแต่ละยุคแต่ละสมัยว่าเป็นแบบไหน