Thắc mắc về ưu điểm của containerization (docker)

Hi there, em dự định học docker có một số thắc mắc mong được giải đáp.

  1. Mong muốn của em là config 1 lần duy nhất deploy được ở mọi nơi. Thông thường em code chỉ tốn 1 ngày mà setup VPS để deploy code đó mất 3 ngày vì code chạy từ IDE rất mượt nhưng lúc build và deploy thì sinh ra rất nhiều lỗi, không biết docker có giải quyết được không?

  2. docker có giống ghost windows ?

  3. Đường dẫn thao tác với file I/O trong code VD: app cần lưu file người dùng up lên, trong code đặt đường dẫn cho windows thì dùng ký hiệu \ còn linux thì /. windows bắt đầu từ C:\ còn linux thì bắt đầu với /. Có cách nào đặt đường dẫn kiểu trừu tượng trong code như /file/, lúc deploy thì nó tự hiểu nên lưu vào thư mục nào. Docker có làm được không?

  4. local thì chạy tomcat9 còn server tomcat 8.5, local SQL server 2019, server thì version 2014, máy dev chạy JDK 17, môi trường production JDK 1.8, …

  5. Laptop dev chạy windows, server production chạy linux.

  6. Backend thường sẽ có 3 phần:

    • source code đã biên dịch.
    • database service.
    • Thư mục lưu media (video, audio, img, static file)

    Cả 3 cái này gom chung vào image docker được không? Cách cũ là tự cài database server-> tạo tài khoản database -> set port database. Cài web server (apache, nginx, …), cài thư mục chứa file.

Cảm ơn mọi người đã giải đáp.

cái này thì còn tùy vào lỗi đó là lỗi gì, nếu bạn đã fix được thì bạn cũng sẽ phải hiểu là nó có liên quan docker không

không, ít nhất thì theo hiểu biết của mình thì là không
có đặc điểm gì mà bạn lại cho rằng hay đặt ra thắc mắc như vậy, bạn có thể share không?

cái này cũng không liên quan docker
cái này là vấn đề của code, bạn phải code làm sao để code của bạn có thể chạy được ra đúng đường dẫn cả trên window hay linux hay …
giải pháp:

  • đường dẫn nên dung tương đối (tính theo thư mục bạn deploy)
  • cấu hình đường dẫn
  • vấn đề về window \ hay linux /thì bạn có thể giải quyết bằng các thưc viện trong code (hầu như build in ngôn ngữ nào cũng có, để join các thành phần của các đường dẫn)

luôn cố gắng dev trên môi trường giống với production nhất, từ os, run time, database…
trong trường hợp bạn vẫn muốn giữ y môi trường dev của mình, nhưng vẫn muốn có môi trường giống production để test code trước khi commit/push code, hoặc dùng để dev luôn thì dùng docker là hợp lý

việc bạn dev trên window và deploy trên linux cũng không có vấn đề gì, đường dẫn thì như mình đã nói bên trên

có vẻ như bạn đang muốn cái gì đó “một phát ăn ngay” để đỡ phải tốn công nhất
nhu cầu này cực kì chính đáng, chỉ là bạn đang nghĩ sai hướng mà thôi
giải pháp:

  • sử dụng file chứa biến môi trường khác nhau cho các môi trường khác nhau, deploy thì chỉ replace 1 rồi build và start thôi
  • nếu phức tạp hơn, gồm nhiều thao tác thì bạn có thể viết thành 1 file bash/script để chạy

docker hay containerization thì phù hợp cho việc test hay dựng môi trường test cho nhanh hoặc phục vụ nhiều môi trường/runtime khác nhau trên cùng một server (uat chẳn hạn) thì sẽ phù hợp hơn
production không phải đồ chơi (à thì cũng có thể) nên làm cho bài bản một chút
tất nhiên, production nghiêm túc thì vẫn có thể sử dụng docker, nhưng để ra quyết định này, thì người ra quyết định cũng có lý do nhất định (có thể chỉ là thích, nhưng phải hiểu rõ những vấn đề liên quan)

được, docker compose hoặc dockerfile hoặc … một đoạn script để build container

6 Likes

Tớ đồng ý với @kisuluoibieng.
Dưới đây là một số điểm bổ sung thêm cho câu trả lời trên thôi nha :smile:

  1. Mong muốn của em là config 1 lần duy nhất deploy được ở mọi nơi. Thông thường em code chỉ tốn 1 ngày mà setup VPS để deploy code đó mất 3 ngày vì code chạy từ IDE rất mượt nhưng lúc build và deploy thì sinh ra rất nhiều lỗi, không biết docker có giải quyết được không?

Về cơ bản, nếu cậu đảm bảo docker image cậu build ra chạy được trên máy cậu, image đó sẽ chạy được ở bất kỳ đâu, miễn là nơi đó có docker được cài sẵn.
Nếu cậu dùng docker, cậu sẽ mất thời gian để tạo ra Dockerfile ở local, và không mất thời gian để setup trên bất cứ máy nào (với đk các máy đều cài docker).

Mặt khác, deploy docker image nhanh hơn rất nhiều so với việc cài đặt mà cậu nói. Thử tưởng tượng, cậu có 1 service có lượng traffic tăng đột biến, cậu có muốn:

  • Dành 1 ngày để cài đặt 15 server mới nhằm tăng tải cho service
  • Hay cậu muốn tạo 15 container trong vài giây với mục đích tương tự?

Đó là một lý do rất lớn mà khi deploy 1 hệ thống microservice, việc sử dụng container technology như docker là bắt buộc.

  1. docker có giống ghost windows ?

Nope.
Cơ chế 2 thứ hoàn toàn khác biệt:

  • Ghost lưu trữ snapshot của windows trên ghost image & dùng nó để cài đặt lại windows
  • Docker sử dụng linux namespace để tạo ra container đóng gói mọi thứ bên trong nó.

2 phần mềm này cũng phục vụ cho các mục đích hoàn toàn khác nhau:

  • Ghost dùng để backup windows
  • Docker là công nghệ container
  1. local thì chạy tomcat9 còn server tomcat 8.5, local SQL server 2019, server thì version 2014, máy dev chạy JDK 17, môi trường production JDK 1.8, …

Cậu có thể build các image khác nhau. Tuy nhiên, như @kisuluoibieng có đề cập, cậu nên sử dụng 1 setup đồng nhất giữa các môi trường. Nó sẽ giúp cậu không rơi vào tình cảnh “ơ, nó chạy trên máy tôi mà” khi cậu deploy fail trên production :sweat_smile:

,Cả 3 cái này gom chung vào image docker được không?

Có thể đưa 3 thứ đó vào chung 1 image được. Tuy nhiên, cậu thực ra chẳng có lý do gì để làm vậy cả :smile:
Bởi vì 3 đơn vị đó độc lập với nhau. Cài chung 1 server sẽ khiến cậu say goodbye với scalability.
Như @kisuluoibieng đề cập, cậu nên dùng docker compose cho việc này, và deploy mỗi đơn vị trên 1 container riêng.

Hope it helps!

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?