Docker เข้ามาเซฟเวลาของ Software Engineer ไปได้เยอะมาก ๆ กับการที่สามารถจำลองสภาพแวดล้อมการทำงานให้ไม่ต้องปวดหัวกับเรื่อง ที่สภาพแวดล้อมในการทำงานของแต่ละเครื่องไม่เท่ากัน
แต่ . . ครั้นเมื่อเอาไปใช้จริงในระดับ Production แล้วนั้น การใช้จริงในเครื่อง Production ไม่ได้มีแค่ Application layer แค่อย่างเดียว ซึ่งในบางครั้ง ก็อาจจะพบเจอกับปัญหาเรื่อง IP ชนกัน จนอาจจะมีปัญหา
. .
และหนึ่งในเคสที่ผมได้พบเจอด้วยตัวเอง จนมาถึงการที่ได้มาเป็น Dev logs ในครั้งนี้ขึ้นมา . .
ผมได้เจอปัญหากับ Application ที่ deploy ขึ้นไปแล้วบนเครื่องที่มี VPN services รันอยู่ในเครื่องเดียวกัน และเกิดปัญหาว่า IP range ของทั้ง Application และ VPN มันดันชนกันซะพอดิบพอดีซะนี่ล่ะสิ
ทีนี้ล่ะ… ปัญหาเกิดขึ้นมาในทันที กลายเป็นว่า ถ้า App รันขึ้นมาได้ ก็ทำให้ dev ไม่สามารถ VPN เข้าไปได้ หรือถ้า VPN รันขึ้นมาก่อน ก็จะทำให้ App รันขึ้นมาไม่ได้
ไอเดียก็คือต้องเปลี่ยนไปให้ Docker service ไปรันอยู่ใน Subnet อื่น เพื่อเลี่ยงการชนกัน ซึ่งถ้าเป็นค่าตั้งต้นของตัว Docker เอง ip range จะเป็น
172.17.0.0/16
แล้วถ้าต้องการ Fix ip ล่ะ.. เราจะทำยังไงได้บ้าง ?
โจทย์ สมมติว่าเราต้องการให้ ip range อยู่ในช่วง 172.17.102.0/24 เพื่อไม่ให้ IP ชนกับ service ตัวอื่น ** เราจะต้องกำหนด bip เป็น 172.17.92.1/24 เพื่อเป็น bridge IP สำหรับ ip range 172.17.92.0/24
ผมขอสรุปขั้นตอนในการทำเรื่อง Fix docker subnet ip range ไว้เป็น 3 ขั้นตอน ตามนี้
1. Stop docker service `sudo systemctl stop docker` 2. Edit `daemon.json` file (ip เป็นตามโจทย์) `{ "bip" : "172.17.92.1/24" }` 3. Start docker service `sudo systemctl start docker`
หลังจากนั้นถ้าต้องการเช็คว่า subnet ถูกเปลี่ยนไปแล้วยัง ก็ให้ใช้
docker network inspect {network_name}
เพื่อเช็คว่าSubnet
และGateway
ถูกเปลี่ยนไปเป็นตามที่เราต้องการแล้วยัง
แต่ทีนี้ก็อาจจะสงสัยกันต่อไปว่า แล้วเลข ip range มันยังไงบ้างล่ะ ? ผมขอยกตัวอย่างคร่าว ๆ เป็นตัวเลขที่เราจะเจอกันบ่อยครั้ง คือ /16 /24 ซึ่ง format ที่เรามักจะเห็นกันก็คือ
172.17.0.0/16
172.17.92.0/24
- /16 => `172.17.0.0` ถึง `172.17.255.255` - /24 => `172.17.92.0` ถึง `172.17.92.255`
ให้พอเข้าใจกันคร่าว ๆ จะได้กำหนด ip range กันให้ได้ถูกต้องนะคร้าบบบ เดี๋ยวคราวหน้าเรามาคุยกันว่า ถ้าต้องการ odoo 2 instance ผ่าน Docker ในเครื่องเดียวกัน เราจะทำได้ยังไง และมีอะไรที่ต้อง config บ้าง ?
>_JV
