รู้เรื่อง Docker 101 จากชาว Bitcoiner

Programming Dec 9, 2024

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 ของ container
  • docker rm ลบ container
  • docker logs -f {id/name} ดู log
  • docker 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

GitHub - nicky-dev/docker-bitcoind: Flexible multi-arch (amd & amd64) Bitcoin Core Docker image
Flexible multi-arch (amd & amd64) Bitcoin Core Docker image - GitHub - nicky-dev/docker-bitcoind: Flexible multi-arch (amd & amd64) Bitcoin Core Docker image
https://github.com/nicky-dev/docker-bitcoind

แล้วก็หา image docker จะมี 2 ตัวนี้

จากนั้นใช้คำสั่งนี้เพื่อน run ตัว docker ที่เราต้องการ docker run -d lncm/bitcoind:v25.0

docker compose ใช้ร่วมกับ docker compose file การสร้างตัว compose มาใหม่ใช้คำสั่งนี้เลย nano docker-compose.yml หน้าตาไฟล์เป็นประมาณนี้

สามารถดูการเขียน compose file ได้ที่นี่เลย

Services top-level elements
Explore all the attributes the services top-level element can have.
https://docs.docker.com/reference/compose-file/services/

ทั้งหมดก็จะประมาณนี้แหละทุกคน มาแบบสั้น ๆ ไว ๆ แต่รูปเยอะหน่อยกลัวคนอ่านงงเลยทำเป็นบล็อกนี่แหละ


ติดตามข่าวสารตามช่องทางต่าง ๆ และทุกช่องทางโดเนทกันไว้ที่นี่เลย แนะนำให้ใช้ tipme เน้อ ผ่าน promptpay ได้เต็มไม่หักจ้า

ติดตามข่าวสารแบบไว ๆ มาที่ Twitter เลย บางอย่างไม่มีในบล็อก และหน้าเพจนะ

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.