Art Krisada
1 min readAug 27, 2019

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 ไว้มั้ยครับ

Art Krisada
Art Krisada

Written by Art Krisada

Never stop learning, because life never stop teaching.

No responses yet