Docker DNS
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ặcdb
). 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 textmysql
và containermysql
sẽ được lưu ở đâu?
- Trong Rails app, ta sẽ connect tới Database qua 1 host name, ví dụ:
[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 ip127.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]
Khi
app
connect tớimysql
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à trongfiles /etc/hosts
trước, sau đó tới tìm kiếm qua DNS.
- Do trong file này đang để config mặc định:
Check trong file
/etc/hosts
không có config đặc biệt chomysql
=> Nó sẽ tiếp tục check từ DNS.DNS nameserver sẽ được tìm trong
/etc/resolv.conf
. Nếu check trong file này ta sẽ thấy dòng chỉ địnhnameserver 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