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

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

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

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 ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

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

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