Trong bài viết này, mình sẽ tổng hợp các bước để tạo file Dockerfile cho project ASP.NET Core
Tạo project ASP.NET Core
Tạo project ASP.NET Core từ template có sẵn của Visual Studio
Ở đây bạn cần chú ý lệnh publish trong dotnet:dotnet publish [<PROJECT>|<SOLUTION>] [-a|--arch <ARCHITECTURE>]
[-c|--configuration <CONFIGURATION>]
[-f|--framework <FRAMEWORK>] [--force] [--interactive]
[--manifest <PATH_TO_MANIFEST_FILE>] [--no-build] [--no-dependencies]
[--no-restore] [--nologo] [-o|--output <OUTPUT_DIRECTORY>]
[--os <OS>] [-r|--runtime <RUNTIME_IDENTIFIER>]
[--self-contained [true|false]] [--no-self-contained]
[-s|--source <SOURCE>] [-v|--verbosity <LEVEL>]
[--version-suffix <VERSION_SUFFIX>]
dotnet publish -h|--help
Bạn cần nắm rõ các lệnh trong để build và run ứng dụng ASP.NET
dotnet publish -c Release -o out
Publish source code ra folder \out
cd out
dotnet WebAppUsingDocker.dll
Di chuyển vào thư mục out và run web ASP.NET.Bạn gõ địa chỉ https://localhost:5100 để vào trang web
Tạo Dockerfile
Giả sử bạn có file Dockerfile như sau:# syntax=docker/dockerfile:1
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app
#Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
#Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
#Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "WebAppUsingDocker.dll"]
Giải thích
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
Copy multi-source tới đường dẫn dest. Ở VD trên, do toàn bộ file đã được copy vào thư mục gốc nên bạn chỉ cần chạy lệnh dotnet để chạy trang we
WORKDIR
Bạn tưởng tượng khi sử dụng WORKDIR, hệ thống sẽ tạo thư mục để cho bạn thực hiện các lệnh COPY, RESTORE, BUILD,...
The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile. If the WORKDIR doesn’t exist, it will be created even if it’s not used in any subsequent Dockerfile instruction.Trong Docker Best Practices khuyến khích:
... you should use WORKDIR instead of proliferating instructions like RUN cd … && do-something, which are hard to read, troubleshoot, and maintain.
Build và run website
Bạn cần mở Docker desktop và Powershell đang trỏ tới thư mục chứa file Dockerfiledocker build -t webappusingdocker .
docker run -d -p 8080:80 --name myapp webappusingdocker
Đưa Docker image lên Docker hub
Khi triển khai docker image ở local, bạn sẽ thường đặt tên theo dạng:docker build -t push-example .
Lệnh trên sẽ tạo ra một hình ảnh mới được dán nhãn là push-example. Khi triển khai trên máy local, chúng ta đơn giản chỉ cần dùng lệnh docker run để chạy, cùng với tên image cần chạy. Mặc dù công việc này dành cho việc triển khai cục bộ, nhưng quy ước đặt tên này không hoạt động khi tạo image cho Docker Hub.Khi bạn muốn đưa image lên Docker Hub, bạn phải đặt tên theo cú pháp sau:
<user-name>/<image-name>
Lý do: Docker Hub tổ chức các kho theo tên người dùng. Bất kỳ kho lưu trữ nào được tạo ra trong tài khoản của chúng ta đều bao gồm tên người dùng của chúng ta trong tên của Docker imageĐầu tiên, bạn cần đăng nhập vào Docker Hub
docker login
Username: username
Password:
Login Succeeded
Sau đó, bạn push image lên theo cú pháp trên trang Docker hub:
docker push user-name/image-name:tagname
Sử dụng ttl.sh để push image có thời hạn
Homepage: https://ttl.sh/
Lợi ích khi sử dụng ttl.sh:
- Pull và push image ẩn danh
- Image sẽ được xóa sau một khoảng thời gian
Cú pháp tương tự như khi bạn sử dụng Docker Hub
$ImageName = New-Guid #generate guide for naming image name
docker push ttl.sh/${ImageName}:1h #push image with time limit = 1h
docker pull ttl.sh/${ImageName}:1h #pull image
Tham khảo
https://viblo.asia/p/su-dung-docker-push-de-publish-mot-image-len-docker-hub-L4x5xgYblBM
Debug .NET: https://code.visualstudio.com/docs/containers/debug-netcore
Trả lờiXóahttps://medium.com/@betz.mark/ten-tips-for-debugging-docker-containers-cde4da841a1d
Trả lờiXóaTham khảo: https://stackify.com/a-start-to-finish-guide-to-docker-for-net/
Trả lờiXóaAutomatically copy *.csproj and keep folder structure: https://andrewlock.net/optimising-asp-net-core-apps-in-docker-avoiding-manually-copying-csproj-files-part-2/
Trả lờiXóaDocker image in production - câu chuyện 1GB hay 100MB: https://kipalog.com/posts/Docker-image-in-production---cau-chuyen-1GB-hay-100MB
Trả lờiXóahttps://dev.to/laibazahoor1/deploying-angular-app-with-multi-stage-docker-file-plus-tips-tricks-on-image-optimization-87m
Trả lờiXóa