
หนึ่งในสิ่งที่ผู้ใช้ Docker มักสับสนคือเรื่อง Networking เมื่อรัน Container หลายตัว ทำไมบางตัวคุยกันได้ บางตัวไม่ได้ ทำไม Container เข้าถึง Internet ไม่ได้ หรือทำไม Port ที่ map ไว้ใช้งานได้จาก Host แต่ Container อื่นเข้าไม่ถึง บทความนี้จะอธิบาย Docker Network Driver ทุกประเภทพร้อมวิธีเลือกใช้ให้ถูกกับแต่ละ Scenario
Docker Networking คืออะไร
Docker มีระบบ Network เป็นของตัวเอง แยกออกจาก Network ของ Host อย่างชัดเจน แต่ละ Container สามารถเชื่อมต่อกับ Network ได้หลาย Network พร้อมกัน Docker จัดการผ่าน Network Driver ซึ่งกำหนดพฤติกรรมการสื่อสาร
หลักการ: Container ที่อยู่ใน Network เดียวกันคุยกันได้โดยตรงผ่านชื่อ Container (DNS อัตโนมัติ) ส่วน Container ต่าง Network ต้องผ่าน Port Mapping หรือเชื่อม Network เพิ่ม
ประเภท Docker Network Driver
Bridge
Network เสมือนส่วนตัวบน Host เดียว Container ในกลุ่มเดียวกันคุยกันได้ ใช้บ่อยที่สุด
Host
Container ใช้ Network Stack ของ Host โดยตรง ไม่มี NAT ความเร็วสูงสุด แต่ไม่มี Isolation
Overlay
เชื่อม Container ข้าม Host หลายเครื่องได้ ใช้กับ Docker Swarm หรือ Kubernetes
Macvlan
Container ได้รับ IP จริงในวง LAN ดูเหมือนเป็นเครื่องฟิสิคัล เหมาะกับ Network Legacy
Bridge Network — ค่าเริ่มต้น
เมื่อรัน Container โดยไม่ระบุ Network Docker จะใช้ Bridge Network ชื่อ bridge อัตโนมัติ แต่ Bridge เริ่มต้นนี้ไม่รองรับ DNS Resolution ระหว่าง Container ต้องสร้าง User-defined Bridge แทน
ข้อดีของ User-defined Bridge
- รองรับ DNS อัตโนมัติ — Container คุยกันผ่านชื่อ (ไม่ต้องรู้ IP)
- แยก Network ระหว่าง App ได้ (Isolation)
- เพิ่ม/ลบ Container ออกจาก Network ได้ตอน Runtime
- ควบคุม Subnet / Gateway ได้เอง
Host Network — ความเร็วสูงสุด
Container ใช้ Network Interface ของ Host โดยตรง ไม่มี Virtual Network Layer ทำให้ Latency ต่ำและ Throughput สูง เหมาะกับ Application ที่ต้องการ Network Performance สูง เช่น Monitoring Agent หรือ High-frequency Trading
ข้อควรระวัง: Host Network ใช้ได้บน Linux เท่านั้น บน Mac/Windows (Docker Desktop) ใช้งานได้แต่ประสิทธิภาพไม่ต่างจาก Bridge เพราะยังมี VM Layer อยู่
Overlay Network — ข้าม Host หลายเครื่อง
ใช้ใน Docker Swarm หรือ Kubernetes เพื่อให้ Container ที่รันบน Node ต่างเครื่องสื่อสารกันได้เหมือนอยู่ใน Network เดียวกัน ข้อมูลจะถูก Encapsulate ด้วย VXLAN Protocol
None Network — ปิด Network ทั้งหมด
Container ไม่มี Network Interface เลย (ยกเว้น Loopback) เหมาะสำหรับ Batch Job ที่ไม่ต้องการ Network เลย หรืองานที่ต้องการ Isolation สูงสุด
เปรียบเทียบ Docker Network Driver
| Driver | Use Case | DNS | ข้าม Host | Performance |
|---|---|---|---|---|
| bridge | Default, Local Dev, Single Host | ✅ (User-defined) | ❌ | ดี |
| host | High Performance, Monitoring | Host DNS | ❌ | ดีที่สุด |
| overlay | Swarm, Multi-host | ✅ | ✅ | ดี (VXLAN overhead) |
| macvlan | Legacy Network, Physical IP | ❌ | ❌ | ดีมาก |
| none | Batch Job, Max Isolation | ❌ | ❌ | N/A |
Docker Compose กับ Network
Docker Compose สร้าง Bridge Network ให้อัตโนมัติ Services ทุกตัวใน Compose File เดียวกันอยู่ใน Network เดียวกันโดย Default
คำสั่งจัดการ Network ที่ใช้บ่อย
แก้ปัญหา Container คุยกันไม่ได้
ปัญหาที่พบบ่อยเมื่อ Container ติดต่อกันไม่ได้:
- คนละ Network: ตรวจด้วย
docker network inspectว่า Container อยู่ Network เดียวกันหรือไม่ - ใช้ Default Bridge: Default Bridge ไม่มี DNS — ย้ายไป User-defined Bridge
- Firewall บน Host: ตรวจ
iptablesหรือufwว่า block traffic หรือไม่ - Port ไม่ได้ Expose: ต้องใช้
EXPOSEใน Dockerfile หรือ--exposeเพื่อให้ Container อื่นเห็น
ทำความเข้าใจ IP Address ใน Docker Network
เมื่อสร้าง Container บน Docker แต่ละ Container จะได้รับ IP Address ส่วนตัวภายใน Network ที่มันเชื่อมอยู่ การทำความเข้าใจโครงสร้าง IP นี้ช่วยให้แก้ปัญหา Network ได้เร็วขึ้นมาก:
- Default Bridge Network: Docker กำหนด IP ใน Range
172.17.0.0/16โดย Host (Bridge Interface) จะได้172.17.0.1และ Container แรกจะได้172.17.0.2ตามลำดับ - User-defined Bridge: คุณสามารถกำหนด Subnet เองได้ เช่น
192.168.100.0/24เพื่อหลีกเลี่ยงการชนกับวง LAN จริง - IP ที่ได้รับ อาจเปลี่ยนทุกครั้งที่ restart: นี่คือเหตุผลที่ควรใช้ชื่อ Container แทน IP เสมอในการ connect ระหว่าง Service
- ตรวจสอบ IP ของ Container: ใช้
docker inspect <ชื่อ container> | grep IPAddressหรือdocker network inspect <network>
การกำหนด Static IP ช่วยให้ Config บางอย่างที่ต้องการ IP แน่นอน เช่น Firewall Rule หรือ External Service ที่ต้อง Whitelist IP ทำงานได้ถูกต้องแม้ Container ถูก restart
วิธีวางแผน Network Architecture สำหรับ Application บน VPS
ก่อนที่จะ Deploy Application จริงบน VPS ควรวางแผน Network Architecture ให้ดีตั้งแต่ต้น เพราะการแก้ Network ทีหลังเมื่อ Application รันอยู่แล้วจะยุ่งยากมากกว่า หลักการออกแบบที่ดี:
- แยก Network ตามหน้าที่: สร้าง Network แยกสำหรับ Frontend, Backend และ Database เพื่อให้แต่ละ Tier สื่อสารได้เฉพาะกับ Tier ที่จำเป็น เช่น Database ไม่ควรเข้าถึงได้จาก Container Frontend โดยตรง
- ใช้ชื่อ Network ที่สื่อความหมาย: ตั้งชื่อ Network แบบ
myapp-frontend,myapp-backendแทนชื่อทั่วไป เพื่อให้ Debug และ Audit ง่ายขึ้น - บันทึก Network Diagram: วาด Diagram แสดงว่า Container ไหนอยู่ Network ไหน Port ไหนที่เปิดออกภายนอก จะช่วยทีมแก้ปัญหาได้รวดเร็วในอนาคต
- ทดสอบ Isolation: หลัง Deploy ตรวจสอบว่า Container ที่ไม่ควรคุยกันไม่สามารถ ping กันได้จริงด้วย
docker exec - Avoid IP Conflict: ตรวจ Subnet ที่ Host ใช้อยู่แล้วก่อนกำหนด Docker Subnet ใหม่ เพื่อหลีกเลี่ยงการชนกัน
ตัวอย่าง Network Architecture แบบ Three-Tier สำหรับ Web Application ขนาดกลาง:
ด้วย Architecture นี้ ถ้า Nginx ถูก Hack ผู้โจมตีจะสามารถเข้าถึงได้เฉพาะ Backend Network ไม่สามารถเข้าถึง MySQL โดยตรงได้ เพราะ MySQL อยู่คนละ Network กับ Nginx การออกแบบแบบ Defense-in-Depth ลักษณะนี้ทำให้แม้ Service ชั้นนอกถูก Compromise ข้อมูลสำคัญในฐานข้อมูลยังได้รับการปกป้องจากชั้น Network ภายใน ซึ่งเป็น Best Practice ที่ทีม Security แนะนำสำหรับทุก Application ที่ Deploy บน Production VPS
ความปลอดภัยของ Docker Network บน VPS
การตั้งค่า Network ให้ถูกต้องเป็นส่วนสำคัญของการ Hardening ระบบบน VPS ข้อแนะนำด้านความปลอดภัยที่ควรปฏิบัติ:
- ใช้ Internal Network สำหรับ Database: ตั้ง
internal: trueใน Compose เพื่อตัด Internet จาก Container ที่ไม่จำเป็นต้องเข้าถึงภายนอก เช่น MySQL หรือ Redis - จำกัด Port Binding: ใช้
127.0.0.1:3306:3306แทน3306:3306เพื่อให้ Port ถูก Bind เฉพาะ localhost ไม่เปิดสู่ภายนอก - ไม่ Expose Port ที่ไม่จำเป็น: Expose เฉพาะ Port ที่ต้องการให้ภายนอกเข้าถึงจริงๆ
- ตรวจ iptables อย่างสม่ำเสมอ: Docker ปรับ iptables อัตโนมัติ อาจทำให้ ufw ที่ตั้งไว้ถูก bypass ได้
Macvlan Network — กรณีใช้งาน Legacy System
Macvlan เหมาะสำหรับสถานการณ์ที่ Container ต้องได้รับ IP จริงในวง LAN เช่น ต้องการให้ Container ดูเหมือนเป็นเครื่องใหม่อีกเครื่องบน Network เดียวกัน สถานการณ์ที่นิยมใช้:
- ระบบ Legacy ที่ต้องการ IP เฉพาะแบบ Hardcode
- Application ที่ต้องใช้ Multicast หรือ Broadcast
- การทำ Network Monitoring ที่ต้องการ Interface จริง
- ระบบ DHCP Server ที่ต้องอยู่ใน LAN จริง
ข้อควรระวัง Macvlan: Host และ Container ใน Macvlan Network เดียวกันสื่อสารกันโดยตรงไม่ได้ (เป็นข้อจำกัดของ Linux Kernel) ต้องสร้าง Macvlan Interface เพิ่มบน Host เองหากต้องการ
Docker Network กับ Docker Swarm — ขยายระบบข้าม Node
เมื่อธุรกิจเติบโตและ VPS เครื่องเดียวไม่เพียงพอ Docker Swarm ช่วยให้ขยาย Container ไปรันบน Node หลายเครื่องได้ โดย Overlay Network จะเชื่อม Container ทุกตัวเข้าด้วยกันอย่างโปร่งใส:
| Scenario | Network Driver | เหตุผล |
|---|---|---|
| Web App + DB บน VPS เดียว | User-defined Bridge | DNS อัตโนมัติ, Isolation ดี |
| Monitoring Agent | Host | ต้องเข้าถึง Host Network Stats โดยตรง |
| Microservices หลาย VPS | Overlay | เชื่อม Container ข้าม Node ได้ทันที |
| ระบบ Legacy ต้องการ IP จริง | Macvlan | Container ได้ IP ใน LAN จริง |
VPS สำหรับรัน Docker มีที่ AsiaGB
VPS AsiaGB รองรับ Docker และ Docker Compose เต็มรูปแบบ Root Access ตั้งค่า Network ได้อิสระ เริ่มต้น 500 บาท/เดือน
ดูแพ็กเกจ VPS