ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home คำสั่ง Docker พื้นฐานที่ใช้บ่อย

คำสั่ง Docker พื้นฐานที่ใช้บ่อย

เมื่อติดตั้ง Docker บนเซิร์ฟเวอร์แล้ว งานประจำวันของผู้ดูแลส่วนใหญ่วนอยู่กับคำสั่งไม่กี่กลุ่ม คือดึง Image รัน Container ดูสถานะ อ่าน Log เข้าไปสั่งงานใน Container และหยุดหรือลบเมื่อเลิกใช้ บทความนี้รวบรวมคำสั่งที่ใช้บ่อยพร้อมตัวอย่างและผลลัพธ์ที่ควรเห็น เพื่อใช้เป็นคู่มืออ้างอิงเวลาทำงานจริง

ก่อนเริ่ม ควรเข้าใจคำสองคำให้ตรงกัน Image คือแม่แบบที่อ่านอย่างเดียว เช่น nginx:1.27 ส่วน Container คือสิ่งที่รันขึ้นมาจาก Image หนึ่ง Image สร้าง Container ได้หลายตัว และเมื่อลบ Container ข้อมูลที่เขียนไว้ข้างในจะหายไปด้วย ยกเว้นข้อมูลที่เก็บใน Volume

สิ่งที่ต้องเตรียม

หมายเหตุ: ผู้ใช้ที่อยู่ในกลุ่ม 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 ต้นทาง:ปลายทาง:roMount โฟลเดอร์หรือ 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 โฟลเดอร์ใดไว้ที่ไหน ใช้ตรวจว่าข้อมูลจริงเก็บอยู่ตรงไหนก่อนลบหรือย้าย

คำสั่ง Docker Compose ที่ใช้คู่กัน

ถ้าระบบเขียนเป็นไฟล์ compose.yaml ให้เข้าไปในโฟลเดอร์นั้นแล้วใช้คำสั่ง docker compose (มีช่องว่าง เป็นรุ่น Plugin ปัจจุบัน ต่างจาก docker-compose รุ่นเก่า)

คำสั่งผลลัพธ์
docker compose up -dสร้างและเริ่มทุก Service ตามไฟล์
docker compose psดูสถานะ Service ในโปรเจกต์นี้
docker compose logs -f --tail 50อ่าน Log ทุก Service
docker compose pull แล้ว up -dอัปเดต Image และสร้าง Container ใหม่
docker compose downหยุดและลบ Container กับ Network (Volume ยังอยู่)

ตัวอย่างใช้งานจริงแบบครบระบบ ดู รัน WordPress ด้วย Docker Compose

ตรวจสอบผลลัพธ์

หลังรันตัวอย่าง Nginx ในขั้นตอนที่ 3 ให้ทดสอบจากเครื่องเซิร์ฟเวอร์

curl -I http://127.0.0.1:8080

ต้องได้ HTTP/1.1 200 OK (หรือ 403 ถ้าโฟลเดอร์ /srv/web/html ยังว่าง) และ docker ps ต้องแสดง 0.0.0.0:8080->80/tcp ในช่อง PORTS

ปัญหาที่พบบ่อย

permission denied while trying to connect to the Docker daemon socket

ผู้ใช้ไม่ได้อยู่ในกลุ่ม docker ใช้ sudo หรือเพิ่มกลุ่มด้วย sudo usermod -aG docker $USER แล้วออกจากระบบและเข้าใหม่ ให้พิจารณาข้อควรระวังเรื่องสิทธิ์ข้างต้นก่อน

Bind for 0.0.0.0:8080 failed: port is already allocated

มีโปรแกรมหรือ Container อื่นใช้พอร์ตนี้อยู่ ตรวจด้วย sudo ss -tlnp | grep 8080 แล้วเปลี่ยนพอร์ตฝั่งเครื่อง ดูรายละเอียดที่ ตรวจสอบพอร์ตที่เปิดอยู่บน Linux ด้วย ss และ lsof

The container name "/web" is already in use

มี Container ชื่อเดียวกันค้างอยู่ แม้จะหยุดแล้ว ดูด้วย docker ps -a แล้วลบตัวเก่าก่อน หรือใช้ชื่อใหม่

ดิสก์เต็มหลังใช้ Docker ไปสักพัก

Image เก่า, Container ที่หยุดแล้ว และ Build Cache สะสมอยู่ใน /var/lib/docker ดูวิธีตรวจและลบอย่างปลอดภัยที่ คืนพื้นที่ดิสก์ที่ Docker ใช้ด้วย docker system prune

หากต้องการความช่วยเหลือเกี่ยวกับ Docker บนเซิร์ฟเวอร์ของคุณ ติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security