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เพื่อดูสถานะของ containerdocker-compose logsเพื่อดู log ของ containerdocker-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 ได้อย่างสะดวก.