จากครั้งที่แล้ว ที่เราทำ Subnet กันไปแล้ว วันนี้มาต่อยอดกันอีกนิด กับการ Fix IP ให้อยู่ใน range
โดยในตัวอย่างวันนี้ ผมจะขอเป็นโจทย์ว่า
- เราสร้าง custom Network เรียบร้อยแล้ว - ต้องการ Fixed IP ไว้ภายใน ip range อีกทีนึง - ต้องการแยก instance UAT / prod แยกกันไว้คนละ port
โจทย์นี้หลัก ๆ แล้ว ก็จะเป็นการที่เราจำเป็นจะต้อง Fixed IP ด้วยประเด็น เรื่องความปลอดภัยเป็นหลัก ที่ต้องการให้สามารถกำหนดช่วง ip สำหรับ VPN หรือ Firewall ได้
วิธีการ ก็จะเป็นการเพิ่ม config code เข้าไปที่ docker compose file เพื่อให้ container สามารถกำหนด ip ได้
Step 1 : สร้าง Custom network
docker network create --subnet=10.5.0.0/24 custom-net
Step 2 : แก้ไข docker-compose.yml
UAT docker-compose.yml
version: "2" services: web-uat: image: odoo:14.0 depends_on: - db-uat ports: - "8070:8069" # Different port for UAT Odoo volumes: - ./addons:/mnt/extra-addons - ./config-uat:/etc/odoo - odoo-uat-web:/var/lib/odoo networks: custom-net: ipv4_address: 10.5.0.10 # Static IP for UAT Odoo stdin_open: true tty: true db-uat: image: postgres:10 environment: - POSTGRES_DB=postgres - POSTGRES_PASSWORD=odoo - POSTGRES_USER=odoo volumes: - odoo-uat-db-data:/var/lib/postgresql/data ports: - "5433:5432" # Different port for UAT Postgres networks: custom-net: ipv4_address: 10.5.0.11 # Static IP for UAT Database volumes: odoo-uat-db-data: odoo-uat-web: networks: custom-net: external: true
โดย config หลัก ๆ ที่จำเป็นสำหรับการทำ custom network + fix ip จะเป็นโค้ดชุดนี้
web-uat: networks: custom-net: ipv4_address: 10.5.0.10 . . . networks: custom-net: external: true
*** สังเกตว่าชื่อ custom-net ก็คือชื่อเดียวกันกับที่เราสร้างไว้ใน Step1 นั่นแหละ
Step3 : แยก docker-compose.yml ให้รันทั้ง db และ web อยู่คนละ port
- ข้อนี้ทำเพื่อให้ตรงกับโจทย์ที่ว่า เราต้องการรันทั้ง UAT / prod ให้อยู่บนเครื่องเดียวกัน (ซึ่งจริง ๆ ส่วนนี้ก็แล้วแต่การวาง infrastructure หรือแล้วแต่ช่วงการ implement ด้วยนะครับ)
Production docker-compose.yml
version: "2"
services:
web-prod:
image: odoo:14.0
depends_on:
- db-prod
ports:
- "8069:8069" # Default port for Production Odoo
volumes:
- ./addons:/mnt/extra-addons
- ./config-prod:/etc/odoo
- odoo-prod-web:/var/lib/odoo
networks:
custom-net:
ipv4_address: 10.5.0.20 # Static IP for Production Odoo
stdin_open: true
tty: true
db-prod:
image: postgres:10
environment:
- POSTGRES_DB=postgres
- POSTGRES_PASSWORD=odoo
- POSTGRES_USER=odoo
volumes:
- odoo-prod-db-data:/var/lib/postgresql/data
ports:
- "5432:5432" # Default port for Production Postgres
networks:
custom-net:
ipv4_address: 10.5.0.21 # Static IP for Production Database
volumes:
odoo-prod-db-data:
odoo-prod-web:
networks:
custom-net:
external: true
Step 4 : Run docker-compose instance
มาถึงขั้นตอนนี้ ก็รันแยกกันด้วยนะครับ เพราะเราสร้าง docker-compose.yml ไว้ 2 ไฟล์ เพื่อให้แยก instance กันได้ชัดเจน
For UAT:
docker compose -f docker-compose-uat.yml up -d
For Production:
docker compose -f docker-compose-prod.yml up -d
*** Note
ส่วนไฟล์ odoo.conf
เปลี่ยน db_host ตาม instance ที่รันด้วยนะครับบบ
[options]
db_host = db-uat # Use 'db-prod' for production
db_port = 5432
db_user = odoo
db_password = odoo
Key Points
1. **External Network:** `docker-compose.yml` ทั้งสองไฟล์ระบุ network ไปที่ subnet เดียวกัน `custom-net`. 2. **Static IPs:** ทั้ง 2 services ถูกสร้างอยู่บน subnet (`10.5.0.0/24`). และจากตัวอย่าง, UAT รันอยู่ที่ ip `10.5.0.10` ส่วน Production รันอยู่ที่ `10.5.0.20` 3. **Network Isolation:** ในไฟล์จะเห็นว่ามีการระบุ `external: true`เพื่อเป็นการบอก compose ว่าให้ไปใช้ custom-net ที่เราได้สร้างไว้อยู่แล้ว โดยไม่ต้องทำการสร้าง network ขึ้นมาใหม่
>_JV