Skip to Content

Docker DNS

Posted on

Docker DNS

[Q]

  • Khi chạy docker với các project, mình thắc mắc là:
    • Trong Rails app, ta sẽ connect tới Database qua 1 host name, ví dụ: mysql (hoặc db). Thế thì: Làm thế nào mà app container connect được tới container DB? Hay cụ thể thì: Thông tin mapping của text mysql và container mysql sẽ được lưu ở đâu?

[A]

  • Lúc đầu, mình nghĩ tới file như /etc/hosts. Khi mình gõ localhost:3000, browser biết mở tới ip 127.0.0.1 là vì điều này đã được mapping trong /etc/hosts.
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost

Nên để biết mysql map tới ip nào thì có thể docker đã thêm 1 config tương tự vào trong file này chăng.

Nhưng ở trong container app, khi mình check file /etc/hosts thì lại không thấy có config gì đặc biệt, hay liên quan tới mysql cả :v

Sau khi google search + đi hỏi cao nhân, thì mình cũng hiểu sơ sơ được cách hoạt động.

[TIL]

  1. Khi app connect tới mysql host. Nó sẽ check qua file /etc/nsswitch.conf để lấy config.

    • Do trong file này đang để config mặc định: hosts: files dns => Thứ tự tìm kiếm host sẽ là trong files /etc/hosts trước, sau đó tới tìm kiếm qua DNS.
  2. Check trong file /etc/hosts không có config đặc biệt cho mysql => Nó sẽ tiếp tục check từ DNS.

  3. DNS nameserver sẽ được tìm trong /etc/resolv.conf. Nếu check trong file này ta sẽ thấy dòng chỉ định nameserver 127.0.0.11

Đây chính là cái mình cần tìm. Tức là:

  • Docker nó sẽ tự dựng lên 1 cái DNS server, ở địa chỉ IP: 127.0.0.11
  • Khi khởi tạo container, thông tin của DNS server sẽ được lưu vào trong file /etc/resolv.conf của container.
  • Khi các container con cần check host, các container này sẽ gửi request tới DNS 127.0.0.11 để hỏi: Host này tương ứng với địa chỉ IP nào?
  • DNS trả về IP tương ứng với host đó. Sau đó container sẽ tương tác với host.
nslookup mysql


Server:         127.0.0.11
Address:        127.0.0.11#53

Non-authoritative answer:
Name:   mysql
Address: 172.23.0.2

References

comments powered by Disqus