跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

Networks: เชื่อมต่อ Container ใน Docker

บทความนี้กล่าวถึง Docker Networks ซึ่งเป็นกลไกสำคัญในการเชื่อมต่อ Container ที่ปกติจะถูกแยกจากกัน เพื่อให้สามารถสื่อสารและทำงานร่วมกันได้ เช่น ในสถาปัตยกรรม Mic...

Networks: เชื่อมต่อ Container ใน Docker

ในบทที่แล้ว เราได้เรียนรู้เรื่อง Volumes ไปแล้ว ซึ่งเป็นกลไกสำคัญในการจัดการข้อมูลแบบ Persistent ใน Docker คราวนี้เราจะมาดูเรื่อง Networks กันบ้างครับ ซึ่งเป็นเรื่องที่สำคัญไม่แพ้กัน เพราะ Container ที่รันอยู่โดยปกติแล้วจะถูกแยกออกจากกัน (Isolated) เพื่อความปลอดภัยและความเสถียร แต่ในหลายๆ สถานการณ์ เราจำเป็นต้องให้ Container เหล่านี้สื่อสารกันได้ เช่น เว็บแอปพลิเคชันที่ต้องเชื่อมต่อกับฐานข้อมูล หรือ Microservices ที่ต้องทำงานร่วมกัน Networks ใน Docker นี่แหละครับ คือเครื่องมือที่ช่วยให้เราทำสิ่งนั้นได้

ลองจินตนาการว่า Container แต่ละตัวเป็นเครื่องคอมพิวเตอร์ที่อยู่ในคนละวง LAN กัน ถ้าไม่มีการเชื่อมต่อ Network ที่เหมาะสม คอมพิวเตอร์เหล่านั้นก็จะไม่สามารถสื่อสารกันได้เลย Docker Network ก็เหมือนกับ Switch หรือ Router ที่ช่วยให้ Container เหล่านั้นมองเห็นและคุยกันได้ครับ

ทำไมต้องมี Docker Networks?

ก่อนที่เราจะลงรายละเอียดเกี่ยวกับประเภทของ Networks เรามาดูกันก่อนว่าทำไมนักพัฒนา PHP ถึงต้องสนใจเรื่องนี้:

  • การจัดการ Microservices: แอปพลิเคชันสมัยใหม่มักถูกสร้างขึ้นด้วยสถาปัตยกรรม Microservices ซึ่งประกอบด้วยบริการขนาดเล็กจำนวนมากที่ทำงานร่วมกัน Docker Networks ช่วยให้เราเชื่อมต่อบริการเหล่านี้ได้อย่างง่ายดาย
  • การเชื่อมต่อกับฐานข้อมูล: แอปพลิเคชัน PHP ส่วนใหญ่มักจะต้องเชื่อมต่อกับฐานข้อมูล เช่น MySQL หรือ PostgreSQL Docker Networks ช่วยให้เราสร้าง Network เฉพาะสำหรับแอปพลิเคชันและฐานข้อมูล เพื่อความปลอดภัยและความเป็นส่วนตัว
  • การทดสอบและการพัฒนา: Docker Networks ช่วยให้เราสร้างสภาพแวดล้อมการพัฒนาที่จำลองสภาพแวดล้อมจริงได้อย่างแม่นยำ ทำให้การทดสอบและการดีบักง่ายขึ้น

ประเภทของ Docker Networks

Docker มี Network Driver หลายประเภทให้เราเลือกใช้ แต่ที่สำคัญและใช้งานบ่อยมีอยู่ 3 ประเภทหลักๆ ครับ:

  1. Bridge Network
  2. Host Network
  3. Overlay Network

1. Bridge Network

Bridge Network เป็น Network Driver ที่ Docker สร้างให้โดยอัตโนมัติเมื่อเราติดตั้ง Docker ครับ Network นี้มีชื่อว่า bridge หรือ docker0 (ชื่อเก่า) และเป็น default network ที่ Container จะถูกเชื่อมต่อด้วย หากเราไม่ได้ระบุ Network อื่น

หลักการทำงาน: Bridge Network สร้าง Virtual Network Interface บน Host Machine และ Container แต่ละตัวจะได้รับการ assign IP Address ใน Subnet เดียวกัน Docker จะใช้ NAT (Network Address Translation) เพื่อให้ Container สามารถเข้าถึงอินเทอร์เน็ตได้

ข้อดี:

  • ใช้งานง่าย: เป็น default network ที่ Docker สร้างให้
  • Isolated: Container จะถูกแยกออกจาก Host Machine และ Network อื่นๆ

ข้อเสีย:

  • Performance: อาจมี overhead เล็กน้อยเนื่องจาก NAT
  • Port Mapping: ต้องใช้ Port Mapping (-p option) เพื่อ expose ports ของ Container ไปยัง Host Machine หรือ Network ภายนอก

ตัวอย่างการใช้งาน:

สมมติว่าเรามี Container ที่รันเว็บแอปพลิเคชัน PHP บน Port 80 และเราต้องการเข้าถึงเว็บแอปพลิเคชันนี้จาก Host Machine เราจะต้องใช้ Port Mapping:

docker run -d -p 8080:80 my-php-app

คำสั่งนี้จะ map Port 80 ของ Container ไปยัง Port 8080 ของ Host Machine ดังนั้นเราสามารถเข้าถึงเว็บแอปพลิเคชันได้โดยการเปิด Browser และไปที่ http://localhost:8080

เหตุผลเชิงออกแบบ (Design Trade-offs): Bridge Network เหมาะสำหรับการใช้งานทั่วไปที่ต้องการความสะดวกและง่ายในการเริ่มต้น แต่ถ้าต้องการ Performance ที่ดีกว่า หรือต้องการ expose ports ของ Container โดยไม่ต้องใช้ Port Mapping อาจจะต้องพิจารณา Network Driver ประเภทอื่น

2. Host Network

Host Network เป็น Network Driver ที่ Container จะใช้ Network Interface ของ Host Machine โดยตรง

หลักการทำงาน: Container จะ share Network Namespace กับ Host Machine นั่นหมายความว่า Container จะใช้ IP Address และ Network Interface เดียวกันกับ Host Machine

ข้อดี:

  • Performance: มี Performance ที่ดีที่สุด เนื่องจากไม่มี NAT หรือ Virtualization Overhead
  • ไม่ต้องใช้ Port Mapping: Container สามารถ expose ports ได้โดยตรง โดยไม่ต้องใช้ Port Mapping

ข้อเสีย:

  • Security: Container จะ share Network Namespace กับ Host Machine ซึ่งอาจมีความเสี่ยงด้านความปลอดภัย
  • Port Conflicts: Container อาจเกิด Port Conflicts กับ Processes อื่นๆ ที่รันอยู่บน Host Machine
  • Limited Isolation: Container จะถูก isolate น้อยกว่า Bridge Network

ตัวอย่างการใช้งาน:

เราสามารถใช้ Host Network ได้โดยการระบุ --network host option ตอน run Container:

docker run -d --network host my-php-app

ถ้าเว็บแอปพลิเคชัน PHP ของเรารันบน Port 80 ใน Container เราจะสามารถเข้าถึงเว็บแอปพลิเคชันได้โดยการเปิด Browser และไปที่ http://localhost โดยไม่ต้องใช้ Port Mapping

เหตุผลเชิงออกแบบ (Design Trade-offs): Host Network เหมาะสำหรับกรณีที่เราต้องการ Performance ที่ดีที่สุด และมั่นใจว่าไม่มี Port Conflicts หรือความเสี่ยงด้านความปลอดภัย แต่ถ้าต้องการ Isolation ที่ดีกว่า ควรหลีกเลี่ยงการใช้ Host Network

3. Overlay Network

Overlay Network เป็น Network Driver ที่ใช้สำหรับการเชื่อมต่อ Container ที่รันอยู่บน Host Machines หลายเครื่อง (Multi-Host Environment) โดยเฉพาะอย่างยิ่งใน Docker Swarm หรือ Kubernetes

หลักการทำงาน: Overlay Network สร้าง Virtual Network ที่ครอบคลุม Host Machines หลายเครื่อง Container ที่อยู่ใน Overlay Network เดียวกันจะสามารถสื่อสารกันได้โดยไม่ต้องกังวลว่า Container เหล่านั้นจะรันอยู่บน Host Machine ตัวไหน

ข้อดี:

  • Multi-Host Support: รองรับการเชื่อมต่อ Container บน Host Machines หลายเครื่อง
  • Service Discovery: มีกลไก Service Discovery ในตัว ทำให้ Container สามารถค้นหาและเชื่อมต่อกับ Services อื่นๆ ได้ง่าย
  • Scalability: รองรับการ Scale แอปพลิเคชันได้อย่างง่ายดาย

ข้อเสีย:

  • Complexity: มีความซับซ้อนมากกว่า Bridge Network และ Host Network
  • Overhead: อาจมี Overhead เล็กน้อยเนื่องจาก Virtual Network

ตัวอย่างการใช้งาน:

ก่อนที่เราจะสร้าง Overlay Network ได้ เราต้องมี Docker Swarm Cluster ก่อน (ซึ่งอยู่นอกเหนือขอบเขตของบทเรียนนี้) หลังจากนั้นเราสามารถสร้าง Overlay Network ได้โดยใช้คำสั่ง:

docker network create --driver overlay my-overlay-network

แล้วเราก็สามารถ run Container และเชื่อมต่อเข้ากับ Overlay Network ได้:

docker service create --name my-php-app --network my-overlay-network my-php-app-image

เหตุผลเชิงออกแบบ (Design Trade-offs): Overlay Network เหมาะสำหรับ Microservices Architecture ที่รันอยู่บน Multi-Host Environment แต่ถ้าแอปพลิเคชันของเรารันอยู่บน Host Machine เพียงเครื่องเดียว Bridge Network ก็เพียงพอแล้ว

แนวปฏิบัติที่ดี (Best Practices)

ต่อไปนี้เป็นแนวปฏิบัติที่ดีสำหรับการใช้งาน Docker Networks ใน PHP Development:

  • สร้าง Custom Network: แทนที่จะใช้ default Bridge Network ควรสร้าง Custom Network สำหรับแต่ละแอปพลิเคชัน เพื่อความปลอดภัยและความเป็นส่วนตัว
  • ใช้ DNS Service Discovery: ใช้ Docker's built-in DNS Service Discovery เพื่อให้ Container สามารถค้นหาและเชื่อมต่อกับ Services อื่นๆ ได้โดยใช้ชื่อ Service แทน IP Address
  • จำกัดการ Expose Ports: Expose Ports ของ Container เฉพาะที่จำเป็นเท่านั้น เพื่อลดความเสี่ยงด้านความปลอดภัย
  • เลือก Network Driver ที่เหมาะสม: เลือก Network Driver ที่เหมาะสมกับความต้องการและสภาพแวดล้อมของแอปพลิเคชัน

สรุป

Docker Networks เป็นเครื่องมือที่สำคัญสำหรับนักพัฒนา PHP ที่ต้องการสร้างแอปพลิเคชันที่ทำงานร่วมกันได้อย่างมีประสิทธิภาพ ไม่ว่าจะเป็นการจัดการ Microservices การเชื่อมต่อกับฐานข้อมูล หรือการสร้างสภาพแวดล้อมการพัฒนาที่จำลองสภาพแวดล้อมจริง การเข้าใจหลักการทำงานและประเภทของ Docker Networks จะช่วยให้เราออกแบบและ Deploy แอปพลิเคชัน PHP ได้อย่างมีประสิทธิภาพมากขึ้น

ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ Best Practices สำหรับ Docker ใน PHP Development กันครับ ซึ่งจะเป็นการรวบรวมเทคนิคและคำแนะนำต่างๆ เพื่อให้เราใช้งาน Docker ได้อย่างเต็มประสิทธิภาพ

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务