Skip to main content

Windows WSL + Ubuntu + Docker+ Node / Nestjs App không vào được

Vấn đề: Không thể truy cập được localhost với port đã thiết lập trên app là 3000 

Những vấn đề bạn có thể gặp phải:

  • Trên máy ảo ubuntu của wsl không truy cập internet được -> setup dns
  • WSL tự động tái lập file nameserver của chính nó /etc/resolve.conf và điền vào nameserver của wsl đó 172.x.x.x
  • Docker daemon chưa được thiết lập với DNS của bạn ví dụ: 192.168.1.11 hay của cloudflare 1.1.1.1

Đầu tiên cần fix lỗi trên code của app main.ts cần listen vào host nào, ở đây mình để any host tức là 0.0.0.0

image.png

Thứ hai, cần phải setup lại resolve.conf trong folder /etc của wsl ubuntu của bạn:

 sudo vi /etc/resolv.conf

đánh  pass vào rồi sửa file

image.png

Ở đây mình chèn thêm dns local server của nhà mình vào: 192.168.1.11 để nó resolve các name trong network cho đúng ví dụ: postgres.kyluat.lan, nginx.kyluat.lan, ... Save file này lại

Trường hợp không save được vì permission thì xài lệnh sau để unlock lệnh chattr ( change attribute , cho hay không cho thay đổi thuộc tính của một file ), 

sudo chattr -i /etc/resolv.conf

lệnh này thường dùng không cho phép các chương trình được phép thay đổi giống chmod. để -i vào thì nó sẽ tắt chế độ đó. +i thì bật chế độ không cho thay đổi file. 

Sau khi sửa xong thì nhớ bật chế độ không cho thay đổi thuộc tính lại:

sudo chattr +i /etc/resolv.conf

Kế tiếp, bạn vào /etc/wsl.conf để khai báo cho wsl không được tạo thêm Resolv Conf

Thêm vào dòng này nếu chưa có:

[network]
generateResolvConf = false
generateHosts = true
networkingMode=NAT

image.png

Save lại và khởi động lại hoặc vào command windows

wsl --shutdown
wsl

Chỉnh sửa DNS cho Docker trên ubuntu

sudo vi /etc/docker/daemon.json

Ở nội dung file sau mình đã thêm "dns": ["192.168.1.11", "1.1.1.1"] 

{
        "exec-opts": ["native.cgroupdriver=cgroupfs"],
        "log-driver": "json-file",
        "log-opts": {
                "max-size": "100m"
        },
        "storage-driver": "overlay2",
        "dns": ["192.168.1.11","1.1.1.1"]
}

192.168.1.11 là dns server mình đã setup
1.1.1.1 là dns server của cloudflare trường hợp dns server mình bị lỗi thì nó xài thẳng internet dns name server của cloudflare luôn

Các commands hửu ích trong ubuntu 

Lỗi permission khi read/ write / không có permissions cho user hiện tại:

sudo chown -R $USER:$USER /home/

Bạn muốn biết app đang chạy có đang listening không:

netstat -tulpn | grep LISTEN

trên windows máy bạn có thể ping port tcp qua máy ubuntu không:

telnet 172.21.249.177 3000

Kết quả trắng tinh / đen thui / không ra kết quả gì hết là connect được port tcp đó.
Còn không được thì nó sẽ báo Connecting To 172.21.249.177...Could not open connection to the host, on port 3000: Connect failed

ủa mà ip public của máy ubuntu là gì?

ifconfig

image.png

Hoặc trên command prompt của windows thì :

wsl hostname -I

image.png


Sau khi chật vật hàng giờ thì cuối cùng thì mình đã hoàn thành với tất cả phương pháp trên.


Các tài liệu liên quan bạn có thể nghiệm thêm: