คำตอบสั้น ๆ: รวมคำสั่ง Docker ที่ผู้ดูแลเซิร์ฟเวอร์ใช้ทุกวัน ตั้งแต่ดึง Image รัน Container ดูสถานะ อ่าน Log เข้าไปสั่งงานใน Container จนถึงหยุดและลบอย่างปลอดภัย
คู่มือนี้อธิบาย Docker ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
เมื่อติดตั้ง Docker บนเซิร์ฟเวอร์แล้ว งานประจำวันของผู้ดูแลส่วนใหญ่วนอยู่กับคำสั่งไม่กี่กลุ่ม คือดึง Image รัน Container ดูสถานะ อ่าน Log เข้าไปสั่งงานใน Container และหยุดหรือลบเมื่อเลิกใช้ บทความนี้รวบรวมคำสั่งที่ใช้บ่อยพร้อมตัวอย่างและผลลัพธ์ที่ควรเห็น เพื่อใช้เป็นคู่มืออ้างอิงเวลาทำงานจริง
ก่อนเริ่ม ควรเข้าใจคำสองคำให้ตรงกัน Image คือแม่แบบที่อ่านอย่างเดียว เช่น nginx:1.27 ส่วน Container คือสิ่งที่รันขึ้นมาจาก Image หนึ่ง Image สร้าง Container ได้หลายตัว และเมื่อลบ Container ข้อมูลที่เขียนไว้ข้างในจะหายไปด้วย ยกเว้นข้อมูลที่เก็บใน Volume
สิ่งที่ต้องเตรียม
- Linux Server ที่ติดตั้ง Docker Engine และ Docker Compose Plugin แล้ว หากยังไม่มี ดู ติดตั้ง Docker และ Docker Compose บน Ubuntu
- ผู้ใช้ที่ใช้
sudoได้ หรืออยู่ในกลุ่มdocker
หมายเหตุ: ผู้ใช้ที่อยู่ในกลุ่ม
dockerมีสิทธิ์เทียบเท่า root บนเครื่อง เพราะสามารถ Mount ไฟล์ระบบใดก็ได้เข้าไปใน Container ควรเพิ่มเฉพาะผู้ดูแลที่ไว้ใจเท่านั้น ตัวอย่างในบทความนี้เขียนแบบไม่มีsudoหากผู้ใช้ของคุณไม่ได้อยู่ในกลุ่มนี้ ให้เติมsudoหน้าคำสั่ง
ขั้นตอนที่ 1: ตรวจสอบว่า Docker พร้อมใช้งาน
docker version
docker info
docker version ต้องแสดงทั้งส่วน Client และ Server ถ้าเห็นเฉพาะ Client และมีข้อความ Cannot connect to the Docker daemon แปลว่าบริการยังไม่ทำงาน ให้สั่ง sudo systemctl start docker ส่วน docker info จะบอกจำนวน Container, Storage Driver และตำแหน่งเก็บข้อมูล (ปกติคือ /var/lib/docker)
ขั้นตอนที่ 2: จัดการ Image
docker pull nginx:1.27
docker images
docker images แสดงรายการ Image ในเครื่องพร้อม TAG และขนาด เช่น
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.27 a1b2c3d4e5f6 2 weeks ago 192MB
ควรระบุ TAG เสมอ ถ้าไม่ระบุ Docker จะใช้ latest ซึ่งอาจเปลี่ยนเวอร์ชันหลักโดยไม่ทันสังเกตเมื่อดึงใหม่ ลบ Image ที่ไม่ใช้แล้วด้วย
docker rmi nginx:1.27
ถ้ายังมี Container ที่สร้างจาก Image นี้อยู่ จะลบไม่ได้และได้ข้อความ image is being used by stopped container ต้องลบ Container ก่อน
ขั้นตอนที่ 3: รัน Container
ตัวอย่างการรัน Nginx แบบทำงานเบื้องหลัง เปิดพอร์ต และตั้งให้เริ่มใหม่อัตโนมัติ
docker run -d \
--name web \
--restart unless-stopped \
-p 8080:80 \
-v /srv/web/html:/usr/share/nginx/html:ro \
-e TZ=Asia/Bangkok \
nginx:1.27
| ตัวเลือก | ความหมาย |
|---|---|
-d | รันเบื้องหลัง (detached) คืน Prompt ทันที |
--name web | ตั้งชื่อ Container ใช้อ้างอิงแทน ID |
--restart unless-stopped | เริ่มใหม่อัตโนมัติเมื่อล่มหรือรีบูตเครื่อง ยกเว้นเราสั่งหยุดเอง |
-p 8080:80 | พอร์ต 8080 ของเครื่อง ส่งต่อไปพอร์ต 80 ใน Container |
-v ต้นทาง:ปลายทาง:ro | Mount โฟลเดอร์หรือ Volume เข้า Container ต่อท้าย :ro คืออ่านอย่างเดียว |
-e | กำหนด Environment Variable |
--rm | ลบ Container ทิ้งทันทีเมื่อหยุด เหมาะกับงานครั้งเดียว |
สำหรับงานครั้งเดียว เช่น ทดสอบคำสั่งใน Ubuntu ใหม่ ใช้ -it --rm
docker run -it --rm ubuntu:24.04 bash
หมายเหตุ: พอร์ตที่เปิดด้วย
-pถูกเพิ่มเป็นกฎ iptables โดย Docker เอง จึง ข้าม UFW และ firewalld ได้ แม้ UFW จะไม่ได้อนุญาตพอร์ต 8080 คนภายนอกก็ยังเข้าถึงได้ ถ้าต้องการให้เข้าได้เฉพาะจากเครื่องเดียวกัน (เช่น ให้ Nginx บนเครื่องทำ Reverse Proxy) ให้ผูกกับ localhost ด้วย-p 127.0.0.1:8080:80
ขั้นตอนที่ 4: ดูสถานะ Container
docker ps
docker ps -a
docker ps แสดงเฉพาะตัวที่กำลังทำงาน ส่วน -a แสดงทั้งหมดรวมตัวที่หยุดแล้ว ช่อง STATUS บอกสถานะ เช่น Up 3 hours หรือ Exited (1) 5 minutes ago ตัวเลขในวงเล็บคือ Exit Code ค่า 0 คือจบปกติ ค่าอื่นคือมีข้อผิดพลาด ส่วน Restarting ที่ขึ้นซ้ำ ๆ แปลว่าโปรแกรมใน Container ล่มทันทีหลังเริ่ม ให้ไปอ่าน Log
ดูการใช้ CPU, RAM และ Network ของแต่ละ Container แบบเรียลไทม์
docker stats
กด Ctrl+C เพื่อออก ถ้าต้องการภาพเดียวแล้วจบ ใช้ docker stats --no-stream
ขั้นตอนที่ 5: อ่าน Log
docker logs web
docker logs --tail 100 -f web
docker logs --since 30m web
--tail 100 แสดง 100 บรรทัดล่าสุด -f ติดตามต่อเนื่อง และ --since 30m แสดงเฉพาะ 30 นาทีที่ผ่านมา Log เหล่านี้เก็บเป็นไฟล์ในเครื่องและโตขึ้นเรื่อย ๆ หากไม่จำกัดขนาด ดู จำกัดขนาด Log ของ Docker Container
ขั้นตอนที่ 6: เข้าไปสั่งงานใน Container
docker exec -it web sh
docker exec web nginx -t
คำสั่งแรกเปิด Shell ใน Container (Image ขนาดเล็กหลายตัวไม่มี bash จึงใช้ sh) พิมพ์ exit เพื่อออก Container ยังทำงานต่อ คำสั่งที่สองรันคำสั่งเดียวแล้วจบ เหมาะกับการตรวจสอบเร็ว ๆ
คัดลอกไฟล์เข้าออกระหว่างเครื่องกับ Container
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
docker cp ./index.html web:/usr/share/nginx/html/
ไฟล์ที่คัดลอกเข้า Container ด้วยวิธีนี้จะหายเมื่อสร้าง Container ใหม่ ข้อมูลถาวรควรอยู่ใน Volume หรือ Bind Mount
ขั้นตอนที่ 7: หยุด เริ่ม และลบ
docker stop web
docker start web
docker restart web
docker rm web
docker rm -f web
docker stop ส่งสัญญาณให้โปรแกรมปิดตัวเองอย่างเรียบร้อยและรอ 10 วินาทีก่อนบังคับหยุด docker rm ลบได้เฉพาะตัวที่หยุดแล้ว ส่วน rm -f บังคับหยุดแล้วลบทันที ข้อมูลที่ไม่ได้อยู่ใน Volume จะหายถาวร
ขั้นตอนที่ 8: ดูรายละเอียดเชิงลึกด้วย inspect
docker inspect web
docker inspect -f '{{.State.Status}} {{.RestartCount}}' web
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' web
inspect คืนข้อมูลทั้งหมดเป็น JSON ตัวเลือก -f ช่วยดึงเฉพาะส่วนที่ต้องการ ตัวอย่างที่สองบอกสถานะและจำนวนครั้งที่รีสตาร์ต ตัวอย่างที่สามแสดงว่า Mount โฟลเดอร์ใดไว้ที่ไหน ใช้ตรวจว่าข้อมูลจริงเก็บอยู่ตรงไหนก่อนลบหรือย้าย