DEV Community

Cover image for Docker 101: เริ่มต้นจัดการแอปพลิเคชันอย่างมือโปร (Step-by-Step)
Watchara Sukka
Watchara Sukka

Posted on

Docker 101: เริ่มต้นจัดการแอปพลิเคชันอย่างมือโปร (Step-by-Step)

เนื่องจากทางผมได้มีโอกาสไปบรรยายเรื่อง Cyber Security ซึ่งในขั้นตอนการทำ workshop ส่วนใหญ่จะเป็นเครื่องมือบนระบบปฎิบัติการ linux โดยปัญหาอย่างนึงของผู้เข้าร่วมอบรมคือ ไม่ความรู้พื้นฐานด้าน Programing หรือ System Administrator มาก่อนจึงเกิดบทความนี้ขึ้นมาเพื่อเหมือนเป็น note สำหรับให้ผู้เข้าร่วมอบรมนำไปต่อยอด หรือทบทวน Workhop ได้

Docker คืออะไร? (ฉบับเข้าใจง่าย)

ลองจินตนาการว่าคุณต้องย้ายบ้าน ถ้าคุณขนของใส่รถกระบะโดยไม่ใส่กล่อง ของอาจจะแตกหักหรือหายระหว่างทาง Docker ก็เหมือน "ตู้คอนเทนเนอร์" ที่บรรจุทุกอย่าง (ซอฟต์แวร์, Library, ค่าตั้งค่า) เอาไว้ข้างใน ทำให้ไม่ว่าเราจะยกไปวางที่ไหน มันก็ทำงานได้เหมือนเดิมเป๊ะๆ

องค์ประกอบที่คุณต้องรู้จัก:

  • Dockerfile: สูตรการประกอบตู้คอนเทนเนอร์
  • Image: แม่พิมพ์ที่ถูกสร้างตามสูตร (พร้อมใช้งาน)
  • Container: ตู้คอนเทนเนอร์ที่สตาร์ทเครื่องและรันอยู่จริง

เริ่มต้นติดตั้ง Docker Desktop

ผมเคยได้เขียนบทความ การติดตั้ง Docker บน Windows แบบ Step by Step สามารถดำเนินการติดตั้งตามขั้นตอนได้ในทันที
เมื่อติดตั้งสำเร็จแล้วสามารถตรวจสอบผ่าน Command Line(Windows) หรือ Terminal(macOS) จากนั้นพิมพ์คำสั่ง

docker --version
Enter fullscreen mode Exit fullscreen mode

ถ้า Docker ทำงานได้ปรกติควรจะแสดงเลข Version ของ Docker ที่ติดตั้งอยู่บนเครื่องของเรา

องค์ประกอบอื่นๆ ใน Docker

เมื่อคอนเทนเนอร์เริ่มทำงาน เราต้องจัดการส่วนประกอบสำคัญ 2 อย่างนี้:

  • Network: ถ้าเปรียบ Container เป็นบ้าน Network ก็คือถนนที่เชื่อมแต่ละบ้านเข้าด้วยกัน ให้คุยกันได้
  • Volume: ข้อมูลใน Container จะหายไปเมื่อลบมันทิ้ง แต่ถ้าเราทำ Volume คือการสร้าง "โกดังเก็บของ" ไว้ข้างนอก เพื่อให้ข้อมูลยังอยู่ถาวรเมื่อ container เปิดขึ้นมาใหม่ข้อมูลก็ยังอยู่

เริ่มใช้งาน Docker

เริ่มรัน container ผ่านคำสั่ง

docker run hello-world
Enter fullscreen mode Exit fullscreen mode

  1. เป็นการสั่งรัน Docker Image ชื่อ
  2. ขึ้นข้อความ Unable to find image 'library/hellow-world' locally แสดงว่าไม่พบ docker image ชื่อ 'hellow-world:latest' บนเครื่องจากนั้น docker จะไป download docker image ชื่อ 'hellow-world:latest' จาก docker reository เมื่อ download สำเร็จก็จะทำการรัน docker image ขึ้นเป็น container เมื่อรัน สำเร็จจะแสดงข้อความ Hello from Docker!...

ตรวจสอบดูว่าในเครื่องมี container อะไรทำงานอยู่บ้าง

ผ่านคำสั่ง

docker ps
Enter fullscreen mode Exit fullscreen mode

จะแสดงรายการ container ทั้งหมดที่ run อยู่ในเครื่องโดยแสดงข้อมูล

  • CONTAINER ID: id ของ container ซึ่งเป็นตัวแทนของ container นั้น
  • IMAGE: ชื่อ image ที่รัน container นั้น(แสดงว่า image 1 ตัวสามารถรันได้หลลาย container)
  • COMMAND: คำสั่งที่ในงานเริ่มต้น container
  • CREATED: ระยะเวลาตั้งแต่เริ่มสร้าง container
  • STATUS: สถานะ contaner
  • PORTS: portของเครือข่าย จะอยู่ในรูปแบบ [portของเครื่อง]:[port ภายใน docker]

การหยุด container

เป็นการหยุดการทำงานของ Container โดย conatiner ยังอยู่(ค่าต่างๆที่อยู่ใน container ยังอยู่)เพียงแต่สถานะจะเป็น Exit โดยสามารถเริ่มทำงานใหม่ผ่านคำสั่ง ** docker start**

docker stop [CONTAINER ID]
Enter fullscreen mode Exit fullscreen mode

การลบ container

เป็นการลบ Container ออกจากระบบอย่างถาวร (ค่าต่างๆที่อยู่ใน container หายไป) โดยสามารถเริ่มทำงานใหม่ผ่านคำสั่ง ** docker run**

docker rm [CONTAINER ID]
Enter fullscreen mode Exit fullscreen mode

การเข้าไปงานภายใน Contaniner

คือคำสั่งที่ใช้สำหรับ "เข้าไปใช้งานหรือสั่งการ" ภายใน Container ที่กำลังรันอยู่ครับ

เปรียบเทียบง่ายๆ คือ ถ้า Container คือ "บ้าน" และเราเป็นเจ้าของบ้าน ปกติเราจะยืนดูบ้านจากข้างนอก แต่ถ้าวันหนึ่งเราอยากเดินเข้าไปเช็คของในบ้าน หรือต้องการเข้าไปแก้ไขไฟล์ หรือรันคำสั่งบางอย่าง ข้างในบ้าน เราก็ต้องใช้ docker exec เพื่อ "มุด" เข้าไปครับโดยรูปแบบคำสั่งคือ

docker exec -it [CONTAINER_ID_OR_NAME] [COMMAND]
Enter fullscreen mode Exit fullscreen mode

โดย Flag ที่ต้องใช้คู่กัน:
-i (Interactive): ย่อมาจาก Interactive ให้ Docker คงการเชื่อมต่อกับเราไว้ (ไม่ปิดการเชื่อมต่อทันทีที่สั่งงานเสร็จ)
-t (TTY): ย่อมาจาก pseudo-TTY คือการสร้างหน้าจอ Terminal เสมือน เพื่อให้เราสามารถพิมพ์โต้ตอบกับ Container ได้เหมือนเปิดหน้าต่าง Terminal ในเครื่องตัวเอง
เช่น

docker exec -it 28ed243273d9 ls -la
Enter fullscreen mode Exit fullscreen mode

เป็นการแสดงรายชื่อไฟล์(ls -la) ที่อยู่ใน Container

การดู log บน container

เมื่อแอปพลิเคชันรันอยู่ข้างใน Container คุณจะไม่สามารถเห็น Output ปกติเหมือนรันบนเครื่องตัวเองได้ ดังนั้น Docker จึงทำหน้าที่ "ดักจับ" (Capture) ข้อความทุกอย่างที่แอปพลิเคชันพ่นออกมาทาง Standard Output (stdout) และ Standard Error (stderr) แล้วเก็บไว้ให้คุณตรวจสอบย้อนหลัง
โดยรูปแบบคำสั่งเป็น

docker logs -f [CONTAINER ID]
Enter fullscreen mode Exit fullscreen mode

โดย Flag
-f (Follow): ระบบจะค้างหน้าจอไว้ และแสดงข้อความใหม่ๆ ทันทีที่แอปฯ เขียน Log เพิ่ม

ตัวอย่างคำสั่ง

สถานการณ์ คำสั่งที่แนะนำ
ตรวจงานแบบด่วน docker logs [CONTAINER ID]
เฝ้าหน้าจอดู Error สดๆ docker logs -f [CONTAINER ID]
หา Error ที่เพิ่งเกิดขึ้น docker logs --tail 20 [CONTAINER ID]
สืบสวนคดีเก่า (ระบุเวลา) docker logs -t [CONTAINER ID]

คำสั่งอื่นๆ

สามารถดูว่า docker มีคำสั่งอะไรบ้างผ่าน

docker --help
Enter fullscreen mode Exit fullscreen mode

เพิ่มเติม: Docker Compose - พลังแห่งการจัดการหลาย Container

หลังจากที่คุณเริ่มรัน Container ตัวเดียวคล่องแล้ว คุณจะพบว่าในโลกความเป็นจริง เราไม่ได้ใช้แค่ Container เดียวครับ (เช่น แอปพลิเคชันของคุณ ต้องมีทั้ง Web Server และ Database) การจะมานั่งรัน docker run แยกทีละตัวคงไม่สะดวกแน่ๆ

Docker Compose จึงเข้ามาแก้ปัญหานี้ โดยการใช้ไฟล์เพียงไฟล์เดียวที่ชื่อว่า docker-compose.yml เพื่อระบุว่า:

  • ต้องใช้ Image อะไรบ้าง?
  • ต้องเชื่อมต่อ Network อย่างไร?
  • ต้อง Mount Volume ตรงไหน?

ตัวอย่างไฟล์ docker-compose.yml

version: '3.8'
services:
  web:
    image: my-app-image
    ports:
      - "8080:80"
    volumes:
      - ./data:/app/data
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:
Enter fullscreen mode Exit fullscreen mode

การใช้ Docker Compose ถึงสำคัญอย่างไร?

  1. Environment Consistency: คุณสามารถแจกไฟล์ docker-compose.yml นี้ให้ทีมทุกคน หรือติดตั้งให้ลูกค้า ทีมงานทุกคนจะได้สภาพแวดล้อมที่เหมือนกัน 100% โดยไม่ต้องมานั่งตั้งค่าทีละเครื่อง

  2. One-Command Deployment: พิมพ์แค่คำสั่งเดียว:

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

ระบบทั้งหมดของคุณก็จะถูกสร้างและรันขึ้นมาพร้อมกันทันที

  1. Easy Maintenance: หากต้องการอัปเดตเวอร์ชันของ Database หรือ App ก็แค่แก้ไขไฟล์นี้ แล้วรันคำสั่งเดิม ทุกอย่างจะถูกอัปเดตให้อัตโนมัติ

สรุปคำสั่ง Docker Compose

คำสั่ง หน้าที่
docker-compose up -d สั่งให้ระบบทั้งหมดรันขึ้นมาใน Background
docker-compose down หยุดและลบทุก Container ที่รันอยู่พร้อมกัน
docker-compose ps ดูสถานะของทุก Container ในกลุ่มนี้
docker-compose logs -f ดู Log การทำงานรวมของทุกตัวพร้อมกัน (มีประโยชน์มากเวลา Debug)

หมายเหตุ
คำสั่ง docker-compose up -d จะเป็นการเรียกไฟล์ชื่อ docker-compose.yml ขึ้นมาทำงานในการที่ต้องการกำหนดไฟล์ สามารถเพิ่ม flag -f เช่น

docker-compose -f [ชื่อไฟล์.yml] up -d

แถมท้าย

ในบางสถานการณ์เมื่อเราใช้ Docker ไปนานจะพบว่าพื้นที่จัดเก็บข้อมูจะเต็มเราซึ่งการใช้พื้นในเครื่องคอมพิวเตอร์เราประกอบด้วย 2 ส่วนคือ

  1. Docker Image เราสามารถแสดงรายการ docker image ที่อยู่ในเครื่องผ่านคำสั่ง
docker images ls
Enter fullscreen mode Exit fullscreen mode

สังเกตุดูว่าจำนวน และขนาดของ docker image ที่ไม่ได้ใช้มีจำนวน และกินพื้นที่ค่อยข้างสูงซึ่งเปลีืองพื้นที่เก็บข้อมูลใน computer

  1. Docker Volume เราสามารถแสดงรายการ volume ที่อยู่ในเครื่องผ่านคำสั่ง
docker volume ls
Enter fullscreen mode Exit fullscreen mode

เราสามารถใช้คำสั่ง

docker system prune
Enter fullscreen mode Exit fullscreen mode

ในการ

  • Stopped Containers: ลบ Container ทั้งหมดที่หยุดการทำงานอยู่ (ไม่ว่าจะมีข้อมูลอะไรค้างอยู่หรือไม่)
  • Networks: ลบ Docker Networks ทั้งหมดที่ไม่มี Container ใดๆ ใช้งานอยู่
  • Dangling Images: ลบ Image ที่ไม่ได้ถูกใช้งานหรือเชื่อมโยงกับ Container ใดๆ (มักเกิดจากการ build image ใหม่แล้วชื่อซ้ำกับตัวเก่า ทำให้ตัวเก่ากลายเป็น dangling)
  • Dangling Build Cache: ลบข้อมูลชั่วคราว (cache) ที่ค้างจากการ build image ที่ไม่ได้ถูกใช้งาน

ข้อควรระวัง

  1. ต้องยืนยันการลบ: เมื่อรันคำสั่ง ระบบจะถามเพื่อความแน่ใจเสมอว่าคุณต้องการลบจริงหรือไม่ หากต้องการข้ามขั้นตอนนี้ (เช่น การรันใน script อัตโนมัติ) สามารถใช้ flag -f หรือ --force ได้
  2. การลบ Volume: โดยปกติ docker system prune จะไม่ลบ Volume เพราะเป็นส่วนที่เก็บข้อมูลสำคัญ (เช่น ฐานข้อมูล) หากต้องการลบ Volume ที่ไม่ได้ใช้งานด้วย ต้องเพิ่ม flag --volumes เข้าไปครับ
  3. การลบ Image ทั้งหมด: หากต้องการลบ Image ที่ "ไม่ได้ถูกใช้งานโดย Container ใดๆ เลย" (ไม่ใช่แค่ตัวที่เป็น dangling) สามารถเพิ่ม flag -a หรือ --all ได้ เช่นถ้าต้องการลบทั้ง Volume และ Unused Image ใช้คำสั่ง
docker system prune -a --volumes

Top comments (0)