ok xong rồi... giờ vầy...
trước tiên, phải nói đôi điều về docker...
thứ nhất docker nó là một cái công cụ, như mọi công cụ khác thì nó tất nhiên không phải là thứ để lôi ra dùng mọi lúc mọi nơi, có những mục đích rất phù hợp để dùng docker, có những mục đích khác thì không...
và
cũng như mọi công cụ khác thì muốn dùng anh cũng phải biết cách; đồng thời cũng phải thay đổi cách suy nghĩ một chút về cách làm cái việc mà mình vẫn làm, đôi khi dùng docker để làm cái việc ấy phải làm theo một cách khác, trình tự khác...
cho nên tôi mới bảo anh prescolt rằng hoặc anh ta đang dùng sai cách, hoặc anh ta đang dùng sai mục đích; và rõ ràng là anh ta cứ chê hiệu năng network của docker nó kém, tôi không bàn tới chuyện đúng sai, cái đó tôi dốt thật, nhưng nếu anh ta thấy nó kém thì đừng dùng docker cho cái mục đích ấy nữa... có ai ép ai đâu, chả hiểu anh ta cứ cố chứng minh cái điều hiển nhiên ấy làm gì, thế mà bị anh ta mắng là tranh luận kiểu trẻ trâu, buồn vãi...
thực tế tôi cũng không thấy ai dùng docker để chạy mấy cái service network cả, chưa nói tới các service network mà phải tính toán từng ly từng tí một về hiệu năng, đòi hỏi phải can thiệp sâu về ngắt ngủng các thứ (tôi chịu mấy cái này)
bởi vì, nếu các anh bớt chút thời gian vào ngay docker.com các anh sẽ thấy một cái câu sờ sờ to lù lù là:
We help developers and development teams build and ship apps.
chính vì thế cho nên là tôi không muốn tiếp tục câu chuyện với anh prescolt nữa, cái anh đang làm không phù hợp để chạy với docker thì không nên cố gắng làm gì, còn chuyện anh chê nó kém hay dở thực ra chẳng có ý nghĩa gì, docker nó tốt xấu hay dở làm gì đến anh đánh giá, cả thế giới người ta đánh giá rồi và những người thấy nó phù hợp nhu cầu cũng đã dùng cả rồi...
quay qua câu chuyện với anh Nipin, tôi thấy anh có hai vấn đề như thế này với thằng docker, đều là xuất phát từ thực tế (anh thừa nhận) là anh thiếu kinh nghiệm với docker...
1.
mindset của anh về docker nó chưa đúng, anh còn coi nó là một cái VPS bị đóng gói lại thì nó không chính xác, dẫn đến nhưng nhu cầu của anh nó hơi "anti-pattern" (từ này không rõ tiếng Việt nói sao) ví dụ như anh muốn chạy cron trong container (chi tiết khúc sau)
2.
anh chưa nhìn thấy được mục đích của cái docker là để đóng gói, thuận tiện cho việc mang vác, triển khai... nó không phải là thứ để anh không cần phải biết cách làm việc với OS và vẫn làm được việc, cho nên cái ý anh nói đi nói lại rằng docker thì cũng phải biết viết script này nọ kia cho vào Dockerfile nó hiển nhiên quá nhưng anh vẫn coi nó là cái gì quan trọng lắm mà lặp đi lặp lại...
dài dòng về thằng docker đủ rồi, giờ tôi nói về chi tiết một chút, lấy cái use case của anh ra nói chuyện cho dễ:
anh nói là cần cào dữ liệu của một site, site ấy nó block IP 6 tiếng nếu request quá 100, số trang cần quét là 10000 trang (con số tôi phịa ra cho dễ nói chuyện)
cách xử lý hiện tại của anh là chạy qua proxy, anh xin được ở đâu một mớ proxy mà nói chung là cũng lởm cái sống cái chết, hẹn giờ 6 tiếng chạy một lần...
làm theo cách này có 2 điểm dở:
-
phụ thuộc vào proxy, một ngày kia anh xin không được cái nào mà proxy chết hết thì anh làm sao?
-
anh phải duy trì một con VPS resource đủ lớn để điều khiển một đống crawler chạy song song thông qua một lũ proxy, mà con VPS này làm xong việc là đứng chờ cron -> nói chung tốn tiền
tôi đề xuất làm lại theo phương án sau:
-
anh build một cái image, tuỳ theo script quét của anh chạy cái gì, ví dụ python thì đơn giản nhất là anh extend cái image python official, thêm hai dòng copy code của anh vào và set ENTRYPOINT cho nó chạy thôi...
-
anh làm thêm một cái project con con của terraform, cho nó connect với đủ thứ cloud provider mà anh biết, AWS và GCP gì gì ấy, mục đích là để tạo một cái network rồi launch cái image của anh tạo ra trong bước 1, gán network ấy cho cái container ấy để nó đi cào dữ liệu về thôi... request đủ 90 cái (an toàn) thì ngưng, tắt, xoá network, trả resource...
cái bước launch thì tuỳ, thích thì launch cái terraform bằng tay, mỗi lần launch 100 container đi cho nó nhanh... hoặc nếu thích hẹn giờ thì tuỳ, nhưng hẹn giờ để chạy terraform nó là bad practice, tuỳ anh cân nhắc...
nó giải quyết được vấn đề proxy của anh, cái ấy nó unreliable quá không ai tính vào yêu cầu công việc cả, requirements mà lại có dòng "xin thằng Nam 500 cái proxy" thì tôi nghe xong sợ vãi tè...
nó giải quyết được vấn đề tiền của anh, có thể tốn hơn, nhưng chắc chắn là nhanh hơn... thời gian là tiền bạc...
trước khi kết thúc để đi tắm, tôi lấy một cái ví dụ thực tế cách đây vài năm...
gitlab, thằng này chắc các anh biết, cách đây đâu 3-4 năm, nó có cung cấp một cái image để tự launch gitlab trên server riêng...
cái image này nó bê nguyên con từ cái script puppeteer để launch gitlab trên một cái VPS, tức là lần đầu launch cái image này là puppeteer nó chạy phành phạch, setup abcxyz tất cả các thứ từ đầu tới cuối y như một cái VPS... trong cái container có một đống service, từ php-fpm cho tới mysql các kiểu...
đây là điển hình của dùng sai cách thằng docker, anti-pattern khủng khiếp... sau đấy một đống image gitlab khác do người khác làm chạy ngon lành, không ai dùng cái image "chính hãng" kia cả...
rồi thì tất nhiên gitlab nó cũng khôn ra và publish image mới chuẩn hơn...
ví dụ này để anh thấy rằng thằng gitlab chắc cũng không thiếu người giỏi cỡ anh, mà nó còn có lúc chưa hiểu cách dùng docker, thì các anh ngại gì mà còn cố chấp...
các anh có dùng hay không không bổ béo gì cho tôi cả, có béo là béo các anh (nếu nó phù hợp) cho nên đừng nghĩ tôi là fan cuồng bênh vực ba cái thứ e-idol, tôi già rồi...
@prescolt tôi chạy cron backup cho voz mấy năm nay rồi và tôi khẳng định là chạy cron trong container bình thường, nó anti pattern thật nhưng trường hợp này tôi coi nó là ngoại lệ chấp nhận được... điều ấy chỉ chứng minh là làm được tốt thôi, còn làm thế nào thì anh tự học tôi không rảnh dạy anh... anh vẫn còn giữ cái kiểu tranh luận công kích cá nhân ấy thì tôi không có hứng thú nói chuyện tiếp... nên nhớ tôi chưa một lần chửi mắng xúc phạm gì anh hết...