🐳 Docker

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
เผยแพร่

31 สิงหาคม 2568

Docker เป็นแพลตฟอร์มสำหรับการรันแอปพลิเคชันในคอนเทนเนอร์ที่แยกออกจากกัน ชีทโกงนี้รวมคำสั่งสำหรับการทำงานกับอิมเมจ คอนเทนเนอร์ เครือข่าย วอลุ่ม รวมถึง Docker Compose และ Swarm

📦 คำสั่งพื้นฐาน

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker คำสั่งหลักของ Docker CLI ที่ใช้รันคำสั่งย่อยและจัดการคอนเทนเนอร์ อิมเมจ เครือข่าย และวอลุ่ม
docker version แสดงเวอร์ชัน Docker ที่ติดตั้ง (client และ server) ใช้ตรวจสอบการติดตั้ง
docker version --format '{{.Client.APIVersion}}'

แสดงเฉพาะเวอร์ชัน API ของ Docker client

docker version --format '{{.Server.Version}}'

แสดงเฉพาะเวอร์ชัน Docker server (Engine)

docker version --format '{{json .}}'

ส่งออกข้อมูลเวอร์ชันเต็มในรูปแบบ JSON

docker system info แสดงข้อมูลทั่วไปของระบบ Docker: จำนวนคอนเทนเนอร์ อิมเมจ และทรัพยากร
docker info

แสดงข้อมูล Docker: เวอร์ชัน เครือข่าย จำนวนคอนเทนเนอร์และอิมเมจ

docker info --format '{{json .}}'

ส่งออกข้อมูลในรูปแบบ JSON — เหมาะสำหรับระบบอัตโนมัติ

docker info --format '{{.NCPU}} CPUs, {{.MemTotal}} bytes RAM'

แสดงจำนวน CPU และหน่วยความจำทั้งหมด

docker info --format '{{.Driver}}'

แสดง storage driver ที่ Docker ใช้งาน

docker image pull ดาวน์โหลดอิมเมจจาก Docker Hub หรือ registry อื่น คอนเทนเนอร์ไม่สามารถรันได้หากไม่มีอิมเมจ
docker pull ubuntu

ดาวน์โหลดอิมเมจ Ubuntu ล่าสุด

docker pull nginx:alpine

ดาวน์โหลดอิมเมจ Nginx ที่มีขนาดเล็ก (Alpine Linux)

docker pull redis:7

ดาวน์โหลดอิมเมจ Redis เวอร์ชัน 7

docker container run สร้างและรันคอนเทนเนอร์ใหม่จากอิมเมจ
docker run -it ubuntu bash

รัน Ubuntu พร้อม Bash แบบ interactive

docker run -d nginx

รัน Nginx ในโหมดเบื้องหลัง (detached)

docker run -p 8080:80 nginx

รัน Nginx และผูกพอร์ต 80 ของคอนเทนเนอร์กับพอร์ต 8080 ของโฮสต์

docker container ls แสดงรายการคอนเทนเนอร์ที่กำลังทำงาน
docker ps

แสดงเฉพาะคอนเทนเนอร์ที่กำลังรัน

docker ps -a

แสดงคอนเทนเนอร์ทั้งหมด รวมถึงที่หยุดแล้ว

docker ps --format '{{.Names}}'

แสดงเฉพาะชื่อคอนเทนเนอร์

docker container start เริ่มคอนเทนเนอร์ที่หยุดไว้
docker start container_name

เริ่มคอนเทนเนอร์ตามชื่อ

docker start $(docker ps -aq)

เริ่มคอนเทนเนอร์ทั้งหมด

docker start -ai container_name

เริ่มคอนเทนเนอร์และเข้า terminal แบบ interactive

docker container stop หยุดคอนเทนเนอร์ที่กำลังทำงาน
docker stop container_name

หยุดคอนเทนเนอร์ตามชื่อ

docker stop $(docker ps -q)

หยุดคอนเทนเนอร์ทั้งหมดที่กำลังรัน

docker stop -t 5 container_name

หยุดคอนเทนเนอร์โดยให้เวลา 5 วินาทีในการปิด process

docker container restart รีสตาร์ทคอนเทนเนอร์
docker restart container_name

รีสตาร์ทคอนเทนเนอร์ที่กำหนด

docker restart $(docker ps -q)

รีสตาร์ทคอนเทนเนอร์ทั้งหมดที่กำลังทำงาน

docker restart -t 10 container_name

รีสตาร์ทคอนเทนเนอร์โดยหน่วงเวลา 10 วินาที

docker container rm ลบคอนเทนเนอร์
docker rm container_name

ลบคอนเทนเนอร์ที่หยุดแล้ว

docker rm $(docker ps -aq)

ลบคอนเทนเนอร์ทั้งหมดที่หยุด

docker rm -f container_name

บังคับลบคอนเทนเนอร์ที่กำลังทำงาน

docker image ls แสดงรายการอิมเมจที่ดาวน์โหลดแล้ว
docker images

แสดงอิมเมจทั้งหมดในโฮสต์

docker images -a

แสดงอิมเมจทั้งหมด รวมชั้นกลาง (intermediate layers)

docker images --format '{{.Repository}}:{{.Tag}}'

แสดงเฉพาะชื่อและ tag ของอิมเมจ

docker image rm ลบอิมเมจหนึ่งหรือหลายอิมเมจจาก local storage
docker rmi test1:latest

ลบอิมเมจที่มี tag latest จาก repo test1

docker rmi 1a2b3c4d5e6f

ลบอิมเมจตาม ID

docker rmi $(docker images -q)

ลบอิมเมจทั้งหมด (โปรดระวัง!)

🔁 การจัดการคอนเทนเนอร์

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker container exec รันคำสั่งภายในคอนเทนเนอร์ที่กำลังทำงาน
docker exec -it container bash

เปิด bash shell แบบ interactive ภายในคอนเทนเนอร์ชื่อ container

docker exec container ls /app

รันคำสั่ง ls ในไดเรกทอรี /app ของคอนเทนเนอร์

docker exec -d container touch /tmp/testfile

รันคำสั่งในคอนเทนเนอร์ในโหมด detached (ไม่ต้องรอ)

docker container logs ดู log ของคอนเทนเนอร์
docker logs container

แสดง log ทั้งหมดของคอนเทนเนอร์ container

docker logs -f container

ติดตาม log แบบเรียลไทม์

docker logs --tail 50 container

แสดง log 50 บรรทัดล่าสุด

docker inspect ดึงข้อมูล JSON แบบละเอียดเกี่ยวกับคอนเทนเนอร์หรืออิมเมจ
docker inspect container

แสดงรายละเอียดของคอนเทนเนอร์ container

docker inspect --format '{{.NetworkSettings.IPAddress}}' container

แสดง IP address ของคอนเทนเนอร์

docker container stats แสดงสถิติการใช้งานทรัพยากรของคอนเทนเนอร์แบบเรียลไทม์
docker stats

แสดง CPU หน่วยความจำ เครือข่าย และดิสก์ของทุกคอนเทนเนอร์

docker stats container_name

แสดงเฉพาะคอนเทนเนอร์ที่เลือก

docker stats --no-stream

แสดง snapshot เพียงครั้งเดียวแล้วออก

docker container rename เปลี่ยนชื่อคอนเทนเนอร์
docker rename old_name new_name

เปลี่ยนชื่อคอนเทนเนอร์จาก old_name เป็น new_name

docker container cp คัดลอกไฟล์ระหว่างคอนเทนเนอร์กับโฮสต์
docker cp container:/src/file.txt ./file.txt

คัดลอกไฟล์จากคอนเทนเนอร์ไปยังโฮสต์ปัจจุบัน

docker cp ./config.yaml container:/app/config.yaml

คัดลอกไฟล์จากโฮสต์ไปยังคอนเทนเนอร์

docker cp CONTAINER:/var/logs/app.log - | tar x -O | grep "ERROR"

stream ไฟล์ log จากคอนเทนเนอร์แล้วกรองบรรทัดที่มี “ERROR” โดยไม่บันทึกลงดิสก์

docker container top แสดง process ที่กำลังทำงานภายในคอนเทนเนอร์
docker top container

แสดง process ของคอนเทนเนอร์ชื่อ container

docker container pause หยุด (pause) process ทั้งหมดในคอนเทนเนอร์
docker pause container

หยุดคอนเทนเนอร์ container

docker container unpause resume คอนเทนเนอร์ที่ถูก pause
docker unpause container

resume คอนเทนเนอร์ container

docker container update อัปเดตการตั้งค่าคอนเทนเนอร์โดยไม่ต้องรีสตาร์ท
docker update --memory 500m container

จำกัดการใช้หน่วยความจำของคอนเทนเนอร์ไว้ที่ 500 MB

🧱 อิมเมจและ Dockerfile

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker buildx build สร้างอิมเมจ Docker จาก Dockerfile
docker build -t my_image .

สร้างอิมเมจชื่อ my_image จากไดเรกทอรีปัจจุบัน

docker build -t my_image:1.0 .

สร้างอิมเมจที่มี tag 1.0

docker build --no-cache -t my_image .

สร้างอิมเมจโดยไม่ใช้ cache

docker container commit สร้างอิมเมจจากสถานะปัจจุบันของคอนเทนเนอร์
docker commit container my_img:v1

สร้างอิมเมจ my_img ที่มี tag v1 จากคอนเทนเนอร์ container

docker commit -m "Added config" container my_img:v2

สร้างอิมเมจพร้อม commit message

docker commit -a "John Doe" container my_img:latest

สร้างอิมเมจโดยกำหนด author

docker image tag เพิ่มหรือเปลี่ยน tag ของอิมเมจ
docker tag my_image myrepo/my_image:latest

เพิ่ม tag สำหรับ push ไปยัง registry myrepo

docker tag my_image:1.0 my_image:stable

สร้าง tag stable สำหรับอิมเมจ 1.0

docker tag my_image my_image:backup

เพิ่ม tag backup ให้กับอิมเมจ local

docker image push push อิมเมจไปยัง Docker Hub หรือ registry อื่น
docker push myrepo/my_image:latest

push อิมเมจที่มี tag latest ไปยัง repo myrepo

docker push myrepo/my_image:1.0

push อิมเมจที่มี tag 1.0

docker push myrepo/my_image

push อิมเมจด้วย tag เริ่มต้น latest

docker login ยืนยันตัวตนกับ Docker Hub หรือ registry อื่น
docker login

กรอก username และ password สำหรับ Docker Hub

docker login myregistry.local:5000

เข้าสู่ระบบ registry ส่วนตัว

docker login -u username -p password

เข้าสู่ระบบด้วย username และ password (ไม่แนะนำ)

docker logout ออกจากระบบ Docker Hub หรือ registry อื่น
docker logout

ออกจาก Docker Hub

docker logout myregistry.local:5000

ออกจาก registry ส่วนตัว

HEALTHCHECK คำสั่ง Dockerfile สำหรับตรวจสอบสุขภาพของคอนเทนเนอร์อัตโนมัติ
HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD curl -f http://localhost/ || exit 1

เพิ่ม health check เพื่อตรวจสอบบริการทุก 30 วินาที

docker inspect --format='{{json .State.Health}}' container_name

ตรวจสอบ healthcheck status ของคอนเทนเนอร์ที่กำลังทำงาน

🔌 เครือข่ายและวอลุ่ม

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker network ls แสดงรายการ Docker networks ทั้งหมด
docker network ls

แสดง Docker networks ที่สร้างทั้งหมด

docker network ls --filter driver=bridge

แสดงเฉพาะ network ที่ใช้ driver bridge

docker network ls --format '{{.Name}}'

แสดงเฉพาะชื่อ network

docker network create สร้าง Docker network ใหม่
docker network create my_net

สร้าง network ชื่อ my_net พร้อมค่าเริ่มต้น

docker network create --driver bridge my_bridge_net

สร้าง network ด้วย driver bridge

docker network create --subnet=192.168.10.0/24 my_custom_net

สร้าง network พร้อม subnet ที่กำหนดเอง

docker network connect เชื่อมต่อคอนเทนเนอร์เข้ากับ network
docker network connect my_net container

เชื่อมต่อคอนเทนเนอร์ชื่อ container เข้ากับ network my_net

docker network connect --alias db_net my_net container

เชื่อมต่อด้วย alias db_net

docker network disconnect ยกเลิกการเชื่อมต่อคอนเทนเนอร์จาก network
docker network disconnect my_net container

ยกเลิกการเชื่อมต่อคอนเทนเนอร์ container จาก network my_net

docker volume ls แสดงรายการ Docker volumes ทั้งหมด
docker volume ls

แสดง Docker volumes ทั้งหมด

docker volume ls --filter dangling=true

แสดง volumes ที่ไม่ได้ใช้งาน

docker volume create สร้าง Docker volume ใหม่
docker volume create my_vol

สร้าง volume ชื่อ my_vol

docker volume create --driver local --opt type=tmpfs my_tmp_vol

สร้าง volume ชั่วคราวด้วย tmpfs

docker volume inspect แสดงรายละเอียดเกี่ยวกับ volume
docker volume inspect my_vol

แสดงรายละเอียดของ volume my_vol ในรูปแบบ JSON

docker volume rm ลบ volume หนึ่งหรือหลายอัน
docker volume rm my_vol

ลบ volume ชื่อ my_vol

docker volume rm $(docker volume ls -qf dangling=true)

ลบ volumes ที่ไม่ได้ใช้งานทั้งหมด

🧩 ปลั๊กอินของ Docker

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker plugin ls แสดงปลั๊กอิน Docker ที่ติดตั้งแล้ว
docker plugin ls

แสดงปลั๊กอินทั้งหมดและสถานะ

docker plugin install ติดตั้งปลั๊กอิน Docker จาก registry
docker plugin install vieux/sshfs

ติดตั้งปลั๊กอิน SSHFS volume

docker plugin install store/weaveworks/net-plugin:latest_release

ติดตั้งปลั๊กอินเครือข่าย Weave

docker plugin disable ปิดการใช้งานปลั๊กอินที่ติดตั้งแล้ว
docker plugin disable vieux/sshfs

ปิดการใช้งานปลั๊กอิน SSHFS

docker plugin enable เปิดใช้งานปลั๊กอินที่ถูกปิดไว้
docker plugin enable vieux/sshfs

เปิดใช้งานปลั๊กอิน SSHFS

docker plugin rm ลบปลั๊กอิน Docker
docker plugin rm vieux/sshfs

ลบปลั๊กอิน SSHFS

📋 Docker Compose

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker compose up เริ่มคอนเทนเนอร์ที่กำหนดไว้ใน docker-compose.yml
docker compose up

เริ่มบริการทั้งหมดในไดเรกทอรีปัจจุบันแบบ interactive

docker compose up -d

เริ่มบริการในโหมดเบื้องหลัง (detached)

docker compose up --build

build อิมเมจก่อนเริ่มบริการ

docker compose down หยุดและลบคอนเทนเนอร์ เครือข่าย และวอลุ่มที่สร้างโดย up
docker compose down

หยุดบริการทั้งหมดและลบ resource ที่เกี่ยวข้อง

docker compose down --volumes

ลบวอลุ่มที่สร้างโดย Compose ด้วย

docker compose down --rmi all

ลบอิมเมจที่สร้างโดย Compose ด้วย

docker compose logs ดู log ของบริการทั้งหมดหรือบริการที่เลือก
docker compose logs

แสดง log ของทุกบริการ

docker compose logs -f

ติดตาม log แบบเรียลไทม์

docker compose logs web

แสดง log ของบริการ web เท่านั้น

docker compose exec รันคำสั่งในคอนเทนเนอร์บริการที่กำลังทำงาน
docker compose exec web bash

เข้าสู่ bash shell ภายในบริการ web

docker compose exec db ls /var/lib/postgresql

รันคำสั่ง ls ภายในคอนเทนเนอร์ฐานข้อมูล

docker compose exec -d worker touch /tmp/done

รันคำสั่งในคอนเทนเนอร์ worker ในโหมด detached

docker compose build สร้างหรือ build อิมเมจบริการใหม่
docker compose build

build อิมเมจทั้งหมดใน docker-compose.yml

docker compose build web

build อิมเมจเฉพาะของบริการ web

docker compose build --no-cache

build อิมเมจโดยไม่ใช้ cache

docker compose ps แสดงสถานะของบริการและคอนเทนเนอร์
docker compose ps -a

แสดงคอนเทนเนอร์ทั้งหมด รวมถึงที่หยุดแล้ว

docker compose ps --services

แสดงเฉพาะชื่อบริการ

docker compose pull ดาวน์โหลด/อัปเดตอิมเมจบริการจาก registry
docker compose pull web

pull อิมเมจเฉพาะบริการ web

docker compose pull --ignore-pull-failures

ทำการ pull ต่อไปแม้บางอิมเมจจะล้มเหลว

docker compose restart รีสตาร์ทบริการทั้งหมดหรือที่เลือก
docker compose restart db

รีสตาร์ทบริการ db เท่านั้น

docker compose restart -t 10

รีสตาร์ทบริการพร้อม timeout 10 วินาที

docker compose config แสดงการตั้งค่า Compose สุดท้ายในรูปแบบ YAML
docker compose config --services

แสดงรายการบริการทั้งหมด

docker compose config --volumes

แสดงรายการวอลุ่มที่กำหนด

docker compose start เริ่มบริการที่หยุดไว้โดยไม่สร้างคอนเทนเนอร์ใหม่
docker compose start web

เริ่มบริการ web

docker compose start db api

เริ่มหลายบริการพร้อมกัน

docker compose stop หยุดบริการโดยไม่ลบคอนเทนเนอร์
docker compose stop web

หยุดบริการ web

docker compose stop -t 5

หยุดบริการพร้อม timeout 5 วินาที

📤 การส่งออกและนำเข้า

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker image save บันทึกอิมเมจ Docker หนึ่งหรือหลายอันเป็นไฟล์ tar เพื่อใช้ในการนำเข้าหรือถ่ายโอนในภายหลัง
docker save -o image.tar my_img:tag

บันทึกอิมเมจ Docker เป็นไฟล์ tar

docker save my_image > my_image.tar

วิธีอื่นในการบันทึกอิมเมจเป็นไฟล์

docker save -o redis_latest.tar redis:latest

บันทึกอิมเมจ Redis ที่กำหนดลงไฟล์

docker image load โหลดอิมเมจ Docker จากไฟล์ tar ที่บันทึกไว้ก่อนหน้า
docker load < image.tar

โหลดอิมเมจจากไฟล์ tar

docker load --input redis_latest.tar

โหลดอิมเมจโดยระบุไฟล์ผ่านพารามิเตอร์

docker load --quiet < my_image.tar

โหลดอิมเมจโดยไม่แสดง progress

docker container export ส่งออกไฟล์ระบบของคอนเทนเนอร์เป็นไฟล์ tar โดยไม่มีประวัติอิมเมจหรือ metadata
docker export container > file.tar

ส่งออกไฟล์ระบบคอนเทนเนอร์เป็น archive

docker export my_container > my_container_fs.tar

ส่งออกคอนเทนเนอร์ตามชื่อ

docker export -o container_fs.tar container_id

ส่งออกโดยใช้ Container ID พร้อม flag -o

docker image import สร้างอิมเมจใหม่จากไฟล์ tar ของไฟล์ระบบ
docker import file.tar new_img

นำเข้าไฟล์ archive เป็นอิมเมจ Docker ใหม่

docker import https://example.com/image.tar my_new_image

นำเข้าอิมเมจโดยตรงจาก URL

docker import - my_image < file.tar

นำเข้าจาก standard input

🧹 การล้างข้อมูลและการวินิจฉัย

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker system df แสดงการใช้งานดิสก์ของ Docker: volumes, images, containers และ build cache
docker system df -v

ผลลัพธ์แบบละเอียดพร้อมข้อมูลของแต่ละอิมเมจ คอนเทนเนอร์ และวอลุ่ม

docker system df --format '{{json .}}'

ส่งออกข้อมูลในรูปแบบ JSON

docker system prune ลบข้อมูลที่ไม่ได้ใช้งานของ Docker ทั้งหมด: คอนเทนเนอร์ที่หยุดแล้ว เครือข่ายที่ไม่ได้ใช้งาน อิมเมจที่ไม่ถูกอ้างอิง และ build cache
docker system prune -a

ลบอิมเมจที่ไม่ได้ใช้งานรวมถึง intermediate ones

docker system prune --volumes

ลบวอลุ่มที่ไม่ได้ใช้งานพร้อม resource อื่น ๆ

docker image prune ลบอิมเมจ Docker ที่ไม่ได้ใช้งาน รวมถึงชั้นที่ dangling
docker image prune -a

ลบอิมเมจทั้งหมดที่ไม่ได้ใช้งานรวมถึง dangling

docker image prune --filter "until=24h"

ลบอิมเมจที่เก่ากว่า 24 ชั่วโมง

docker container prune ลบคอนเทนเนอร์ที่หยุดแล้วตาม filter หรือทั้งหมดหากไม่กำหนด
docker container prune --filter "until=24h"

ลบคอนเทนเนอร์ที่หยุดแล้วและมีอายุมากกว่า 24 ชั่วโมง

docker container prune --force

ลบโดยไม่ต้องยืนยัน

🐝 Docker Swarm

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker swarm init เริ่มต้นคลัสเตอร์ Docker Swarm ใหม่บนโหนดปัจจุบัน
docker swarm init --advertise-addr 192.168.1.100

เริ่มต้นคลัสเตอร์โดยระบุ IP address

docker swarm init --listen-addr 0.0.0.0:2377

เริ่มต้นพร้อมระบุพอร์ตสำหรับรับการเชื่อมต่อ

docker service create สร้างบริการใหม่ในคลัสเตอร์ Swarm
docker service create --name nginx nginx

สร้างบริการ Nginx ใน Swarm

docker service create --replicas 3 --name web webserver

สร้างบริการพร้อม replicas จำนวน 3

docker service create --name redis --publish 6379:6379 redis

สร้างบริการพร้อมการแมปพอร์ต

docker stack deploy ดีพลอย stack ของบริการไปยังคลัสเตอร์ Swarm ตามไฟล์ Compose
docker stack deploy -c docker-compose.yml mystack

ดีพลอย stack จากไฟล์ compose

docker stack deploy --with-registry-auth -c compose.yml mystack

ดีพลอยพร้อมการส่งต่อข้อมูลรับรอง registry

docker stack deploy -c swarm-compose.yml mystack

ใช้ไฟล์ compose ทางเลือกสำหรับ stack

docker stack rm ลบ stack หนึ่งหรือหลายอันออกจากคลัสเตอร์ Swarm
docker stack rm mystack

ลบ stack mystack

docker stack rm

ลบ stack ทั้งหมด (ไม่แนะนำ)

docker stack rm mystack && docker swarm leave --force

ลบ stack และออกจาก Swarm

💼 การใช้งาน Docker ขั้นสูง

🚀 คำสั่ง Docker ระดับมืออาชีพ

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker buildx เครื่องมือ build อิมเมจขั้นสูงแทน docker build รองรับ multi-platform, cache, การ build ขนาน และการส่งออกหลายรูปแบบ เหมาะสำหรับ CI/CD และการพัฒนาข้ามแพลตฟอร์ม
docker buildx build --platform linux/arm64,linux/amd64 -t myimg:multi .

สร้างอิมเมจ multi-platform (ARM และ x86 พร้อมกัน)

docker buildx build --load -t localimg .

สร้างอิมเมจและโหลดเข้าสู่ cache ของ Docker Engine ภายในเครื่อง

docker buildx build --push --platform linux/amd64,linux/arm64 -t repo/app:latest .

สร้างและ push อิมเมจ multi-platform ไปยัง registry

docker context จัดการ Docker contexts สำหรับทำงานกับ remote หรือหลาย environment ทำให้สามารถสลับระหว่าง local และ remote Docker Engines ได้อย่างรวดเร็ว
docker context create myremote --docker "host=ssh://user@host"

สร้าง context สำหรับเชื่อมต่อไปยังโฮสต์ Docker ระยะไกล

docker context use myremote

สลับไปยัง context ระยะไกล

docker context ls

แสดง contexts ที่มีอยู่และ context ที่ใช้งานอยู่

docker system events ฟัง events ของ Docker แบบเรียลไทม์ พร้อมกรองตามชนิด event (เช่น การเริ่มคอนเทนเนอร์) เหมาะสำหรับการมอนิเตอร์และระบบอัตโนมัติ
docker events --filter 'event=start'

แสดงเฉพาะ event ของการเริ่มคอนเทนเนอร์

docker events --since 1h --until 10m

แสดง events ตั้งแต่ 1 ชั่วโมงที่แล้วจนถึง 10 นาทีที่แล้ว

docker events --filter 'type=network'

แสดงเฉพาะ events ที่เกี่ยวข้องกับเครือข่าย

docker events --filter 'image=nginx'

แสดง events ที่เกี่ยวข้องกับอิมเมจ nginx

docker container update เปลี่ยนการจำกัดทรัพยากรและการตั้งค่าของคอนเทนเนอร์ที่กำลังทำงานโดยไม่ต้องรีสตาร์ท
docker update --cpus 2 --memory 1g my_container

จำกัดการใช้งานที่ 2 CPU และ RAM 1 GB

docker update --restart unless-stopped my_container

ตั้งค่านโยบาย auto-restart เป็น unless-stopped

docker update --pids-limit 200 my_container

จำกัดจำนวน process ไม่เกิน 200

docker container diff แสดงการเปลี่ยนแปลงไฟล์ระบบของคอนเทนเนอร์เมื่อเทียบกับอิมเมจต้นฉบับ ใช้สำหรับดีบักและตรวจสอบ
docker diff my_container

แสดงการเปลี่ยนแปลงไฟล์ระบบทั้งหมดในคอนเทนเนอร์

docker diff my_container | grep '^A'

แสดงเฉพาะไฟล์ที่ถูกเพิ่ม (A — Added)

docker image history แสดงประวัติชั้นของอิมเมจ: คำสั่ง build, ขนาดของแต่ละชั้น และเวลาที่สร้าง เหมาะสำหรับการปรับแต่งและตรวจสอบ
docker history my_image

แสดงประวัติชั้นของอิมเมจ

docker history --no-trunc my_image

แสดงคำสั่ง build แบบเต็มโดยไม่ตัด

docker history --format "{{.CreatedBy}}: {{.Size}}" my_image

ส่งออกเฉพาะคำสั่ง build และขนาดชั้น

🛠 แนวทางและระบบอัตโนมัติที่เป็นประโยชน์

  • ลดขนาดอิมเมจ
    ใช้ base images เช่น alpine หรือ scratch เพื่อขนาดเล็กที่สุด
    เพื่อลดชั้น คุณสามารถใช้ --squash ระหว่างการ build (ต้องเปิด experimental features)
    ลบไฟล์ชั่วคราวและ cache ภายในชั้นเดียว:

    RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
  • ลดจำนวนชั้น
    รวมคำสั่งไว้ใน RUN เดียวเพื่อลดจำนวนชั้นและขนาดอิมเมจสุดท้าย:

    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
  • เพิ่มประสิทธิภาพการ build Dockerfile
    ใช้ multi-stage builds เพื่อเก็บเฉพาะไฟล์ที่จำเป็นในอิมเมจสุดท้าย
    คัดลอกและติดตั้ง dependencies ก่อน จากนั้นจึงคัดลอกโค้ด — ช่วยปรับ cache ของชั้นและเร่งการ build

  • แยก secrets และ configs
    อย่าเก็บไฟล์ .env, API keys หรือใบรับรองส่วนตัวในอิมเมจ
    ควรใช้สำหรับการกำหนดค่า:

    • docker secret (ใน Swarm)
    • environment variables (-e VAR=value หรือ .env)
    • external volumes สำหรับ configs

  • Secrets ตอน build (BuildKit)
    สำหรับส่ง secrets อย่างปลอดภัยระหว่าง build ให้ใช้ flag --secret:

    docker buildx build --secret id=mysecret,src=./secret.txt .

    ใน Dockerfile secret จะอยู่ที่ /run/secrets/mysecret:

    RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

    🛡 สิ่งนี้ช่วยป้องกันไม่ให้ secrets ถูกเก็บในชั้นอิมเมจ

  • Rootless Docker
    การรัน Docker โดยไม่ใช้สิทธิ์ root ช่วยเพิ่มความปลอดภัยและลดความเสี่ยงต่อโฮสต์
    วิธีเปิดใช้งาน:

    dockerd-rootless-setuptool.sh install
    export PATH=/usr/bin:$PATH

    ตรวจสอบ:

    docker info | grep Rootless

    ⚠ ฟีเจอร์บางอย่าง (เช่น การ forward พอร์ต <1024) จะไม่สามารถใช้งานได้

  • สแกนอิมเมจหาช่องโหว่
    ใช้เครื่องมือในตัว:

    docker scan my_image

    หรือ CLI ใหม่:

    docker scout cves my_image

    ช่วยตรวจหาช่องโหว่ใน base images และ dependencies

  • จำกัดการใช้ทรัพยากร
    จำกัดคอนเทนเนอร์ด้วยหน่วยความจำ CPU และจำนวน process:

    docker run --memory=512m --cpus="1.5" --pids-limit=200 myimage

    ป้องกันไม่ให้คอนเทนเนอร์ใช้ทรัพยากรมากเกินไป
    คุณยังสามารถจำกัด I/O ได้:

    docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage

    เหมาะสำหรับคอนเทนเนอร์ที่ไม่ควรโหลดระบบดิสก์มากเกินไป

  • การล้างข้อมูลอัตโนมัติ
    ลบอิมเมจ คอนเทนเนอร์ วอลุ่ม และเครือข่ายที่ไม่ได้ใช้งานเป็นประจำ:

    docker system prune -af --volumes

    ⚠ โปรดระวัง: คำสั่งนี้จะลบ resource ที่ไม่ได้ใช้งานทั้งหมด

    หากต้องการลบแบบเลือกใช้:

    docker image prune --filter "until=24h"
  • การผสานกับ CI/CD
    ฝังการ build, test และ deploy ใน GitHub Actions, GitLab CI, Jenkins pipelines
    ตัวอย่างขั้นตอนใน GitHub Actions:

    - run: docker build -t myapp:${GITHUB_SHA} .
    - run: docker push myapp:${GITHUB_SHA}
  • การบันทึกและมอนิเตอร์
    เชื่อม logging drivers (--log-driver) เข้ากับระบบส่วนกลาง: ELK, Loki, Splunk
    ใช้ Prometheus + cAdvisor สำหรับ metrics ของคอนเทนเนอร์

  • การดีพลอยใน Production
    แยก config สำหรับ development และ production โดยใช้ docker-compose.override.yml
    สำหรับ high availability และ scaling ใช้:

    • Docker Swarm
    • Kubernetes

🐞 การดีบักและการโปรไฟล์คอนเทนเนอร์ Docker

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker container exec รันคำสั่งภายในคอนเทนเนอร์ที่กำลังทำงาน เพื่อเข้าถึงแบบ interactive หรือรัน process ในสภาพแวดล้อมแยก
docker exec -it my_container bash

เริ่ม terminal (bash) แบบ interactive ภายในคอนเทนเนอร์

docker exec -it my_container sh

เริ่ม shell ขั้นต่ำในคอนเทนเนอร์ (ถ้า bash ไม่มี)

docker exec my_container ls /app

รันคำสั่งภายในคอนเทนเนอร์โดยไม่ใช้โหมด interactive

docker container logs แสดง log ของคอนเทนเนอร์ที่เลือก ช่วยดูผลลัพธ์และ event ที่เกี่ยวข้องกับการทำงานเพื่อวินิจฉัยและมอนิเตอร์
docker logs -f --tail 100 my_container

ดู 100 บรรทัดล่าสุดของ log แบบเรียลไทม์

docker logs my_container

แสดง log ทั้งหมดของคอนเทนเนอร์

docker logs --since 1h my_container

แสดง log ใน 1 ชั่วโมงที่ผ่านมา

docker inspect ส่งออกข้อมูลรายละเอียดของ object Docker (คอนเทนเนอร์ อิมเมจ เครือข่าย ฯลฯ) ในรูปแบบ JSON รวมถึงการตั้งค่าและสถานะ
docker inspect my_container

ดูข้อมูล JSON เต็มของคอนเทนเนอร์

docker inspect --format '{{.State.Pid}}' my_container

แสดง PID ของ process หลักในโฮสต์

docker inspect --format '{{.NetworkSettings.IPAddress}}' my_container

แสดง IP address ของคอนเทนเนอร์

nsenter (with strace) ยูทิลิตี้ Linux สำหรับเข้า namespaces ของ process อื่น (ที่นี่คือคอนเทนเนอร์) ใช้ร่วมกับ strace เพื่อติดตาม system calls ภายในคอนเทนเนอร์
nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid strace -p 1

เข้า namespaces ของคอนเทนเนอร์และติดตาม system calls ของ process 1

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --mount --uts --ipc --net --pid bash

เปิด bash shell ภายใน namespaces ของคอนเทนเนอร์

nsenter --target $(docker inspect --format '{{.State.Pid}}' my_container) --net netstat -tulnp

ดูพอร์ตที่เปิดอยู่ในคอนเทนเนอร์

tcpdump (inside container) เครื่องมือบรรทัดคำสั่งสำหรับดักจับและวิเคราะห์ทราฟฟิกเครือข่าย ใช้ในคอนเทนเนอร์เพื่อตรวจสอบปัญหา วิเคราะห์แพ็กเก็ต และมอนิเตอร์การเชื่อมต่อ
docker exec -it my_container tcpdump -i any

ดักจับและวิเคราะห์ทราฟฟิกในคอนเทนเนอร์

docker exec -it my_container tcpdump -nn port 80

ดักจับทราฟฟิกเฉพาะพอร์ต 80

docker exec -it my_container tcpdump -w /tmp/dump.pcap

บันทึกทราฟฟิกลงไฟล์เพื่อตรวจสอบภายหลัง

docker container stats แสดง metrics การใช้ทรัพยากรปัจจุบัน (CPU หน่วยความจำ เครือข่าย ดิสก์) ของคอนเทนเนอร์หนึ่งหรือหลายอันแบบเรียลไทม์
docker stats my_container

แสดงการใช้ CPU หน่วยความจำ เครือข่าย และดิสก์แบบเรียลไทม์

docker stats

แสดงสถิติของคอนเทนเนอร์ทั้งหมด

docker stats --no-stream

ส่งออกสถิติครั้งเดียวแล้วออก

docker container top แสดงรายการ process ที่กำลังทำงานภายในคอนเทนเนอร์ คล้ายกับ ps ใน Linux เพื่อวิเคราะห์การทำงาน
docker top my_container

แสดง process ที่ทำงานในคอนเทนเนอร์

docker top my_container aux

ใช้รูปแบบ output อื่น เช่น ps aux

docker top my_container -eo pid,cmd

แสดงเฉพาะ PID และคำสั่งของ process

docker diff แสดงการเปลี่ยนแปลงไฟล์ระบบของคอนเทนเนอร์เมื่อเทียบกับอิมเมจฐาน เช่น ไฟล์ที่เพิ่ม เปลี่ยน หรือถูกลบ
docker diff my_container

แสดงการเปลี่ยนแปลงไฟล์ระบบทั้งหมด

docker diff my_container | grep '^A'

แสดงเฉพาะไฟล์ที่ถูกเพิ่ม (A — Added)

docker diff my_container | grep '^C'

แสดงเฉพาะไฟล์ที่ถูกเปลี่ยน (C — Changed)

docker cp คัดลอกไฟล์และไดเรกทอรีระหว่างคอนเทนเนอร์กับโฮสต์ เพื่อแลกเปลี่ยนข้อมูลและสำรอง
docker cp my_container:/path/to/file ./file

คัดลอกไฟล์จากคอนเทนเนอร์ไปยังโฮสต์

docker cp ./config.yaml my_container:/app/config.yaml

คัดลอกไฟล์จากโฮสต์เข้าไปในคอนเทนเนอร์

docker cp my_container:/var/log/app.log - | tar x -O | grep "ERROR"

คัดลอก log file และกรองบรรทัด error โดยไม่บันทึกลงดิสก์

💡 สำหรับการดีบักขั้นสูง คุณสามารถใช้ nsenter, strace, tcpdump, gdb และเครื่องมือระดับต่ำอื่น ๆ

💼 การใช้งาน Docker Compose ขั้นสูง

🚀 คำสั่ง Docker Compose ระดับมืออาชีพ

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker compose up เริ่มและจัดการวงจรชีวิตของ services ที่กำหนดจากไฟล์ docker-compose.yml พร้อมความสามารถในการรันเบื้องหลัง
docker compose up -d web db

รันเฉพาะ services web และ db ในโหมด detached

docker compose up --build

rebuild อิมเมจก่อนเริ่ม services

docker compose up --remove-orphans

ลบคอนเทนเนอร์ที่ไม่ได้ถูกกำหนดไว้ในไฟล์ compose ปัจจุบัน

docker compose build สร้างอิมเมจสำหรับ services ตามที่อธิบายไว้ใน compose file พร้อมการควบคุม cache และการ build แบบขนาน
docker compose build --no-cache

rebuild อิมเมจทั้งหมดโดยไม่ใช้ cache

docker compose build --parallel

build services ทั้งหมดพร้อมกันเพื่อเร่งความเร็ว

docker compose build web

build อิมเมจเฉพาะสำหรับ service web

docker compose pull ดาวน์โหลดอิมเมจเวอร์ชันล่าสุดจาก registry สำหรับทุก services หรือ services ที่เลือก
docker compose pull

pull อิมเมจสำหรับทุก services

docker compose pull db

pull อิมเมจเฉพาะ service db

docker compose pull --ignore-pull-failures

ทำงานต่อแม้เกิด error ระหว่างการ pull

docker compose restart รีสตาร์ททุก services หรือที่เลือกโดยไม่สร้างคอนเทนเนอร์ใหม่
docker compose restart

รีสตาร์ท services ทั้งหมดในโปรเจกต์ปัจจุบัน

docker compose restart worker

รีสตาร์ทเฉพาะ service worker

docker compose restart web db

รีสตาร์ทหลาย services พร้อมกัน

docker compose exec รันคำสั่งภายใน service container ที่กำลังทำงาน พร้อมโหมด interactive ที่เลือกได้
docker compose exec db psql -U user -d database

รัน psql ภายใน service container db

docker compose exec web sh

เปิด shell ภายในคอนเทนเนอร์ web

docker compose exec api curl http://localhost:8080

รันคำสั่ง curl request จาก service container api

docker compose config ส่งออกการตั้งค่า Compose สุดท้าย โดยคำนึงถึงไฟล์และ environment variables ทั้งหมด
docker compose config

แสดงการตั้งค่าที่ merge แล้วในรูปแบบ YAML

docker compose config --services

แสดงรายการ services ทั้งหมด

docker compose config --environment

แสดง environment variables ที่ services ใช้งาน

docker compose watch รีสตาร์ท services อัตโนมัติเมื่อมีการแก้ไข source file เหมาะสำหรับการพัฒนา
docker compose watch

เริ่มการเฝ้าดูไฟล์และรีสตาร์ท services เมื่อมีการเปลี่ยนแปลง

docker compose events stream events ของ Compose: การเริ่ม หยุด และอัปเดต services
docker compose events --json

รับ events ในรูปแบบ JSON

docker compose rm ลบคอนเทนเนอร์ของ services ที่หยุดแล้ว
docker compose rm web db

ลบคอนเทนเนอร์ของ services web และ db

docker compose pause หยุดการทำงานของ services
docker compose pause api

หยุด service api

docker compose unpause ทำงานต่อ services ที่ถูกหยุด
docker compose unpause api

ทำงานต่อ service api

docker compose create สร้างคอนเทนเนอร์โดยไม่เริ่มรัน
docker compose create web db

สร้างคอนเทนเนอร์สำหรับ web และ db แต่ไม่เริ่มรัน

docker compose images แสดงรายการอิมเมจที่ services ใช้
docker compose images

แสดงอิมเมจของทุก services

docker compose top แสดง process ที่กำลังรันภายใน service containers
docker compose top web

แสดง process ภายในคอนเทนเนอร์ของ service web

🛠 แนวทางและระบบอัตโนมัติที่เป็นประโยชน์กับ Docker Compose

  • การแยกสภาพแวดล้อม (Environment Separation)
    ใช้ไฟล์ docker-compose.override.yml แยกต่างหากสำหรับ environment ต่าง ๆ — development, staging, production สิ่งนี้ช่วยแยกการตั้งค่าและหลีกเลี่ยงความขัดแย้ง
    คุณยังสามารถรวมไฟล์ config หลายไฟล์โดยใช้ flag -f:

    docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

    ใช้ไฟล์ .env ที่แตกต่าง (.env.dev, .env.prod เป็นต้น) เพื่อจัดการ environment variables

  • การเก็บ Secrets อย่างปลอดภัย
    อย่าใส่ข้อมูลสำคัญ (passwords, tokens) โดยตรงใน Compose file ให้ใช้:

    • ไฟล์ .env สำหรับ environment variables (ไฟล์ .env ไม่ถูกเข้ารหัสและไม่ควร commit ไปยัง repo สาธารณะ)
    • docker secret และ docker config สำหรับจัดการ secrets และ configs อย่างปลอดภัยใน Docker Swarm
    • external volumes สำหรับไฟล์ configs ที่มี secrets
    • ระบบจัดการ secrets ภายนอก (เช่น HashiCorp Vault, AWS Secrets Manager)

  • ลำดับการเริ่มต้นด้วย depends_on และ healthcheck
    เพื่อให้ services รอ dependencies พร้อมก่อน:

    services:
      db:
        image: postgres
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U postgres"]
          interval: 10s
          retries: 5
      api:
        image: my_api
        depends_on:
          db:
            condition: service_healthy
  • ลด Downtime ระหว่างการอัปเดต
    ก่อนอัปเดต services ให้รัน:

    docker compose pull && docker compose up -d --remove-orphans

    option -d จะรันคอนเทนเนอร์ในเบื้องหลัง และ --remove-orphans จะลบคอนเทนเนอร์ที่ไม่ถูกกำหนดไว้ใน configs
    หากต้องการหยุดและลบคอนเทนเนอร์เก่าอย่างสมบูรณ์:

    docker compose down --remove-orphans

    สิ่งนี้ทำให้มั่นใจว่าอิมเมจใหม่ถูกโหลดและคอนเทนเนอร์ที่ไม่ได้ใช้งานถูกลบโดยไม่เกิด downtime

  • Hot Code Reloading สำหรับการพัฒนา
    ใช้ volumes เพื่อติดตั้งไดเรกทอรี local เข้าในคอนเทนเนอร์ สิ่งนี้ช่วยให้โค้ดเปลี่ยนแปลงมีผลทันทีโดยไม่ต้อง rebuild อิมเมจ
    ควรระวังปัญหาสิทธิ์ไฟล์และ caching ของระบบไฟล์ โดยเฉพาะบน Windows และ macOS เพื่อลดปัญหาประสิทธิภาพ

  • Hot Code Reloading โดยไม่ใช้ Volumes (Compose 2.22+)

    develop:
      watch:
        - path: ./src
          action: sync
          target: /app
  • การบันทึก Log แบบศูนย์กลางของ Services
    เปลี่ยนเส้นทาง log ของคอนเทนเนอร์ไปยังระบบมอนิเตอร์และรวบรวม log เช่น ELK Stack, Loki, Prometheus และ Fluentd เพื่อการวิเคราะห์และแจ้งเตือน
    ใช้ Docker logging drivers (--log-driver) เพื่อเปิดใช้งานการเก็บ log แบบศูนย์กลาง
    กำหนด logging drivers สำหรับคอนเทนเนอร์ใน Compose:

    services:
      api:
        image: my_api
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "3"
  • การรีสตาร์ท Services อัตโนมัติ
    กำหนด restart policy ในไฟล์ docker-compose.yml:

    restart: unless-stopped

    นโยบายอื่น ๆ ได้แก่:

    • no — ไม่รีสตาร์ทอัตโนมัติ (ค่าเริ่มต้น)
    • always — รีสตาร์ทคอนเทนเนอร์เสมอ
    • on-failure — รีสตาร์ทเมื่อเกิดข้อผิดพลาด (อาจกำหนดจำนวน retry ได้)

    ใน production ค่า unless-stopped เป็นตัวเลือกที่เหมาะสมที่สุดเพื่อความทนทาน
    สิ่งนี้ช่วยให้ services กู้คืนอัตโนมัติหลังจากล้มเหลวหรือ host reboot

  • โปรไฟล์ของ Services
    อนุญาตให้รันเฉพาะกลุ่มของ services:

    services:
      db:
        image: postgres
        profiles: ["backend"]
      web:
        image: nginx
        profiles: ["frontend"]

    เพื่อรันเฉพาะ frontend profile:

    docker compose --profile frontend up

🐞 การดีบักและโปรไฟล์ Services ใน Docker Compose

คำสั่ง

ตัวอย่าง

คำอธิบาย

docker compose exec รันคำสั่งภายใน service ที่กำลังทำงาน เพื่อเข้าถึงคอนเทนเนอร์หรือรัน process แยก
docker compose exec web sh

เปิด shell ภายใน service container web

docker compose exec db psql -U user -d database

รันคำสั่ง psql ภายใน service container db

docker compose logs ดู log ของ service สำหรับการวินิจฉัยและมอนิเตอร์
docker compose logs -f db

ดู log ของ service db แบบเรียลไทม์

docker compose logs --tail=50 api

แสดง log 50 บรรทัดล่าสุดของ service api

docker compose logs --since=1h web

แสดง log ของ service web ใน 1 ชั่วโมงที่ผ่านมา

docker inspect ดูข้อมูลรายละเอียดเกี่ยวกับคอนเทนเนอร์ที่รัน service
docker inspect $(docker compose ps -q web)

รับ JSON ที่มีรายละเอียดของ service container web

docker container stats ติดตามการใช้ทรัพยากรของคอนเทนเนอร์ที่รัน services
docker stats $(docker compose ps -q worker)

ติดตาม CPU หน่วยความจำ และทรัพยากรอื่น ๆ ของ service container worker

docker compose run --rm รันคอนเทนเนอร์ชั่วคราวพร้อมการตั้งค่าของ service ใช้สำหรับดีบัก
docker compose run --rm web sh

เริ่มคอนเทนเนอร์แบบ one-off สำหรับ service web พร้อม shell แบบ interactive

docker container cp คัดลอกไฟล์ระหว่าง host และ container
docker cp $(docker compose ps -q db):/dump.sql ./dump.sql

คัดลอกไฟล์จาก service container db ไปยัง host

💡 เพื่อความสะดวกในการดีบัก setup แบบ multi-service ที่ซับซ้อน ใช้ docker compose run --rm เพื่อรันคอนเทนเนอร์แยกที่มี network และ volumes ที่จำเป็นโดยไม่กระทบ services หลัก

📚 แหล่งข้อมูลเพิ่มเติม

🚫 การละเว้นไฟล์ด้วย .dockerignore

เพิ่มไฟล์และโฟลเดอร์ลงใน .dockerignore ที่ไม่ควรถูกรวมในอิมเมจเพื่อลดขนาดและเร่งความเร็วในการ build:

node_modules/
*.log
.env

⚡ ทำให้คำสั่งง่ายขึ้นด้วย Aliases

คุณสามารถสร้าง alias สำหรับคำสั่งที่ใช้บ่อยเพื่อรันได้เร็วขึ้น:

alias dcu="docker compose up -d"
alias dcd="docker compose down"
alias dcb="docker compose build"

🧠 เคล็ดลับ: คำแนะนำในการใช้งาน Docker

  • อย่าพยายามจำทุกอย่าง — ใช้ docker --help หรือ docker <command> --help เพื่อดูคำสั่ง
  • ฝึกฝนอย่างสม่ำเสมอและทดลองกับโปรเจกต์ง่าย ๆ
  • ตรวจสอบขนาดอิมเมจและลบไฟล์ที่ไม่จำเป็นผ่าน .dockerignore

🌐 ลิงก์ที่เป็นประโยชน์

📘 เอกสาร Docker อย่างเป็นทางการ — คู่มือและข้อมูลอ้างอิงที่ครอบคลุมในทุกหัวข้อ:
https://docs.docker.com/

📙 ชีทโกง Docker — ชีทโกง Docker อย่างเป็นทางการ:
https://dockerlabs.collabnix.com/docker/cheatsheet/

📗 Docker Hub — อิมเมจและ registries:
https://hub.docker.com/