Dockerize ứng dụng .NET của bạn một cách dễ như ăn bánh 🎂

Đây là phần nối của bài viết đầu tiên về CI với Jenkins. Ở bài viết này mình sẽ chia sẻ cho các bạn cách để có thể dockerize ứng dụng .NET siêu dễ luôn. Dockerize các bạn cứ hiểu đơn giản là cách bạn chạy ứng dụng bằng docker, có thể là Node app, Go app, React app... Ở đây mình sẽ làm ví dụ bằng .NET ;>

Tại sao chúng ta cần docker? sao không chạy như bình thường bằng cách nhấn F5 trong IDE nhỉ? Nếu bạn đã gặp trường hợp code trên máy thằng bạn chạy rất mượt nhưng trên máy mình thì KHÔNG CHẠY và x1000 sát thương nếu đúng lúc thuyết trình. Trong cả quá trình bạn deploy coder lên các server cũng sẽ rất phức tạp nếu bạn có nhiều server. Vd: mình có 3 server chạy các hệ điều hành khác nhau MacOS , Window, ubuntu. Mình sẽ phải chui vào 3 server để cài những software để có thể chạy ứng dụng của mình, nghĩ thôi đã thấy ác mộng ròi. Đây là lúc Docker phát huy tác dụng cực mạnh, lúc này bạn chỉ cần build tất cả vào 1 cục gọi là Image(nó chứa tất cả các bước cầu hình để chạy ứng dụng) khi này thì mọi thứ đã đơn giản quá ròi, RUN image đó ứng dụng của bạn sẽ được chạy. Nói tới đây chắc các bạn đã hình dung được lợi ích của Docker và tiếp theo đây mình sẽ đi vào nội dung chính của bài viết này.

1. CÀI ĐẶT MÔI TRƯỜNG DOCKER

Cài đặt Docker engine, docker compose trên máy (nếu chưa có). Máy Chạy window thì sẽ cần setup WSL2

2. GENERATE DOCKERFILE VÀ DOCKER COMPOSE

Mình đã chuẩn bị 1 project demo bằng .NET 


Mở terminal lên chạy lệnh docker init, Docker sẽ tự động gen cho những file cần thiết để thực hiện dockerize cho ứng dụng.

docker init (hình 2)

Chọn application platforplatform, main project và cứ next tới khi hoàn thành.
Giải thích: Dockerfile đây là 1 file text chứa các câu lệnh, từ những lệnh trong Dockerfile đó sẽ build thành Image như mình đã đề cập ở phần trên (hình 3).



Tại vì đây không phải bài viết sâu về docker nên mình sẽ chỉ mô tả ngắn gọn nội dung của dockerfile sau:
Tạo stage build base image là dotnet/sdk:7.0-alpine sau đó COPY . /source(copy tất cả các thư mục và file hiện tại và trong thư mục có tên là /source). WORKDIR /source/WebAPI (xác định thư mục làm việc chính của container là WebAPI). Chạy lệnh publish đẩy output vào thư mục /app. tiếp theo tạo mới 1 stage khác dotnet/aspnet:7.0-alpine để run app, xét thư mục làm việc chính là /app . Sao chép output từ stage build sang stage final. Tạo User mới tên appuser và sử dụng user đó làm user mặc định, Khởi động lệnh để chạy app khi container chạy. Ở đây dùng 2 stage mục tiêu là để tối ưu hóa kích thước image vì nếu chỉ dùng 1 stage thì phải cài đặt cả SDK lẫn runtime, dư thừa nhiều thứ và image cuối cùng sẽ rất lớn (>1GB). Việc tách ra thành 2 stage cho phép loại bỏ phần SDK sau khi build xong, giảm tối đa kích thước xuống còn ~100MB với runtime image nhỏ gọn hơn.

Giải thích: compose.yaml để config các services(container) cho application. Không giống như Dockerfile (build các image). Docker compose dùng để build và run các container (hình 4). Mình sẽ lên 1 bài viết khác để nói sâu hơn về docker compose sau ;>


=> Chốt lại là khi bạn dùng docker init thì sẽ auto được gen ra các file trên, có thể chỉnh sửa lại cho phù hợp nhưng mình thấy cơ bản là nó đã quá đủ.

3.BUILD VÀ CHẠY ỨNG DỤNG TRONG DOCKER
docker-compose up

Nó sẽ tự build Docker image dựa trên Dockerfile và stage "final", sau đó khởi chạy một container từ image đó, public ra cổng 8080 như đã cấu hình bên file compose.yaml (hình 5)


docker-compose down

Để dừng và xóa luôn container đã tạo
Mình dùng REST Client để test (hình 6,7) đã thành công lấy được data của ứng dụng dotnet chạy trong container docker qua port 8080 như cấu hình ở file compose.yaml



=> vậy là mình đã thành công đưa ứng dụng dotnet chạy trong docker. Cảm ơn các bạn đã quan tâm và hy vọng bài viết sẽ mang lại giá trị cho mọi người. 
Hẹn gặp lại ở các bài viết sau!

Đăng nhận xét

Mới hơn Cũ hơn

Biểu mẫu liên hệ