คำสั่ง 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 โฟลเดอร์ใดไว้ที่ไหน ใช้ตรวจว่าข้อมูลจริงเก็บอยู่ตรงไหนก่อนลบหรือย้าย
คำสั่ง 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/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
Related Posts
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


