Nên build project thành docker image ở máy dev hay build image ở server

Dạ em chào anh chị,
Có 2 cái để deploy project bằng docker:

  • Build image ở máy dev -> publish lên docker registry.
    – Ưu điểm: Máy dev thường cấu hình sẽ mạnh hơn server nên build nhanh hơn đỡ bị lag.
    – Nhươc điểm: phải upload nhiều image lên docker hub nếu project có nhiều service

  • Máy dev commit lên git -> trên server pull về và chạy docker compose, trong file compose có config để build image.
    – Ưu điểm: Có thể kết hợp với jenskin làm CI/CD, không bị phụ thuộc vào dockerhub
    – Nhược điểm: build trên server sẽ bị lag server

Em tạo ra topic này vì trước giờ em toàn dùng cách 1 đột nhiên một này em build image ở máy dev thành công nhưng đến công đoạn publish lên docker hub thì bị lỗi unauthorization nên em nghĩ đến cách 2 và tự nhiên có động lực để cài jenskin luôn.

Chúc cuối tuần vui vẻ ạ

docker image đó dùng cho việc gì?
deployment?
nếu là deployment thì deploy môi trường tính chất thế nào? dev/preview/staging/uat/sit/production?

use-case bạn chưa rõ ràng, đã chưa rõ ràng thì không có đúng sai, hợp lý không hợp lý, thích thì làm thôi

2 Likes

@kisuluoibieng dạ docker image của em dùng để dev và test.

trong docker image đó bạn sẽ chứa những gì?

Dạ 3 image của em build theo template này, team em code xong thì push lên git rồi SSH vào server chạy lệnh docker compose up

https://github.com/docker/awesome-compose/tree/master/react-java-mysql

cái này là hướng dẫn để bạn có thể deploy project bằng docker
bạn lại lái nó thành “build/publish” image lên registry, đi hơi xa

mục đích cùa docker là tạo ra cho bạn một môi trường đồng nhất khi triển khai (và cả dev), chỉ có thế
build image thì thường là cái gì đó stable, ít thay đổi
bạn lại coi đó là nguyên 1 app mà build đẩy nó lên docker registry, rồi server lấy về chạy, cái đó không giống hợp lý, code bạn update thường xuyên mà

bạn đưa ra lý do bị lag nó cũng không hợp lý, môi trường cho việc deployment chỉ nên phục vụ cho việc chạy ứng dụng, chứ không phải là build ứng dụng, thậm chí còn cài cả jenkins trên đó
tất nhiên là kinh phí thấp thì có thể tận dụng 1 server làm nhiều việc, nhưng cũng không nên lấy cái đó ra làm lý do,
sao phải làm cho phức tạm như thế, rồi lại phải clean image, rồi lưu log các thứ, chưa kể là cấu hình thay đổi…

mình cũng không biết cái bạn làm là đơn giản hay là phức tạp, nhưng mình khá quan ngại với cách làm của bạn (cách 1)
hoặc là mình đang hiểu sai ý bạn hoặc là nếu mình hiểu đúng thì bạn đang lạm dụng docker

3 Likes

Cảm ơn anh. Vậy chốt lại là docker hub là nơi để chứa các image stabe chứ không phải chỗ để lưu tạm image cho server pull về, và em đang dùng docker hub là nơi để truyền image qua lại giữa máy tính cá nhân và server là sai mục đích của docker.

nếu server deploy bị hạn chế về resource, build chậm hay build không nổi thì bạn có thể tạo file bash/shell/make ở local (đại loại là những file chứa sẵn một số lệnh nào đó để gọi cho nhanh)
setup các lệnh build/zip/scp/ssh

ở trên server deploy, bạn cũng viết 1 file bash chứa sẵn các lệnh unzip/restart (hoặc có thêm các lệnh như npm i đối với project dùng nodejs). Lệnh ssh cuối ở trên dùng để chạy file này

khi cần deploy chỉ cần gọi 1 lệnh

còn đối với CICD, không không hẳn chỉ là deploy app/service, nó còn có thể làm nhiều thứ khác nữa, như là verify pull reques (có work hay không), notification kết quả
ở đây chưa kể là còn có thể deploy cho nhiều môi trường

bạn dùng docker tạo image thì sẽ rất khó khăn để làm những chuyện kia, hơn nữa cũng rất khó để verify được bạn đã bỏ gì trong image đó, thậm chí publish xong phát hiện ta viết thiếu dấu ! trong câu if lại commit rồi lại publish image …

và n câu chuyện khác nữa …

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