thắc mắc Build nhiều project docker trên cùng server

zero2603

Senior Member
Chào các thím, mình mới học docker được mấy hôm, đang có một số thắc mắc.
Giả dụ như mình có 1 project A sử dụng php + mysql, được build bằng docker-compose và đã deploy lên server.
Sau đó mình lại cần build 1 project B sử dụng nodejs + mysql, cũng bằng docker-compose lên server đó. Hai project là hoàn toàn riêng biệt, không liên quan đến nhau.
Thắc mắc của mình là:
  • Mình thấy trên các site dạy về docker hay best practice thì thường hay để db là 1 service bên trong docker-compose. Như vậy nếu nhiều dự án dùng chung 1 loại service db (như vd trên là mysql) sẽ vẫn để nhiều container db riêng cho từng project hay là như nào? Vì mình thấy nếu để riêng sẽ rất tốn bộ nhớ.
  • Những trường hợp mà server chứa nhiều dự án có dùng chung môi trường như php, nodejs,... hay dùng chung db service thì không nên dùng docker có đúng không?
Mong các thím giải đáp giúp mình :)
 
- Tuỳ vào resource bạn có. Nếu limited resource thì dùng 1 DB server, bên trong chạy nhiều DB, mỗi DB 1 service. Tuy nhiên, nhớ lưu ý cách dùng compose file cho đúng cách.
- 1 compose file for shared infra: db server, redis, rabbitmq, kafka
- các service có thể nằm trong các compose file khác nhau, lưu ý unique service name
- đề nghị là gộp chung tất cả service vào trong 1 compose file. Để tất cả compose file vào 1 repo riêng không liên quan tới code. Update thì chỉ thay image/tag thôi dễ quản lí

- Tại sao dùng chung DB hay dùng chung môi trường thì lại không nên dùng container và docker? Nó chỉ là virtualization thôi mà? Bản thân container đã chứa riêng môi trường để chạy app rồi.
 
- Tuỳ vào resource bạn có. Nếu limited resource thì dùng 1 DB server, bên trong chạy nhiều DB, mỗi DB 1 service. Tuy nhiên, nhớ lưu ý cách dùng compose file cho đúng cách.
- 1 compose file for shared infra: db server, redis, rabbitmq, kafka
- các service có thể nằm trong các compose file khác nhau, lưu ý unique service name
- đề nghị là gộp chung tất cả service vào trong 1 compose file. Để tất cả compose file vào 1 repo riêng không liên quan tới code. Update thì chỉ thay image/tag thôi dễ quản lí
Thank thím, mình đang hiểu trường hợp thím nói là đã xác định từ trước sẽ cài những project nào lên server nên sẽ có kế hoạch tách service nào ra để riêng. Nhưng ý mình ở đây là khi mà muốn deploy project B lên trong khi ở đó đã cài sẵn project A với các service dành riêng cho A. B cũng có dùng mysql. TH này thím sẽ tách mysql ra để dùng chung cho A và B hay là mỗi project dùng riêng 1 container mysql?
 
Thank thím, mình đang hiểu trường hợp thím nói là đã xác định từ trước sẽ cài những project nào lên server nên sẽ có kế hoạch tách service nào ra để riêng. Nhưng ý mình ở đây là khi mà muốn deploy project B lên trong khi ở đó đã cài sẵn project A với các service dành riêng cho A. B cũng có dùng mysql. TH này thím sẽ tách mysql ra để dùng chung cho A và B hay là mỗi project dùng riêng 1 container mysql?
Vote dùng riêng để sau này dễ fix với bê đi chỗ khác. Tách ra cũng được cơ mà map port ra nhớ secure cho cẩn thận :rolleyes:
 
Vote dùng riêng để sau này dễ fix với bê đi chỗ khác. Tách ra cũng được cơ mà map port ra nhớ secure cho cẩn thận :rolleyes:
Mình cũng nghĩ là dùng riêng tiện hơn, vì nếu tách ra thì chỉ là tối ưu cho server đó, và lại bất tiện ở local, test server,... Nhưng mà một service db như mongodb đã ngốn vài trăm MB thì việc dùng nhiều container như thế cũng không hẳn tốt. Chính vì thế mình mới muốn hỏi các thím thường thì sẽ sử dụng docker như thế nào cho tối ưu nhất
 
DB Server ngốn RAM rất nhiều. Chứ không phải image size nên alpine không liên quan ở đây. Default của MySQL là 512MB. Bây giờ nếu resource là critical requirement thì phải estimate xem có cần nhiều hơn 1 DB server hay không.

Trước hết bạn nên có capacity planning là QPS, connections cần là bao nhiêu, sau đó load test DB query trên local để xem performance rồi tính tiếp.

Còn về mặt infra thì:

Giả sử nếu bạn chạy tất cả service và DB server trên cùng 1 machine thì bạn có thể để MySQL trong cùng 1 network với project A và B (nghĩa là A và B chung 1 network nhé - có thể là 1 security issue) rồi dùng service name. Không nhất thiết phải map port ra ngoài.

Tuy nhiên best practice đúng là service liên quan đến project nào thì own DB của project đấy. Nếu bạn có dư resource thì dùng nhiều DB server. Nếu không thì dùng 1 DB server nhiều DB rồi set user với role riêng biệt là được.
 
Back
Top