Chuyển đến nội dung chính

Docker: Tạo Dockerfile cho project ASP.NET Core - Part 5

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 Dockerfile
docker 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

Time limit < 24h (i.e. :2h,:60s,:30m)
$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://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-6.0

https://viblo.asia/p/su-dung-docker-push-de-publish-mot-image-len-docker-hub-L4x5xgYblBM


Nhận xét

  1. Debug .NET: https://code.visualstudio.com/docs/containers/debug-netcore

    Trả lờiXóa
  2. https://medium.com/@betz.mark/ten-tips-for-debugging-docker-containers-cde4da841a1d

    Trả lờiXóa
  3. Tham khảo: https://stackify.com/a-start-to-finish-guide-to-docker-for-net/

    Trả lờiXóa
  4. Automatically 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óa
  5. Docker 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óa
  6. https://dev.to/laibazahoor1/deploying-angular-app-with-multi-stage-docker-file-plus-tips-tricks-on-image-optimization-87m

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.