Issue Ubuntu 18.04 local DNS กับ docker
หลังจากที่ผมได้ Set up Site ที่ Digitalocean โดยใช้ Droplet docker สำเร็จรูปของทาง Digitalocean ที่ run บน ubuntu 18.04 ในช่วงแรกก็สามารถ run ได้ไม่มีปัญหาจาก default setting ของ ubuntu และ docker
Host กับ Container สามารถคุยกันได้ปกติจนกระทั่งผมมีการเรียก API ของ Web ที่อื่นจากใน docker container ตัวหนึ่งของผม ซึ่งปัญหาที่พบก็คือ ภายใน docker container ไม่สามารถ resolve DNS ได้ ทำให้ไม่สามารถจะเรียก API นั้นได้
หลังจากได้ตระเวณหาตาม web ต่างๆก็พบว่าปัญหาเกิดจากการที่ ubuntu 18.04 ใช้ IP 127.0.0.53 ซึ่งเป็น local DNS Server ในการ resolve host name ทำให้ใน docker container หา DNS Server IP 127.0.0.53 ไม่เจอ แล้วเอา Default DNS ของ google มาใช้แทน (8.8.8.8 และ 8.8.4.4 ซึ่งจาก Droplet ที่ใช้มันก็หาไม่เจอเช่นกัน)
จาก Docker documentation: กล่าวไว้ว่า
Note: If you need access to a host’s localhost resolver, you must modify your DNS service on the host to listen on a non-localhost address that is reachable from within the container
ซึ่งก็คือให้เราไปแก้ DNS Service ที่ Host ของ docker ถึงจะใช้ได้นั่นเอง
หลังจากงมอยู่หลายวันก็พบวิธีแก้ไขจาก stackoverflow เจ้าเดิม https://stackoverflow.com/questions/39400886/docker-cannot-resolve-dns-on-private-network/52596121
โดยเริ่มจากการลง dnsmasq และ resolvconf
sudo apt update
sudo apt install dnsmasq resolvconf
sudo apt install network-manager
ขั้นตอนต่อไปให้แก้ไข /etc/dnsmasq.conf โดยเพิ่มให้ listen ที่ IP docker ของเรา
interface=docker0
bind-interfaces
listen-address=172.17.0.1
แก้ File /etc/resolvconf/resolv.conf.d/tail โดยเพิ่ม nameserver เป็น IP docker host
nameserver 172.17.0.1
หลังจากนั้นก็ Restart networking, update resolv.conf แล้ว restart docker
sudo service network-manager restart
sudo resolvconf -u
sudo service dnsmasq restart
sudo service docker restart
อย่าลืม start container ด้วยนะครับ
docker start my_docker_container_name
เสร็จแล้วก็ทดสอบกันโดยลองเข้าไปใน container แล้วสั่ง curl www.google.com
docker exec -it my_docker_container_name /bin/bashcurl www.google.com
ถ้ามีการ return ค่ากลับมาก็แสดงว่าใช้ได้แล้วครับ ถ้ายัง resolve host ไม่ได้ลองเช็ค firewall ดูอีกทีครับว่ามีการ block TCP port 53 ไว้มั้ยครับ