Hướng dẫn nodejs docker-compose - nodejs docker -omp
Mở đầuNgày nay, việc phát triển web có rất nhiều lựa chọn, không còn gói gọn trong những stack lâu đời như LAMP, Ruby on Rails ... nữa. Đặc biệt nổi lên gần đây là MEAN Stack (MongoDB, ExpressJS, AngularJS, NodeJS), sử dụng hoàn toàn 1 loại ngôn ngữ là Javascript để phát triển website (à đương nhiên vẫn có HTML, CSS (yaoming) ). Việc cài đặt môi trường để phát triển sử dụng MEAN Stack cũng là một vấn đề nếu bạn không quen sử dụng Linux, Mac, hay đang dùng Windows (tin tôi đi, bạn không muốn cài đặt cái gì để dev trên Win đâu, hiện thời nó vẫn là 1 cực hình ). Do đó trong bài viết này, tôi sẽ giới thiệu với các bạn một cách sử dụng Docker và Docker-Compose để thiết lập môi trường lập trình với MEAN Stack mà có thể chạy tốt trên Windows, Mac hay Linux, đúng với tinh thần lười của anh em ta, install one and develop anywhere ). Do đó trong bài viết này, tôi sẽ giới thiệu với các bạn một cách sử dụng Docker và Docker-Compose để thiết lập môi trường lập trình với MEAN Stack mà có thể chạy tốt trên Windows, Mac hay Linux, đúng với tinh thần lười của anh em ta, install one and develop anywhereCài đặt DockerNếu như Windows, Mac và Linux là các môi trường khác nhau dùng để khởi chạy máy tính, thì khi phát triển phần mềm, chúng ta mong muốn có một môi trường thống nhất và gần với môi trường thực tế hệ thống sẽ sử dụng nhất để tránh những khó khăn có thể gặp phải khi cài đặt môi trường khác nhau, hoặc "em không hiểu sao máy em chạy ngon mà server thì lỗi". Và Docker là một ứng dụng được sinh ra để làm điều này. Với những khả năng như ABC, xyz ... (ABC, xyz là gì mời các bạn tra Google), Docker sẽ cho chúng ta một môi trường tách biệt hoàn toàn với môi trường của hệ điều hành trong máy của chúng ta, và đảm bảo cho dù bạn có sử dụng trên hệ điều hành nào đi nữa thì môi trường đó vẫn trước sau như một. Nguyên lý khi sử dụng Docker là mỗi lần chạy Docker, bạn sẽ khởi tạo một container từ một image đã được tạo ra, container đó sẽ chạy một câu lệnh để làm một tác vụ gì đó. Dựa trên đặc điểm này, chúng ta sẽ tạo hai image, một image cho việc chạy database MongoDB, một image cho việc chạy Server NodeJS sử dụng ExpressJS. Lý do tại sao lại sử dụng 2 image như sau :container từ một image đã được tạo ra, container đó sẽ chạy một câu lệnh để làm một tác vụ gì đó. Dựa trên đặc điểm này, chúng ta sẽ tạo hai image, một image cho việc chạy database MongoDB, một image cho việc chạy Server NodeJS sử dụng ExpressJS. Lý do tại sao lại sử dụng 2 image như sau :
Đương nhiên vẫn có cách để tạo một image chứa cả NodeJS và MongoDB, các bạn có thể thử với thứ tự sau :
Và sau đây tôi xin hướng dẫn sử dụng cách đầu tiên, mỗi image một chức năng khác nhau bằng cách sử dụng Docker-compose cho nó đơn giản.Docker-compose cho nó đơn giản. Tuy nhiên trước hết chúng ta cần cài Docker, tạo file Dockerfile để cài NodeJS, các bạn có thể dùng các image sẵn có trên mạng, tuy nhiên cá nhân tôi dùng file setup riêng từ CentOS 6, vì server tôi sẽ deploy là dùng CentOS 6, các image của Node từ Docker dùng image khác, thừa này thiếu nọ, tôi không thích vì sẽ khác với môi trường production Dưới đây là file Dockerfile của tôi:
Giải thích: Các câu lệnh trên sẽ lần lượt lấy image CentOS 6 làm gốc, cài các lib dev cần thiết, download và cài node phiên bản 4.4.5, sau đó copy thư mục hiện hành vào thư mục Việc copy thư mục hiện hành và set thư mục mặc định sẽ giúp các bạn việc sau: code của các bạn ở trên thư mục chứa file Dockerfile sẽ được copy vào container trên Docker và có thể dùng để chạy Node server. 2 lệnh set chmod cho Vậy là đã xong file Dockerfile. Tiếp đến sẽ là Docker-compose Cài đặt và cấu hình Docker-composeSau khi có file Dockerfile, mình sẽ sử dụng file image này cho web server (NodeJS, Express), còn Database mình sẽ sử dụng image MongoDB có sẵn của Docker. Tuy nhiên việc cài đặt, rồi link giữa 2 container khá là lằng nhằng, mất thời gian, nên mình sẽ sử dụng tool có tên là Docker-compose để làm hộ mình.Docker-compose để làm hộ mình. Giá trị của Docker-compose sẽ là giúp các bạn khởi chạy nhiều container, liên kết chúng vào với nhau thông qua 1 file setting, giúp chúng ta không cần viết script mỗi lần khởi chạy nữa, chỉ cần một câu lệnh 0 là môi trường của bạn sẽ sẵn sàng để làm việc.Docker-compose sẽ là giúp các bạn khởi chạy nhiều container, liên kết chúng vào với nhau thông qua 1 file setting, giúp chúng ta không cần viết script mỗi lần khởi chạy nữa, chỉ cần một câu lệnh 0 là môi trường của bạn sẽ sẵn sàng để làm việc.Không nói nhiều nữa, dưới đây là nội dung file 1 cần thiết cho việc chạy 2:
Chi tiết ý nghĩa của từng dòng lệnh các bạn có thể tìm hiểu trên google, ở đây ý nghĩa của chúng đại khái là:
Vậy là xong, bạn đã tạo ra 2 service có thể dùng để chạy server NodeJS và server database (mongo), còn một bước cuối cùng sẽ là file 9 cùng file startup.sh .File 9 (có thể tạo bằng 2, nhưng trong trường hợp bạn không thích cài npm lên OS thật, thì copy ở đây là xong ):):
Ở đây file của mình hơi nhiều dependencies, nhưng chủ yếu bạn chỉ cần express + mongooes lúc đầu là đủ Tiếp theo là file
File này sẽ là file khởi chạy của service web mỗi khi 0. Mục đích của file này là sẽ chạy lệnh 5 nếu như không tìm thấy thư mục node_modules trong thư mục hiện tại, với các đặc điểm sau:
Sau khi xong xuôi các file trên, các bạn sẽ có một môi trường chạy ExpressJS cùng MongoDB để phát triển, nếu muốn dùng MySQL, các bạn chỉ cần cần đổi service database sang mysql (hoặc thêm service), sau đó nhớ add depends để service db chạy trước service web. Một lưu ý nữa là mình dùng 7. Trong trường hợp webservice của các bạn sử dụng file khởi chạy là file khác, mời đổi lại tên file. Đồng thời việc sử dụng nodemon sẽ giúp code của các bạn ngay khi có thay đổi sẽ được cập nhật lên web service bằng cách... khởi động lại web service Vì thời gian khởi động webservice của Express rất là không đáng kể, nên bạn có thể bật Sublime, bấm Ctrl + S liên tục để xem output thông báo server khởi động lại của ExpressJS Vì thời gian khởi động webservice của Express rất là không đáng kể, nên bạn có thể bật Sublime, bấm Ctrl + S liên tục để xem output thông báo server khởi động lại của ExpressJS Ngoài ra có một lưu ý nhỏ khi dùng service mongo db như trên thì connection link sang MongoDB sẽ là : 9 với 3 là tên service. Ở đây mình dùng cổng mặc định là 27017 nên không cần phải config cổng, nếu dùng cổng khác các bạn tự thêm thành 1 là ok.Trong trường hợp bạn muốn update file package.json thì sao? Chúng ta sẽ có những cách sau:
Trên đây là hướng dẫn cài đặt môi trường phát triển MEAN Stack sử dụng Docker đang được mình sử dụng trong công việc, hy vọng rằng sẽ giúp ích được cho các bạn muốn làm quen với NodeJS |