ตอนนี้เริ่มใช้งาน Docker แบบจริงจัง โดยตั้งเซิร์ฟเวอร์ Gogs สำหรับเก็บซอร์สโค้ดของทีมงาน แต่ปรากฏว่ามีบางหน่วยงานที่ไม่สามารถเรียกหน้าเว็บได้ ทีแรกนึกว่าเป็นที่ระบบเน็ตเวิร์ก แต่เช็คไปเช็คมาปรากฏว่าเป็นเพราะ Docker มันไปสร้าง bridge network interface เป็น IP วงเดียวกับที่ใช้ในอินทราเน็ตของที่ทำงาน 😑

จากที่ Google มาได้ความประมาณว่า default bridge network interface ของ Docker ในลินุกซ์ จะใช้ชื่อ docker0 และจะเป็นวง private IP ที่เริ่มจาก 172.17.0.0 (เดาว่าน่าจะกำหนดให้อยู่ใน private IPv4 address space ) ซึ่งถ้ามีเครื่องจากภายนอกที่ใช้ IP วง 172.17.x.x พยายามติดต่อเข้ามา เซิร์ฟเวอร์จะงงและไม่ตอบกลับ

วิธีแก้คือ เปลี่ยน config ของ Docker daemon ในไฟล์ /etc/docker/daemon.json (ถ้าไม่มีไฟล์นี้ให้สร้างใหม่ได้เลย) ถ้าอยากรู้ว่าสามารถตั้งค่าอะไรได้บ้าง ดูได้จาก options ของ dockerd ที่ผมทำคือเปลี่ยนแค่ค่าเดียว ถ้าเปิดไฟล์ daemon.json จะเห็นข้อมูลหน้าตาแบบนี้

{
  "bip": "192.168.1.1/24"
}

เท่านี้ default bridge network ของ Docker ก็จะกลายเป็น IP ที่เราตั้ง… แต่ปัญหาต่อมาคือตัว bridge network interface ที่สร้างโดย Docker Compose แทนที่จะรันต่อจาก 192.168.1.0 มันดันไปเริ่มที่ 172.17.0.0 ใหม่อีก 🤣 ลอง Google อีกรอบก็พบว่ามีคนประสบปัญหาเดียวกันอยู่ไม่น้อย

ถ้าอ่านคอมเมนต์ใน pull request ข้างบนจะพบว่าตอนนี้มี workaround แค่อย่างเดียวคือต้อง hard code network ไว้ในไฟล์ docker-compose.yml ไปก่อน โดยใส่ข้อมูลประมาณนี้

version: "3"

services:
  ... <service definitions>

volumes:
  ... <volume definitions>

networks:
  default:
    ipam:
      config:
        - subnet: 192.168.2.0/24

เท่านี้ bridge network interface ที่สร้างโดย Docker Compose ก็จะมี IP อยู่ในวงที่เราต้องการ 😁