เมื่อรัน Container หลายตัวพร้อมกัน หนึ่งในคำถามที่พบบ่อยคือ “Container แต่ละตัวสื่อสารกันอย่างไร?” และ “ทำไม Container บางตัวถึงเข้าถึงอินเทอร์เน็ตได้ แต่บางตัวไม่ได้?” คำตอบอยู่ที่ Docker Network ครับ
Docker Network คืออะไร?
Docker Network คือระบบเครือข่ายเสมือนที่ Docker สร้างขึ้นเพื่อให้ Container สื่อสารกันเองและกับโลกภายนอก เมื่อติดตั้ง Docker จะมี Network สำเร็จรูปมาให้ 3 แบบ:
docker network ls
NETWORK ID NAME DRIVER SCOPE
xxxxxxxx bridge bridge local
xxxxxxxx host host local
xxxxxxxx none null local
1. Bridge Network (ค่าเริ่มต้น)
Bridge คือ Network ที่ Docker ใช้เป็นค่าเริ่มต้นเมื่อรัน Container โดยไม่ระบุ Network เฉพาะ Container ใน Bridge Network เดียวกันสามารถคุยกันได้ผ่าน IP Address แต่จะถูกแยกออกจาก Host Network
วิธีใช้งาน Bridge Network
# รัน Container บน Bridge Network (ค่า default)
docker run -d --name web nginx
# ดู IP ของ Container
docker inspect web | grep IPAddress
Custom Bridge Network (แนะนำ)
การสร้าง Bridge Network เองมีข้อดีกว่าใช้ default bridge คือ Container สามารถเรียกกันด้วย ชื่อ แทน IP Address ได้เลย (DNS อัตโนมัติ)
# สร้าง Custom Bridge Network
docker network create my-network
# รัน Container บน Network นี้
docker run -d --name db --network my-network mysql:8.0
docker run -d --name app --network my-network my-app
# ตอนนี้ Container "app" สามารถ connect ถึง "db" ด้วยชื่อได้เลย
# เช่น mysql://db:3306
2. Host Network
Container ที่ใช้ Host Network จะ “แชร์” Network Interface กับ Host โดยตรง ไม่มีการแยก Network ดังนั้นถ้า Container รัน Port 80 ก็จะเป็น Port 80 ของ Host ทันที โดยไม่ต้อง Port Mapping
docker run -d --network host nginx
เหมาะสำหรับ: งานที่ต้องการ Performance Network สูงสุด หรือต้องการ Monitor Network Traffic ของ Host
⚠️ ข้อเสีย: ไม่มี Network Isolation — Container เข้าถึง Network ของ Host ได้ทั้งหมด ใช้เฉพาะเมื่อจำเป็นจริงๆ
3. None Network
Container ที่ใช้ None Network จะถูกตัดการเชื่อมต่อทุกอย่าง ไม่มี Network Interface ยกเว้น Loopback (localhost) เหมาะสำหรับ Container ที่ไม่ต้องการ Network เลย เช่น งานประมวลผลข้อมูลล้วนๆ
docker run -d --network none my-isolated-task
เปรียบเทียบ 3 แบบ
| Network | Isolation | ติดต่อ Container อื่น | เข้าถึง Internet | เหมาะกับ |
|---|---|---|---|---|
| Bridge | ✅ มี | ✅ ได้ (same network) | ✅ ได้ | งานทั่วไป |
| Host | ❌ ไม่มี | ✅ ได้ | ✅ ได้ | High performance |
| None | ✅ สูงสุด | ❌ ไม่ได้ | ❌ ไม่ได้ | Isolated task |
คำสั่ง Network ที่ใช้บ่อย
# ดู Network ทั้งหมด
docker network ls
# สร้าง Network ใหม่
docker network create my-network
# ดูรายละเอียด Network
docker network inspect my-network
# เชื่อม Container เข้า Network ที่มีอยู่
docker network connect my-network my-container
# ถอด Container ออกจาก Network
docker network disconnect my-network my-container
# ลบ Network ที่ไม่ใช้
docker network rm my-network
docker network prune
ตัวอย่าง: Web App + Database บน Custom Network
นี่คือรูปแบบที่ใช้บ่อยในงานจริง — รัน App และ Database บน Network เดียวกัน โดยเปิดเฉพาะ Port ที่จำเป็นสู่ภายนอก:
# สร้าง Network
docker network create app-network
# รัน Database (ไม่ต้อง expose port ออกนอก)
docker run -d \
--name mysql-db \
--network app-network \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=mydb \
mysql:8.0
# รัน Web App (expose port 80 ออกนอก)
docker run -d \
--name web-app \
--network app-network \
-p 80:80 \
-e DB_HOST=mysql-db \
my-web-app
Web App เรียก Database ได้โดยใช้ชื่อ mysql-db โดยตรง ส่วน Database ไม่ถูก expose ออกสู่ภายนอกเลย ทำให้ปลอดภัยกว่า
สรุป
ในงานจริงส่วนใหญ่จะใช้ Custom Bridge Network เพราะได้ทั้ง Isolation และ DNS Resolution อัตโนมัติ ส่วน Host และ None มีกรณีใช้งานเฉพาะทาง บทความถัดไปจะพูดถึง Docker Volume — วิธีเก็บข้อมูลให้อยู่รอดแม้ Container จะถูกลบไปแล้ว

