รู้เรื่อง Docker 101 จากชาว Bitcoiner
docker คืออะไร? และทำไมต้องใช้ docker? แล้วต่างจาก VM ยังไง? ไขข้อข้องใจที่นี่เลย
ได้ฟังจาก discord SiamDev by SiamDharmar เมื่อสองทุ่มที่ผ่านมา สอนโดยคุณ NickyDev ซึ่งเราอาจจะงง ๆ เรื่อง docker มาก่อน เพราะเราเป็น Android Developer ไม่ได้แตะของพวกนี้เลย จาก session นี้ทำให้เราเข้าใจ concept ล่ะ ตอนลงมือทำดูคนสอนทำแล้วจดไว้แหละ
กลุ่มคนที่ใช้ docker ประกอบด้วยคน 3 กลุ่ม
- Software Developer: ในเรื่องการทำงาน
- Operation: คนดูแลเครื่อง คนที่ดูแลบริหารการจัดการ server ในองค์กร
- User: ชาวบ้านที่อยากเอา docker มาใช้งานส่วนตัว
สมมุติเรามีเครื่องอยู่เครื่องนึง เป็นเครื่อง server มีแอพอยู่ในนั้น 3 ตัวแล้วกัน และมีพวก software ที่ application ใช้ร่วมกันอยู่ เช่น library, framework ใด ๆ ติดตั้งบน OS หรือบนเครื่องนั่นแหละ
และเกิดปัญหาคือ เราไม่สามารถติดตั้ง database ทั้ง 3 version ได้ เครื่องสามารถติดตั้ง database ได้เพียง 1 version เท่านั้น ดังนั้นจะมีตัวเดียวที่ทำงานได้ แล้วเราจะแก้ปัญหานี้ยังไงถ้าเราใช้ software คนละ version กัน (ตัวอย่างที่ใกล้ตัวคนเขียน คือ node js version นี่แหละ)
แล้วปัญหานี้ จะถูกแก้อย่างไร?
Virtual Machine
เป็นวิธีการแก้ปัญหาแบบเดิม โดยการใช้ Virtual Machine หรือ VM เป็นเหมือนเครื่องจำลอง ก็คือเราก็เหมือนลงเครื่องนึงใหม่ตั้งแต่ลง OS ยันโปรแกรม ในเคสนี้เหมือนมี server 3 ตัว
แล้วทั้ง 3 เครื่องมี OS เดียวกัน และสามารถใช้ร่วมกันได้ แต่ตัว OS นั้น จอง harddisk, RAM, CPU ทำให้กิน resource ไปอีก
Docker
วิธีแก้แบบปัจจุบันเลยมี Docker เข้ามาช่วยในการบริหารจัดการพวกนี้ แบ่งเป็น 3 กล่อง ติดตั้งในกล่องที่เรียกว่า container ทำให้ไม่กวน OS ภายนอก และเป็นอิสระเดียวกัน สามารถลง software เดียวกัน ข้าม version กันได้
ในการทำงานจริงของ developer กับ operator มีเรื่องจำนวนเครื่อง server ที่มีหลายเครื่อง ในการทำ coding ในเครื่องเราเป็น local environment แล้วเอาโค้ดเราไปรันอีกเครื่องนึง เกิดปัญหาเครื่องเรารันได้ แต่เครื่องอื่นรันไม่ได้ ทำให้ scope problem ไม่ได้ เพราะมีปัจจัยยิบย่อยเยอะ ถ้าเราไม่ใช้เป็น pattern และชุดคำสั่งบน local และ docker แก้ปัญหาในการย้ายเครื่อง เป็นการ copy และไปวาง จะได้ของเหมือนกันทุกอย่าง ต่างที่ config เพิ่มเติม
ในมุม user เช่น รัน btc node บน raspberry pi ตัวนึง แล้วจะเอา node ไปใช้ที่อื่น เราจะทำยังไง โยก data และปรับเปลี่ยน version ผ่าน docker ได้ง่ายกว่านั่นเอง
docker เป็น tool/sevice ที่บริหารจัดการ และติดตั้ง แล้วมันทำงานยังไง? ถ้าติดตั้งแล้วจะได้ตัว client และ host มาเลย
host ได้ daemon มา เป็นตัวคอยรับคำสั่งเพื่อสั่งการอย่างอื่นต่อ
และมี command interface เรียกว่า client พิมพ์คำสั่งแล้วสั่งให้ daemon ทำงาน
ส่วน registry เป็นตัวที่เก็บ image บน cloud
container กับ image เกิดขึ้นได้ยังไง? หลังติดตั้งได้ daemon เปล่า ๆ
image มาจากการ docker build จาก docker file แล้วสั่ง build และ docker pull ดึงจาก registry ตามที่เรากำหนด
container เกิดจากการสั่ง docker run กำหนด image ที่จะรัน แล้วเอา image นี้มาสร้าง container ได้กล่อง container 1 อัน ในกล่องจะมีอะไรก็ได้ แล้วแต่เราต้องการว่าเราจะทำอะไร
สรุปความแตกต่าง
- VM เป็นการจำลองคอมพิวเตอร์ทั้งเครื่อง หรือ server มี OS แล้วตามด้วย software อื่น ๆ
- docker เป็นการจำลอง environment สำหรับ project นั้น ๆ เป็นกล่องจำลองที่ไม่มี OS
คำสั่งเบื้องต้นของ Docker
อันนี้จดมาบางส่วนที่เขาทำให้ดูเนอะ
docker --help
ดูว่ามีคำสั่งอะไรบ้างdocker ps
ดูว่ามีอะไรรันอยู่ไหม -a แสดงทั้งหมดdocker image ls
ดูว่ามีอะไรบ้างdocker pull nginx
download image ลงในเครื่องdocker run
สร้าง docker ตัวที่เราต้องการdocker ps
list ของ containerdocker rm
ลบ containerdocker logs -f {id/name}
ดู logdocker exec -it {id} sh
remote เข้ามาในเครื่อง ส่องดูไฟล์ภายใน container
สมมุติจะติดตั้ง nginx ก็ใช้คำสั่ง docker run —name some-nginx -d -p 8080:80 nginx
ได้ web server
-d
: run background เราสามารถทำอย่างอื่นที่หน้า terminal ได้-p
: 8080:80 คือ 8080 เป็น public external port และ 80 เป็น internal port-name
: ตั้งชื่อให้ container
เราสามารถดู public registry ที่ open source ฝากไว้ที่นั่น เราดูล่าสุดได้ที่ tag ตอนรันใส่ option เพิ่มเติมตามเอกสารใน document ได้เลย https://hub.docker.com/_/nginx
usecase ที่ต้องใช้ Docker
สมมุติว่ารัน bitcoin node บน linux เราจะทำยังไง
เอา code จาก repo นี้มา compile & build ก่อน เริ่มจาก Bitcoin core compile
แล้วก็หา image docker จะมี 2 ตัวนี้
จากนั้นใช้คำสั่งนี้เพื่อน run ตัว docker ที่เราต้องการ docker run -d lncm/bitcoind:v25.0
docker compose ใช้ร่วมกับ docker compose file การสร้างตัว compose มาใหม่ใช้คำสั่งนี้เลย nano docker-compose.yml
หน้าตาไฟล์เป็นประมาณนี้
สามารถดูการเขียน compose file ได้ที่นี่เลย
ทั้งหมดก็จะประมาณนี้แหละทุกคน มาแบบสั้น ๆ ไว ๆ แต่รูปเยอะหน่อยกลัวคนอ่านงงเลยทำเป็นบล็อกนี่แหละ
ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย แนะนำให้ใช้ tipme เน้อ ผ่าน promptpay ได้เต็มไม่หักจ้า
ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ