ติดตั้ง 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-stoppedmkdir -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หรือUpcurl http://127.0.0.1:8080ต้องได้ข้อความ Hello from Docker Composesudo 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 ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น
- 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
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี


