Mình đã nghĩ đoạn document từ trang chủ của Docker đã làm bạn hiểu nhưng vì bạn vẫn khăng khăng nên mình đã tự tay trực tiếp build lại Image từ trang cung cấp docker image official. Image của mình ở đây https://gist.github.com/maitrungduc1410/7487cf5eff7a2595921aca2c4b240267. Ở image này mình KHÔNG CẦN EXPOSE cổng 80 vẫn có thể map port từ bên ngoài và chạy bình thường nhé
Còn việc bạn không chạy được ở cổng 443, khá nhiều lí do có thể gây ra lỗi (ở localhost thì không có HTTPS, hoặc khi bạn deploy ở VPS nhưng certificate của bạn ko hợp lệ chẳng hạn,...), nên ngay cả khi bạn expose và thậm chí map cả port cũng không chạy được.
Về câu hỏi thứ nhất này của bạn nếu sau khi mình đã giải thích và làm hẳn demo cho bạn nhưng bạn vẫn bảo vệ quan điểm của mình thì mình xin được không tranh luận về điều này nữa!
Còn câu thứ 2, trong bài câu đó ở phần câu hỏi liên quan tới những gì mình làm trong bài, mọi thứ vẫn chạy bình thường ổn định, mình vẫn dùng cách đó và phần đó mình cũng đã nói rõ là ở trong bài này , một phần mềm có hàng tỉ cách tiếp cận, mình không thể nói hết được từng cách, còn vì trong bài mình mount từ môi trường gốc vào cả image Laravel và image Nginx do đó mình khuyên bạn đọc không nên chạy composer vì khi chạy thì folder vendor sẽ bị mất do môi trường ngoài không có.
Và cả sau câu 2 này nếu vẫn chưa làm bạn hài lòng thì mình cũng xin không tranh luận dài dòng nữa
bạn hãy xem ở đây https://github.com/nginxinc/docker-nginx, nó đã expose sẵn port 80, còn bạn muốn check điều mình nois
không thể map port nếu không expose thì bạn thử map port 443:443 mà không expose trong dockerfile xem, dùng docker cli nhé đừng dùng ports của docker-compose vì nó expose và mapping trong cùng khai báo đó.
cái thứ 2 mình muốn chỉ ra là việc bạn nói không nên chạy composer install trong dockerfile là sai, mình vẫn đang dùng và ENTRYPOINT sinh ra để làm việc như thế, build container bằng câu lệnh, và nó sẽ chạy sau khi mount volume hoàn thành.
cái đầu tiên bạn check lại trong image của docker trên github đó, nó sẽ có expose sẵn rồi
cái thứ 2 mình nói không được ý là bảo nó install xong rồi bị replace như bạn nói đó, bạn đọc kỹ lại comment của mình, bạn có thể đọc thêm về thứ tự chạy khi mà 1 container được build, sự khác nhau của RUN, ENTRYPOINT và CMD.
Câu này bạn đã có sự nhầm lẫn nhé, nguyên văn từ document của Docker The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. EXPOSE does not make the ports of the container accessible to the host.. Và đây là giải thích đơn giản hơn của câu trên nhé The EXPOSE instruction exposes the specified port and makes it available only for inter-container communication (tức: EXPOSE sẽ mở ra một port và làm nó có sẵn cho việc giao tiếp giữa các container nhé bạn). Đó là lí do vì sao các bài trước (ví dụ bài dockerize NodeJS mình đâu có cần expose port 3000 vẫn có thể map được đó thôi bạn)
Còn điều thứ 2 thì bạn hoàn toàn có thể chạy composer install trong lúc build image nhé, mình cũng đã từng chạy bình thường (trường hợp đó mình có cả nginx và php-fpm chung trong cả image). Check lại nhé bạn!
bài viết rất hay nhưng trong bài của bạn mình thấy có 2 điều sai:
webserver không cần expose vì chẳng có ai gọi đến nó cả cái này là sai lầm nhé, nó vẫn cần expose, expose xong rồi mới map được docker host bên ngoài với container host bên trong. Bạn có thể xem lại trong official image.
Tại sao không chạy composer install ngay lúc build image?. Bạn chạy composer install không được bởi lệnh RUN built on top của container, trước việc mount volume hoàn thành, nếu chạy lệnh đó trong ENTRYPOINT thì không sao cả, vì entrypoint sẽ được chạy sau khi mount, và khi vendor được tạo ra trong container, nhờ cơ chế sync của docker nó sẽ được đồng bộ với folder của docker host.
THẢO LUẬN
E thử build rồi up lên nhưng truy cập không được ạ. E chạy trên host 192.168.99.105
good
hay quá bạn ơi!!
cảm ơn bài viết
hay quá. Thanks bác
Combinelatest chứ k có combinelastest nha bạn.
Mình đã nghĩ đoạn document từ trang chủ của Docker đã làm bạn hiểu nhưng vì bạn vẫn khăng khăng nên mình đã tự tay trực tiếp build lại Image từ trang cung cấp docker image official. Image của mình ở đây https://gist.github.com/maitrungduc1410/7487cf5eff7a2595921aca2c4b240267. Ở image này mình KHÔNG CẦN EXPOSE cổng 80 vẫn có thể map port từ bên ngoài và chạy bình thường nhé
Còn việc bạn không chạy được ở cổng 443, khá nhiều lí do có thể gây ra lỗi (ở localhost thì không có HTTPS, hoặc khi bạn deploy ở VPS nhưng certificate của bạn ko hợp lệ chẳng hạn,...), nên ngay cả khi bạn expose và thậm chí map cả port cũng không chạy được.
Về câu hỏi thứ nhất này của bạn nếu sau khi mình đã giải thích và làm hẳn demo cho bạn nhưng bạn vẫn bảo vệ quan điểm của mình thì mình xin được không tranh luận về điều này nữa!
Còn câu thứ 2, trong bài câu đó ở phần câu hỏi liên quan tới những gì mình làm trong bài, mọi thứ vẫn chạy bình thường ổn định, mình vẫn dùng cách đó và phần đó mình cũng đã nói rõ là ở trong bài này , một phần mềm có hàng tỉ cách tiếp cận, mình không thể nói hết được từng cách, còn vì trong bài mình mount từ môi trường gốc vào cả image Laravel và image Nginx do đó mình khuyên bạn đọc không nên chạy composer vì khi chạy thì folder vendor sẽ bị mất do môi trường ngoài không có.
Và cả sau câu 2 này nếu vẫn chưa làm bạn hài lòng thì mình cũng xin không tranh luận dài dòng nữa
không thể map port nếu không expose
thì bạn thử map port 443:443 mà không expose trong dockerfile xem, dùng docker cli nhé đừng dùng ports của docker-compose vì nó expose và mapping trong cùng khai báo đó.Check lại nhé !
tks bạn, để tối về mình check lại nhé
Trước em cũng gặp trường hợp này rồi nên em biết bác ạ =))
cho mình hỏi công thức tính p của hackernew như nào nhỉ? TH upvote=0 và downvote=0 thì sẽ tính như nào? Thanks all
1 like cho chủ thớt
cảm ơn bạn đã đọc. mình cũng mới tìm hiểu về thằng này
bài viết hay qúa bạn, mình đau đầu vì nó mấy ngày nay
thật bổ ích.
mình vừa sửa lại comment bạn check lại nhé (chú ý câu 1)
Cám ơn bạn đã làm rõ hơn cho mình và bạn đọc nhé
Câu này bạn đã có sự nhầm lẫn nhé, nguyên văn từ document của Docker The EXPOSE instruction informs Docker that the container listens on the specified network ports at runtime. EXPOSE does not make the ports of the container accessible to the host.. Và đây là giải thích đơn giản hơn của câu trên nhé The EXPOSE instruction exposes the specified port and makes it available only for inter-container communication (tức: EXPOSE sẽ mở ra một port và làm nó có sẵn cho việc giao tiếp giữa các container nhé bạn). Đó là lí do vì sao các bài trước (ví dụ bài dockerize NodeJS mình đâu có cần expose port 3000 vẫn có thể map được đó thôi bạn)
Còn điều thứ 2 thì bạn hoàn toàn có thể chạy composer install trong lúc build image nhé, mình cũng đã từng chạy bình thường (trường hợp đó mình có cả nginx và php-fpm chung trong cả image). Check lại nhé bạn!
bài viết rất hay nhưng trong bài của bạn mình thấy có 2 điều sai:
webserver không cần expose vì chẳng có ai gọi đến nó cả
cái này là sai lầm nhé, nó vẫn cần expose, expose xong rồi mới map được docker host bên ngoài với container host bên trong. Bạn có thể xem lại trong official image.Tại sao không chạy composer install ngay lúc build image?
. Bạn chạy composer install không được bởi lệnh RUN built on top của container, trước việc mount volume hoàn thành, nếu chạy lệnh đó trong ENTRYPOINT thì không sao cả, vì entrypoint sẽ được chạy sau khi mount, và khi vendor được tạo ra trong container, nhờ cơ chế sync của docker nó sẽ được đồng bộ với folder của docker host.Viết gọn lại cho ai cần: