Cảm ơn Đức mình đã làm xong. Nguyên nhân do 2 vấn đề, mình share lại cho các babie docker ( Professional bỏ qua nghen )
Vấn đề 1 : Trong file app.py mình chưa khai báo port =os.environ['PORT']
Vấn đề 2 : Đã khai báo trong app.py nhưng trong docker-compose.yml thì khai báo sai key với app.py ( mình để ports thay vì PORT)
Mình hiểu rồi, cơ mà không biết file env mình có sai không mà nó cứ lấy port 5000 là internal. Port 9999 là public ok. Nhưng port inyernal vẫn là 5000 chứ không phải là 888
Sau khi sửa file .env thì bạn cần restart lại project bằng cách chạy docker-compose down và up.
Trong bài mình cũng có giải thích là ta chỉ việc tạo file .env còn docker-compose sẽ tự động đọc ở cùng thư mục và tìm bạn à, ta không vần mock vào nhé . Để mình sửa lại đoạn đó cho rõ ràng hơn nhé
Bạn giúp mình clear chỗ tạo file .env nhé. Mình tạo xong chạy trên public port = 9999 và private port = 8888. Nhưng khi up lên thì mình thấy vẫn chạy port 5000.
Mình không thấy chỗ nào có cấu hình móc .env vào hết ( Dockerfile và docker-compose.yml)
P/s Mình mò mẫm mới bước vào docker, mong bạn thông cảm nhé.
Lol có nói app dụng gì về rest API đâu toàn dùng default của react , ít nhất bạn cũng phải đưa ra so sánh tính ra milisecond khi ko dùng rest, dùng rest như nào chứ
Ex: cho 1 cái json rùi đọc ra là ko đúng rùi , bạn phải đó dc lúc call từ ứng dụng cùng tốc độ mạng thì nó call lên cùng 1 API như nào
Mình khẳng định lại là webserver không cần EXPOSE để có thể map được port như bạn nói nhé.
Mình không biết bạn dùng port 443 hay port bao nhiêu, mình đã làm demo sẵn cho bạn. Chứng minh cụ thể cho bạn, document chính thức của Docker cũng nói như vậy, nhưng 1 mình bạn vẫn khẳng định như vậy thì mình cũng không còn gì để comment. (Chả lẽ mình lại phải làm tiếp 1 demo map port 443 không cần EXPOSE cho bạn xem nữa hay sao?)
Nếu bạn vẫn khẳng định là cần thì tại sao các bài trước mình chạy project NodeJS chẳng hạn mình đâu có cần EXPOSE cổng 3000 vẫn map và chạy bình thường đó bạn ???
Hoặc có thể do mình không hiểu hết được ý của bạn, dù như vậy thì mình nghĩ cũng nên dừng việc tranh luận này ở đây! Sau comment này mình sẽ không còn ý kiến gì nữa
Đã thẩm thấu được vì sao mình copy node_modules vào thì chạy ok . Cảm ơn bạn đã có những bài viết hữu ích cho những ai đang tìm hiểu Docker. Hy vọng bạn có nhiều bài viết hơn nữa đễ cho những người như mình LOVE docker nhiều nhiều hơn nữa bạn nhé.
Thật tuyệt với nếu bạn có một project Docker về HAProxy nhé :D mình đang làm về nó mà chưa thông
mình thử thì thấy sau khi dùng option -p 443:443 truy cập vào nginx vẫn được, cái này mình sai.
Vì option publish sẽ thực hiện expose ẩn nếu trong dockerfile chưa expose, và vì thế nên bạn cũng sai khi khẳng định webserver không cần expose, vì nó đã không listen port đó thì forward port vào cũng chẳng được gì.
Bạn có thể xem ở đây (phần ps), vì nó không có trong doc https://stackoverflow.com/a/22150099
Nếu đúng như doc viết thì -p chỉ thực hiện forward port, nên đừng lôi mấy dòng tiếng anh đọc không hiểu ra
Còn tranh luận bình thường bạn đừng lôi giọng đó vào, mình đọc thấy chán luôn, cũng chẳng muốn tranh luận với bạn tại sao vendor trong container sẽ không bị mất nữa.
Mặc dù bạn đã chạy npm install ở Dockerfile, nhưng vì khi chạy ở file docker-compose.yml bạn lại mount volume từ folder ngoài vào trong, nên toàn bộ các file ở đường dẫn /app trong container lúc chạy sẽ bị thay thế bởi các file ở foldẻ ngoài của bạn
Nhưng ở folder ngoài của bạn thì lại không hề có node_modules
Vậy cách giải quyết vấn đề này là gì?
Bạn chỉ cần comment bỏ dòng mount volumes ở file docker-compose là chạy được, nhưng vì bạn cần phải có đoạn mount volumes đó để có thể sửa code ở bên ngoài bên trong thay đổi trực tiếp.
Nên vậy cách giải quyết cuối cùng cho trường hợp của bạn để khi người khác lấy project của bạn và có thể chạy được là:
Ở folder bên ngoài bạn chạy cho mình command sau:
docker run --rm -v $(pwd):/app -w /app node npm install
Command trên sẽ tạo trực tiếp folder node_modules ở môi trường ngoài dùng 1 container tạm thời
Sau đó chạy docker-compose up là chạy bình thường nhé
THẢO LUẬN
Bài viết rất hay. Cảm ơn bạn
Cám ơn Huy đã chia sẻ nhé
Dear Đức,
Cảm ơn Đức mình đã làm xong. Nguyên nhân do 2 vấn đề, mình share lại cho các babie docker ( Professional bỏ qua nghen ) Vấn đề 1 : Trong file app.py mình chưa khai báo port =os.environ['PORT'] Vấn đề 2 : Đã khai báo trong app.py nhưng trong docker-compose.yml thì khai báo sai key với app.py ( mình để ports thay vì PORT)
Các bạn nhớ lưu ý chỗ này kẻo dính bug như mình
Cảm ơn Đức nhiều và ngón series CI/CD sớm
@huy_nguyen Cám ơn Huy đã theo dõi nhé, mình sẽ viết về CICD sớm nhé
oke e nhé,
Chào Huy,
MÌnh đã check lại trong bài và thấy mọi thứ vẫn ok nhé.
Vấn đề do bên trong container của Huy vẫn là port 5000 thì bạn check lại những chỗ sau cho mình nhé:
Nếu vẫn còn lỗi thì bạn so sánh lại với full source code bài này từ đầu đến cuối mình để ở đây nhé (nhánh complete-tutorial)
dear Đức,
Chào Huy,
Sau khi sửa file .env thì bạn cần restart lại project bằng cách chạy docker-compose down và up.
Trong bài mình cũng có giải thích là ta chỉ việc tạo file .env còn docker-compose sẽ tự động đọc ở cùng thư mục và tìm bạn à, ta không vần mock vào nhé . Để mình sửa lại đoạn đó cho rõ ràng hơn nhé
Dear Đức,
P/s Mình mò mẫm mới bước vào docker, mong bạn thông cảm nhé.
Cảm ơn Đức.
Cảm ơn bạn nhé!
Dear Đức,
Lol có nói app dụng gì về rest API đâu toàn dùng default của react , ít nhất bạn cũng phải đưa ra so sánh tính ra milisecond khi ko dùng rest, dùng rest như nào chứ Ex: cho 1 cái json rùi đọc ra là ko đúng rùi , bạn phải đó dc lúc call từ ứng dụng cùng tốc độ mạng thì nó call lên cùng 1 API như nào
Cám ơn bạn đã theo dõi blog của mình,
Mình sẽ cố gắng chia sẻ nhiều nhất có thể với các bạn nhé
Mình khẳng định lại là webserver không cần EXPOSE để có thể map được port như bạn nói nhé.
Mình không biết bạn dùng port 443 hay port bao nhiêu, mình đã làm demo sẵn cho bạn. Chứng minh cụ thể cho bạn, document chính thức của Docker cũng nói như vậy, nhưng 1 mình bạn vẫn khẳng định như vậy thì mình cũng không còn gì để comment. (Chả lẽ mình lại phải làm tiếp 1 demo map port 443 không cần EXPOSE cho bạn xem nữa hay sao?)
Nếu bạn vẫn khẳng định là cần thì tại sao các bài trước mình chạy project NodeJS chẳng hạn mình đâu có cần EXPOSE cổng 3000 vẫn map và chạy bình thường đó bạn ???
Hoặc có thể do mình không hiểu hết được ý của bạn, dù như vậy thì mình nghĩ cũng nên dừng việc tranh luận này ở đây! Sau comment này mình sẽ không còn ý kiến gì nữa
Cám ơn bạn đã góp ý
Dear Chung,
mình thử thì thấy sau khi dùng option -p 443:443 truy cập vào nginx vẫn được, cái này mình sai. Vì option publish sẽ thực hiện expose ẩn nếu trong dockerfile chưa expose, và vì thế nên bạn cũng sai khi khẳng định webserver không cần expose, vì nó đã không listen port đó thì forward port vào cũng chẳng được gì.
Bạn có thể xem ở đây (phần ps), vì nó không có trong doc https://stackoverflow.com/a/22150099 Nếu đúng như doc viết thì -p chỉ thực hiện forward port, nên đừng lôi mấy dòng tiếng anh đọc không hiểu ra
Còn tranh luận bình thường bạn đừng lôi giọng đó vào, mình đọc thấy chán luôn, cũng chẳng muốn tranh luận với bạn tại sao vendor trong container sẽ không bị mất nữa.
Chào Huy,
Sorry bạn mình viết thiếu một bước, không biết sao lúc viết bài đầu óc mình lại thế nào
Mình đã sửa lại trong bài mục Chạy Project, bạn có thể đọc lí do ở đó nhé
Cách fix nhanh cho bạn, bạn chạy command sau là được nhé:
Sau đó khởi động lại project bằng cách chạy docker-compose down/up
Hi vọng giúp được bạn
Chào bạn,
Vấn đề của bạn là thế này:
Vậy cách giải quyết vấn đề này là gì?
Bạn chỉ cần comment bỏ dòng mount volumes ở file docker-compose là chạy được, nhưng vì bạn cần phải có đoạn mount volumes đó để có thể sửa code ở bên ngoài bên trong thay đổi trực tiếp.
Nên vậy cách giải quyết cuối cùng cho trường hợp của bạn để khi người khác lấy project của bạn và có thể chạy được là:
Hi vọng có thể giúp được bạn
mình mới phát hiện ra vấn đề là file .htaccess này không hoạt động được trên nginx chính xác hơn đó là " Nginx does not support .htaccess files. "
Dear Chung,
Cảm ơn Chung