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:
- Performance khi xài project trên local /c/project_abc thì sẽ chậm gấp 10 lần so với performance chạy trên wsl ubuntu, tương tự với docker compose cũng thế, nếu xài trên windows docker compose sẽ mất 60s ( quá chậm ), còn nếu trên ubuntu compose thì chỉ còn 3-10s.
- 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
Firewall
Vấn đề firewall thì bạn cần phải set allow app, allow directory, allow in và out rules cho firewall
- Mình xài malwarebytes nên mình add allowlist cho các folder như Webstorm, WSL Project Path
- Ngoài ra mình còn vào windows defender firewall -> Allowed apps -> allow tất cả các app như node.exe, webstorm64.exe, ... ( check cả hai Private + Public boxes )
- Đối với port mình sẽ vào windows defender firewall with Advanced Security, Mình tạo rules cho cả inbound rules và outbound rules cho port đó ( mục đích là mình muốn các máy khác cùng network sẽ truy cập vào được )
Cho phép các chương trình vượt rào firewall
Cho phép port pass tường firewall
INBOUND: Khi bạn cho phép thì máy bên ngoài mới vào được
OUTBOUND: Khi bạn cho phép thì bên trong upload / traffic ra ngoài được
Malwarebytes
tương tự như trên, cho phép folder không cần phải check và vượt firewall, cho phép website, cho phép application nào.
Phần này mình không cần phải nói nhiều nữa nhé.
App không trỏ vào đúng ip address
Đầ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
DNS Ubuntu server mặc định không đúng
Thứ hai, cần phải setup lại resolve.conf trong folder /etc của wsl ubuntu của bạn:
sudo rm /etc/resolv.conf
sudo vi /etc/resolv.conf
đánh pass vào rồi sửa file
Ở đâ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
WSL config không đúng
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
Save lại và khởi động lại hoặc vào command windows
wsl --shutdown
wsl
DNS của docker daemon không đúng
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
Hoặc trên command prompt của windows thì :
wsl hostname -I
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.
Hy vọng bạn chiến đấu tiếp tục được với windows wsl2 ubuntu docker và nodejs app tốt hơn
Cấu hình cho WSL2 High Performance.
Ngoài ra, bạn có thể tăng tốc độ cho WSL2 bằng cách điều chỉnh cấu hình cho VM qua file .wslconfig trên windows 10 / 11 của bạn:
Bạn vào C:\Users\HoThanhSon rồi tạo file .wslconfig với nội dụng như sau
HoThanhSon là tên account máy của bạn
[wsl2]
# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=64GB
# Sets the VM to use two virtual processors
processors=16
Càng nhiều thì càng tốt nhưng cũng đừng để quá cao ngốn sạch hết ram và process của máy để không làm được nhiều việc khác. Và đương nhiên là nhớ reboot lại máy hoặc dùng command để thông số được áp dụng.
Kết quả là hiện tại khi sử dụng docker compose up trên wsl ubuntu thì webpack đã chạy mất 3s , trước đó là từ 11s->60s
1 Comment
ai có comment thì comment vào đây nhé.