Skip to main content

Docker Compose Networking

การจัดการเครือข่ายใน Docker Compose

Docker Compose ช่วยให้คุณสามารถจัดการหลายๆ container ที่เชื่อมต่อกันเป็นแอปพลิเคชันเดียวได้อย่างง่ายดาย ผ่านการกำหนดในไฟล์ docker-compose.yml. เมื่อคุณใช้งาน Docker Compose, ทุกๆ container ที่รันจากไฟล์ Compose จะถูกเชื่อมต่อใน network เดียวกันโดยอัตโนมัติ หรือคุณสามารถกำหนดเครือข่าย (network) เองได้ตามต้องการเพื่อควบคุมการสื่อสารระหว่าง container.

Network Modes ใน Docker Compose

Docker Compose รองรับหลายโหมดเครือข่ายที่ช่วยให้คุณสามารถกำหนดรูปแบบการเชื่อมต่อระหว่าง container ได้

1. Bridge Network (Default)

เมื่อคุณสร้าง container ด้วย Docker Compose โดยไม่ได้กำหนดเครือข่ายเอง, Docker Compose จะเชื่อมต่อ container ทั้งหมดที่รันในโปรเจกต์นั้นๆ ไปยัง bridge network ที่ชื่อเดียวกัน (ซึ่งเป็นค่า default). Container ใน bridge network สามารถสื่อสารกันได้ แต่ไม่สามารถสื่อสารกับ container จากโปรเจกต์อื่นๆ ได้.

2. Host Network

การใช้ host network หมายความว่า container จะใช้เครือข่ายของโฮสต์โดยตรง. การตั้งค่าเครือข่ายนี้จะช่วยให้ container สามารถใช้พอร์ตของโฮสต์ได้เลย แต่จะทำให้ container ไม่มีการแยกเครือข่ายจากโฮสต์.

3. None Network

หากคุณต้องการให้ container ไม่มีการเชื่อมต่อกับเครือข่ายใดๆ เลย, คุณสามารถเลือกใช้ mode none. ในโหมดนี้, container จะไม่มีการเชื่อมต่อเครือข่ายภายนอก

4. Custom Networks

Docker Compose ยังรองรับการสร้าง custom networks ซึ่งคุณสามารถกำหนดรูปแบบการเชื่อมต่อระหว่าง container ได้เอง รวมถึงการตั้งค่าการกำหนด IP address, driver ที่ใช้ และ options อื่นๆ เพื่อควบคุมการทำงานของเครือข่าย.

การสร้างและกำหนดเครือข่ายใน Docker Compose

การสร้างเครือข่ายใน Docker Compose สามารถทำได้โดยการกำหนดในไฟล์ docker-compose.yml. ตัวอย่างนี้จะแสดงวิธีการสร้างและกำหนดเครือข่ายแบบกำหนดเอง (custom network) ในไฟล์ Compose.

ตัวอย่างการกำหนดเครือข่ายใน docker-compose.yml

version: '3'

services:
web:
image: nginx
networks:
- frontend
- backend

app:
image: my-app
networks:
- backend

db:
image: postgres
networks:
- backend

networks:
frontend:
driver: bridge
backend:
driver: bridge

ในตัวอย่างนี้:

  • เรากำหนดสองเครือข่าย (networks): frontend และ backend
  • Container web จะเชื่อมต่อกับเครือข่ายทั้งสอง (frontend และ backend)
  • Container app และ db จะเชื่อมต่อกับเครือข่าย backend เท่านั้น
  • ทั้ง frontend และ backend ใช้ bridge driver ซึ่งเป็นค่า default สำหรับ Docker networks

วิธีการใช้งานและทดสอบเครือข่ายใน Docker Compose

1. การทดสอบการเชื่อมต่อระหว่าง container

เมื่อคุณรัน docker-compose up, container ที่เชื่อมต่อกับเครือข่ายเดียวกันจะสามารถสื่อสารกันได้ผ่านชื่อบริการในไฟล์ Compose. ตัวอย่างเช่น, หาก container app ต้องการเชื่อมต่อกับ container db, คุณสามารถใช้ชื่อบริการ db เป็น hostname:

import psycopg2

connection = psycopg2.connect(
host="db", # ชื่อบริการใน docker-compose.yml
user="postgres",
password="password",
dbname="mydatabase"
)

2. การทดสอบการเชื่อมต่อระหว่างเครือข่ายต่างๆ

หาก container เชื่อมต่อกับหลายเครือข่าย, คุณสามารถตรวจสอบการเชื่อมต่อระหว่าง container ผ่าน docker network inspect <network_name>. ตัวอย่างเช่น:

docker network inspect backend

คำสั่งนี้จะให้ข้อมูลเกี่ยวกับเครือข่าย backend และ container ที่เชื่อมต่อกับเครือข่ายนี้.

3. การใช้ Docker Compose CLI สำหรับเครือข่าย

Docker Compose ยังมีคำสั่ง CLI ที่สามารถใช้ตรวจสอบเครือข่ายได้ เช่น:

  • docker-compose ps เพื่อดูสถานะของ container
  • docker-compose logs เพื่อดู log ของ container
  • docker-compose down เพื่อหยุดการทำงานของทุกบริการในโปรเจกต์ Docker Compose

การกำหนด Port Mapping ใน Docker Compose

เมื่อคุณกำหนดเครือข่ายใน Docker Compose, คุณยังสามารถตั้งค่าการเปิดพอร์ตให้ container เข้าถึงจากภายนอกได้ผ่านการกำหนด ports ในบริการที่ต้องการ.

ตัวอย่างการเปิดพอร์ตใน docker-compose.yml

services:
web:
image: nginx
ports:
- "8080:80" # เปิดพอร์ต 8080 บนเครื่องโฮสต์เพื่อเข้าถึงพอร์ต 80 ของ container
networks:
- frontend

ในตัวอย่างนี้:

  • พอร์ต 8080 ของโฮสต์จะถูกเชื่อมต่อกับพอร์ต 80 ของ container ที่รัน nginx
  • Container นี้จะเชื่อมต่อกับเครือข่าย frontend

การใช้ External Networks

นอกจากการสร้างเครือข่ายภายใน Docker Compose แล้ว, คุณยังสามารถใช้เครือข่ายภายนอก (external network) ที่มีอยู่แล้วในระบบได้. ตัวอย่างการใช้ external network:

ตัวอย่างการใช้ external network

version: '3'

services:
app:
image: my-app
networks:
- external_network

networks:
external_network:
external: true

ในตัวอย่างนี้, external_network คือเครือข่ายที่มีอยู่แล้วใน Docker (อาจจะถูกสร้างขึ้นด้วย docker network create หรือโดยการใช้เครือข่ายจากโปรเจกต์ Docker อื่นๆ). เมื่อระบุ external: true, Docker Compose จะไม่สร้างเครือข่ายใหม่แต่จะเชื่อมต่อ container กับเครือข่ายที่มีอยู่แล้ว

สรุป

Docker Compose Networking ช่วยให้คุณสามารถจัดการการเชื่อมต่อระหว่าง container หลายๆ ตัวที่รันในโปรเจกต์เดียวกันได้อย่างมีประสิทธิภาพ. ด้วยการใช้เครือข่าย custom, คุณสามารถควบคุมการสื่อสารระหว่าง container และกำหนดรูปแบบเครือข่ายที่เหมาะสมกับแอปพลิเคชันของคุณ นอกจากนี้ยังสามารถใช้ external networks เพื่อเชื่อมต่อกับเครือข่ายที่มีอยู่แล้วและสามารถทดสอบการเชื่อมต่อระหว่าง container ผ่านคำสั่ง CLI และเครื่องมือ Docker ได้อย่างสะดวก.