Skip to main content

เนื้อหาภาษาไทย / Thai content

System guide Content reviewed

Docker Network: สร้างเครือข่ายภายใน Docker

บทความนี้อธิบายถึง Docker Network ซึ่งเป็นระบบเครือข่ายเสมือนที่ช่วยให้ Container สามารถสื่อสารกันได้ โดยหลักๆ จะกล่าวถึง Bridge, Host และ Overlay Network พร้อม...

Docker Network: สร้างเครือข่ายภายใน Docker

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

Docker Network คือระบบเครือข่ายเสมือนที่ช่วยให้ Container สามารถสื่อสารกันได้ โดยที่ไม่ต้องกังวลเรื่อง IP Address หรือ Port ที่ซับซ้อน หากไม่มี Docker Network, Container แต่ละตัวจะทำงานแยกจากกันเหมือนอยู่ในคนละโลก ทำให้ไม่สามารถแลกเปลี่ยนข้อมูลหรือทำงานร่วมกันได้อย่างมีประสิทธิภาพ

ทำไมต้องใช้ Docker Network?

ลองจินตนาการถึงแอปพลิเคชัน e-commerce ที่ประกอบด้วยหลายส่วน:

  • Web Server: ทำหน้าที่รับคำขอจากผู้ใช้งานและแสดงผลหน้าเว็บไซต์
  • Database Server: ทำหน้าที่เก็บข้อมูลสินค้า, ผู้ใช้งาน, และคำสั่งซื้อ
  • Cache Server: ทำหน้าที่เก็บข้อมูลที่ใช้งานบ่อยเพื่อเพิ่มความเร็วในการตอบสนอง

หาก Container ทั้งสามนี้ไม่ได้อยู่ใน Network เดียวกัน Web Server จะไม่สามารถเข้าถึง Database Server หรือ Cache Server ได้ ทำให้แอปพลิเคชันไม่สามารถทำงานได้ตามที่คาดหวัง Docker Network เข้ามาแก้ปัญหานี้โดยการสร้างเครือข่ายเสมือนที่ Container ทั้งหมดสามารถเชื่อมต่อและสื่อสารกันได้อย่างราบรื่น

Docker Network Types

Docker มี Network Types ให้เลือกใช้งานหลายแบบ แต่ที่พบบ่อยและสำคัญมีดังนี้:

  • Bridge Network: เป็น Network Type ที่ Docker สร้างขึ้นมาโดยอัตโนมัติเมื่อเราติดตั้ง Docker Bridge Network จะสร้าง Private Network ภายใน Host Machine ทำให้ Container ที่อยู่ใน Network เดียวกันสามารถสื่อสารกันได้โดยใช้ Container Name เป็น Hostname (DNS Resolution)
  • Host Network: Container ที่ใช้ Host Network จะแชร์ Network Namespace กับ Host Machine นั่นหมายความว่า Container จะใช้ IP Address และ Port ของ Host Machine โดยตรง ข้อดีคือประสิทธิภาพสูง แต่ข้อเสียคือ Container ไม่มีความเป็นอิสระและอาจเกิด Port Conflict ได้
  • Overlay Network: ใช้สำหรับเชื่อมต่อ Container ที่อยู่บน Host Machine ต่างกัน (Docker Swarm Mode) Overlay Network สร้าง Virtual Network ที่ครอบคลุมหลาย Host Machine ทำให้ Container สามารถสื่อสารกันได้เหมือนอยู่ใน Network เดียวกัน

โดยทั่วไปแล้ว Bridge Network เป็นตัวเลือกที่ดีที่สุดสำหรับแอปพลิเคชันที่ทำงานบน Host Machine เดียวกัน ส่วน Overlay Network เหมาะสำหรับแอปพลิเคชันที่ทำงานบนหลาย Host Machine ใน Docker Swarm Mode Host Network ควรใช้ในกรณีที่ต้องการประสิทธิภาพสูงและทราบข้อจำกัดเรื่อง Port Conflict เป็นอย่างดี

การสร้าง Docker Network ด้วย Docker CLI

เราสามารถสร้าง Docker Network ได้ง่ายๆ โดยใช้ Docker CLI ดังนี้:

docker network create my-network

คำสั่งนี้จะสร้าง Bridge Network ชื่อ `my-network` เราสามารถตรวจสอบ Network ที่สร้างขึ้นได้โดยใช้คำสั่ง:

docker network ls

ผลลัพธ์ที่ได้จะแสดงรายการ Network ทั้งหมดที่มีอยู่ในระบบ รวมถึง Network ที่เราเพิ่งสร้างขึ้น

การเชื่อมต่อ Container เข้ากับ Docker Network

เมื่อเรามี Network แล้ว เราสามารถเชื่อมต่อ Container เข้ากับ Network นั้นได้โดยใช้ Option `--network` ในคำสั่ง `docker run`:

docker run -d --name my-app --network my-network my-app-image

คำสั่งนี้จะสร้าง Container ชื่อ `my-app` จาก Image `my-app-image` และเชื่อมต่อ Container เข้ากับ Network `my-network`

เรายังสามารถเชื่อมต่อ Container ที่รันอยู่แล้วเข้ากับ Network ได้โดยใช้คำสั่ง:

docker network connect my-network my-container

การสื่อสารระหว่าง Container ผ่าน Docker Network

เมื่อ Container อยู่ใน Network เดียวกัน Container สามารถสื่อสารกันได้โดยใช้ Container Name เป็น Hostname Docker จะทำการ Resolve Container Name ไปเป็น IP Address ของ Container นั้นๆ โดยอัตโนมัติ

ตัวอย่างเช่น ถ้าเรามี Container ชื่อ `web-server` และ `database-server` ซึ่งอยู่ใน Network เดียวกัน `web-server` สามารถเข้าถึง `database-server` ได้โดยใช้ URL `database-server:3306` (สมมติว่า Database Server ฟังอยู่ที่ Port 3306)

ตัวอย่าง Docker Compose:

เพื่อแสดงให้เห็นภาพรวม เราจะสร้างไฟล์ `docker-compose.yml` ง่ายๆ ที่มีสอง Service: `web` และ `db` ที่อยู่ใน Network เดียวกัน

version: "3.9"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - my-network
    depends_on:
      - db

  db:
    image: postgres:14
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydb
    networks:
      - my-network

networks:
  my-network:
    driver: bridge

ในไฟล์นี้:

  • เรากำหนด Network ชื่อ `my-network` โดยใช้ Bridge Driver
  • Service `web` (nginx) และ `db` (postgres) ถูกกำหนดให้ใช้ Network `my-network`
  • `web` ขึ้นอยู่กับ `db` ซึ่งหมายความว่า Docker Compose จะ start `db` ก่อน `web`

เมื่อเราใช้ `docker-compose up` Docker Compose จะสร้าง Network `my-network` และเชื่อมต่อ Container ทั้งสองเข้ากับ Network นั้น ทำให้ `web` สามารถเข้าถึง `db` ได้โดยใช้ Hostname `db`

Trade-offs และแนวปฏิบัติที่ดี

  • Trade-off ระหว่าง Bridge, Host, และ Overlay Networks: Bridge Network ให้ความเป็นอิสระและ Isolation ที่ดี แต่ประสิทธิภาพอาจไม่สูงเท่า Host Network Overlay Network เหมาะสำหรับ Distributed Applications แต่มีความซับซ้อนในการตั้งค่า
  • การใช้ Container Name เป็น Hostname: เป็นวิธีที่ง่ายและสะดวกในการสื่อสารระหว่าง Container แต่ควรระวังเรื่อง Container Name ที่อาจเปลี่ยนแปลงได้ในอนาคต หากต้องการความยืดหยุ่นมากขึ้น สามารถใช้ Environment Variables เพื่อกำหนด Hostname ของ Database Server
  • การสร้าง Network แยกสำหรับแต่ละ Application: ช่วยเพิ่มความปลอดภัยและความเป็นอิสระของแต่ละ Application

สรุป

Docker Network เป็นเครื่องมือสำคัญที่ช่วยให้ Container สามารถสื่อสารกันได้อย่างง่ายดายและมีประสิทธิภาพ การเลือก Network Type ที่เหมาะสมและการออกแบบ Network ที่ดีจะช่วยให้แอปพลิเคชันของเราทำงานได้อย่างราบรื่นและปลอดภัย ในบทความถัดไป เราจะไปดูเรื่อง Docker Volumes เพื่อเรียนรู้วิธีจัดการข้อมูลที่ Container สร้างขึ้น

Office.in.th Custom Service

Want to build or adapt a system from this structure?

Office.in.th designs and develops enterprise web applications, API integrations, and public- and private-sector management systems, with long-term support.

See our software development service