ติดตั้ง Docker และ Docker Compose บน Ubuntu

ติดตั้ง Docker Engine และ Docker Compose จาก Repository ทางการของ Docker บน Ubuntu พร้อมรันคอนเทนเนอร์แรกและเข้าใจเรื่อง Firewall ที่ต้องระวัง

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 10 นาที เข้าชม 15 ครั้ง

แชร์FacebookXLINELinkedIn
ติดตั้ง Docker และ Docker Compose บน Ubuntu
Docker Compose — ติดตั้ง Docker และ Docker Compose บน Ubuntu
ติดตั้ง Docker และ Docker Compose บน Ubuntu

คำตอบสั้น ๆ: ติดตั้ง Docker Engine และ Docker Compose จาก Repository ทางการของ Docker บน Ubuntu พร้อมรันคอนเทนเนอร์แรกและเข้าใจเรื่อง Firewall ที่ต้องระวัง

คู่มือนี้อธิบาย Docker Compose ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

Docker ช่วยให้รันแอปพลิเคชันในคอนเทนเนอร์ที่แยกจากระบบหลัก ทำให้ติดตั้ง ย้าย และอัปเดตบริการต่าง ๆ ได้ง่าย ส่วน Docker Compose ใช้กำหนดหลายคอนเทนเนอร์ในไฟล์เดียว เช่น เว็บแอปคู่กับฐานข้อมูล แล้วสั่งเปิดหรือปิดพร้อมกันด้วยคำสั่งเดียว หากยังไม่แน่ใจว่าควรใช้ Docker หรือ Kubernetes อ่านเพิ่มได้ที่ 5 ความแตกต่างสำคัญระหว่าง Docker และ Kubernetes

คู่มือนี้ติดตั้งจาก Repository ทางการของ Docker ซึ่งได้เวอร์ชันใหม่กว่าแพ็กเกจ docker.io ของ Ubuntu และได้ Docker Compose เวอร์ชัน 2 มาในรูปแบบ Plugin ใช้งานด้วยคำสั่ง docker compose (มีช่องว่าง ไม่ใช่ขีด)

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

  • เซิร์ฟเวอร์ Ubuntu 22.04 หรือ 24.04 แบบ 64-bit
  • ผู้ใช้ที่มีสิทธิ์ sudo
  • พื้นที่ดิสก์ว่างพอสำหรับ Image และข้อมูลของคอนเทนเนอร์ (Image หนึ่งตัวมักมีขนาดหลายร้อย MB)

ขั้นตอนที่ 1: ถอนแพ็กเกจเก่าที่อาจชนกัน

หากเคยติดตั้ง Docker จาก Repository ของ Ubuntu มาก่อน ให้ถอนออกก่อน คำสั่งนี้ไม่ลบข้อมูลใน /var/lib/docker ถ้าไม่เคยติดตั้งจะแสดงว่าไม่พบแพ็กเกจ ซึ่งไม่เป็นปัญหา

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove -y $pkg; done

ขั้นตอนที่ 2: เพิ่ม Repository ทางการของ Docker

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

จากนั้นเพิ่มแหล่งแพ็กเกจ คำสั่งนี้อ่านชื่อรุ่นของ Ubuntu (jammy หรือ noble) และสถาปัตยกรรมของเครื่องให้อัตโนมัติ

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

ในผลลัพธ์ของ apt-get update ควรเห็นบรรทัดที่มี download.docker.com โดยไม่มี Error เรื่อง GPG

ขั้นตอนที่ 3: ติดตั้ง Docker Engine และ Compose Plugin

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

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

sudo systemctl status docker
sudo docker run hello-world

คำสั่งที่สองจะดาวน์โหลด Image ทดสอบและพิมพ์ข้อความ Hello from Docker! แสดงว่า Docker Engine ทำงานถูกต้อง

ขั้นตอนที่ 4: ใช้งาน Docker โดยไม่ต้องพิมพ์ sudo (ทางเลือก)

sudo usermod -aG docker $USER

ออกจาก SSH แล้วเข้าใหม่ให้สิทธิ์กลุ่มมีผล จากนั้นทดสอบด้วย docker ps

หมายเหตุ: ผู้ใช้ที่อยู่ในกลุ่ม docker มีสิทธิ์เทียบเท่า root บนเครื่อง เพราะสามารถเมานต์ไฟล์ระบบเข้าไปในคอนเทนเนอร์ได้ ควรเพิ่มเฉพาะผู้ใช้ที่ไว้วางใจเท่านั้น

ขั้นตอนที่ 5: รันบริการด้วย Docker Compose

ตรวจเวอร์ชันของ Compose

docker compose version

จะได้ผลลัพธ์เช่น Docker Compose version v2.x.x ต่อไปสร้างโฟลเดอร์โปรเจกต์และไฟล์ compose.yaml

mkdir -p ~/myweb && cd ~/myweb
nano compose.yaml

ตัวอย่างนี้รัน Nginx และเปิดให้เข้าถึงได้เฉพาะจากเครื่องเซิร์ฟเวอร์เองที่พอร์ต 8080

services:
  web:
    image: nginx:stable
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped
mkdir -p html
echo '<h1>Hello from Docker Compose</h1>' > html/index.html
docker compose up -d

คำสั่งที่ใช้บ่อยในโฟลเดอร์โปรเจกต์

คำสั่งหน้าที่
docker compose psดูสถานะคอนเทนเนอร์ของโปรเจกต์
docker compose logs -fดู Log แบบต่อเนื่อง กด Ctrl+C เพื่อออก
docker compose pull && docker compose up -dดึง Image ใหม่และสร้างคอนเทนเนอร์ใหม่
docker compose downหยุดและลบคอนเทนเนอร์ (ข้อมูลใน Volume ยังอยู่)

restart: unless-stopped ทำให้คอนเทนเนอร์เริ่มใหม่เองหลังรีบูตเครื่อง ยกเว้นกรณีที่สั่งหยุดไว้เอง

เรื่องสำคัญ: Docker ข้าม UFW

เมื่อ Publish พอร์ตแบบ "8080:80" โดยไม่ระบุ IP Docker จะเพิ่มกฎ iptables ของตัวเองซึ่งทำงานก่อนกฎของ UFW ผลคือพอร์ตนั้นเปิดสู่อินเทอร์เน็ตทันที แม้ ufw status จะไม่ได้อนุญาตไว้ วิธีป้องกันที่ง่ายที่สุดคือ

  • ผูกพอร์ตกับ 127.0.0.1 อย่างในตัวอย่าง แล้วให้ Nginx บนเครื่องทำ Reverse Proxy ไปยังพอร์ตนั้น (ดูตัวอย่างการตั้งค่า Proxy ได้ที่ รันแอป Node.js ด้วย PM2 และ Nginx Reverse Proxy)
  • ไม่ Publish พอร์ตของฐานข้อมูลเลย ให้คอนเทนเนอร์คุยกันผ่าน Network ภายในที่ Compose สร้างให้ โดยอ้างชื่อ Service เช่น db:3306

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

  • docker compose ps ต้องแสดงสถานะ running หรือ Up
  • curl http://127.0.0.1:8080 ต้องได้ข้อความ Hello from Docker Compose
  • sudo ss -tlnp | grep 8080 ต้องเห็นว่าฟังอยู่ที่ 127.0.0.1:8080 ไม่ใช่ 0.0.0.0:8080
  • หลังรีบูตเครื่อง (sudo reboot) คอนเทนเนอร์ต้องกลับมาทำงานเอง

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

permission denied while trying to connect to the Docker daemon socket

ผู้ใช้ยังไม่อยู่ในกลุ่ม docker หรือเพิ่มแล้วแต่ยังไม่ได้ Login ใหม่ ตรวจด้วยคำสั่ง groups หากยังไม่เห็นคำว่า docker ให้ออกจาก SSH แล้วเข้าใหม่

docker-compose: command not found

คำสั่ง docker-compose แบบมีขีดเป็น Compose เวอร์ชัน 1 ที่เลิกพัฒนาแล้ว ให้ใช้ docker compose แทน ไฟล์ docker-compose.yml เดิมยังใช้ได้โดยไม่ต้องเปลี่ยนชื่อ

port is already allocated หรือ address already in use

มีโปรแกรมอื่นใช้พอร์ตฝั่งเครื่องอยู่ ตรวจด้วย sudo ss -tlnp | grep :8080 แล้วเปลี่ยนพอร์ตฝั่งซ้ายในไฟล์ Compose เช่น "127.0.0.1:8081:80"

ดิสก์เต็มเพราะ Image และ Log สะสม

ดูพื้นที่ที่ Docker ใช้ด้วย docker system df และลบ Image หรือคอนเทนเนอร์ที่ไม่ใช้แล้วด้วย docker system prune (คำสั่งนี้ลบคอนเทนเนอร์ที่หยุดอยู่ทั้งหมด ตรวจก่อนยืนยัน และจะไม่ลบ Volume ถ้าไม่ใส่ --volumes) ดูวิธีหาไฟล์ใหญ่อื่น ๆ ได้ที่ ดิสก์เต็ม: ตรวจสอบพื้นที่และหาไฟล์ขนาดใหญ่บน Linux

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน Support ของ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ ขั้นตอนที่ทำไปแล้ว และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

อ่านเพิ่มเติมเกี่ยวกับ Docker Compose

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน