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

Docker: Tạo docker file - Part 4

Trong bài viết này, mình sẽ hướng dẫn các bạn cách chứa một ứng dụng .NET bằng Docker.

  • Tạo và publish một ứng dụng .NET đơn giản
  • Tạo file Dockerfile for .NET
  • Build Docker image
  • Tạo và run Docker container

Docker platform sử dụng Docker engine để nhanh chóng xây dựng và đóng gói ứng dụng dưới dạng Docker image. Những image này được viết ở định dạng Dockerfile để được triển khai và chạy trong một container chứa nhiều lớp.

Tạo ứng dụng .NET Console Application

Trong cửa sổ PowerShell, bạn gõ lệnh

dotnet new console -o App -n DotNet.Docker

Bạn sẽ có cây thư mục như sau:


📁 containerize-a-net-app
    └──📂 App
        ├──DotNet.Docker.csproj
        ├──Program.cs
        └──📂 obj
            ├── DotNet.Docker.csproj.nuget.dgspec.json
            ├── DotNet.Docker.csproj.nuget.g.props
            ├── DotNet.Docker.csproj.nuget.g.targets
            ├── project.assets.json
            └── project.nuget.cache

Mở file Program.cs, thay thế bằng đoạn sau:
var counter = 0;
var max = args.Length != 0 ? Convert.ToInt32(args[0]) : -1;
while (max == -1 || counter < max)
{
    Console.WriteLine($"Counter: {++counter}");
    await Task.Delay(TimeSpan.FromMilliseconds(1000));
}
Bạn sử dụng
dotnet run -- <parameter>
để chạy ứng dụng
VD:
dotnet run – 5

Tạo file Dockerfile

Trong Dockerfile, có thể chia ra làm 3 phần cơ bản:
  1. Sử dụng base image
  2. Install dependency
  3. Truyền tham số như thế nào để tạo container từ image
#Use an existing docker image as a base

#Download and install dependency

#Tell the image what to do when it starts
#as a container

Ý nghĩa các câu lệnh:

FROM : Là base image để chúng ta tiến hành build một image mới trên image. Chỉ thị này phải được đặt trên cùng của Dockerfile

  • FROM <image> [AS <name>]
  • FROM <image>[:<tag>] [AS <name>]
  • FROM <image>[@<digest>] [AS <name>]

Vd: FROM ruby || ubuntu || mysql || mcr.microsoft.com/dotnet/sdk:6.0 AS build-env

MAINTAINER : thông tin của người phát triển Dockerfile

RUN : Sử dụng khi muốn thực thi các command trong quá trình xây dựng image

COPY : Copy một file từ host machine tới docker container
Vd: # Copy everything

COPY . ./
WORKDIR : image sẽ trỏ tới directory khai báo, nếu không có thì docker sẽ tự tạo mới
ENV : Định nghĩa các biến môi trường
CMD : Sử dụng khi muốn thực thi các command trong quá trình build container mới từ image
ARG — Định nghĩa giá trị biến được dùng trong lúc build image.
ENTRYPOINT — cung cấp lệnh và đối số cho một container thực thi.
EXPOSE — khai báo port lắng nghe của image.
VOLUME — tạo một điểm gắn thư mục để truy cập và lưu trữ data.
Trở lại với ứng dụng console application ở trên, chúng ta có file dockerfile như sau:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

# Copy everything
COPY . ./
# Restore as distinct layers
RUN dotnet restore
# Build and publish a release
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", "DotNet.Docker.dll"]

Giải thích 

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
WORKDIR /app

Đầu tiên, chúng ta cần định nghĩa image cần thiết cho ứng dụng. Trong trường hợp này là dotnet sdk 6.0
Sau đó, bạn cần thiết lập thư mục working.

Copy project file

COPY *.csproj ./
RUN dotnet restore
Tại sao chúng ta chỉ copy file *.csproj?
Vì trong file csproj có định nghĩa SDK và các thư viện trên nuget. Việc copy này sẽ làm cho chương trình chạy nhanh hơn.
Chạy ứng dụng
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
Mang ý nghĩa: chạy ứng dụng với command
Dotnet DotNet.Docker.dll

Tạo file .dockerignore

Bỏ qua copy các thành phàn không cần thiết vào image, chỉ giữ lại các thành phần thiết yếu, từ đó giảm được size.
# .dockerignore
Dockerfile
[b|B]in
[O|o]bj

Build ứng dụng

Bạn chạy câu lệnh:
docker build -t counter-image -f Dockerfile .
-t: đặt tên cho image
docker run -d -p 8080:80 --name myapp counter-image
-d: run container ở chế độ background
-p: setup port từ internal port (docker) ra bên ngoài external port
--name: đặt tên cho container, trường hợp này là myapp
Sau khi container chạy, bạn có thể kết nối với container đó để thấy output.
docker attach --sig-proxy=false core-counter
Chúc các bạn thành công!

Nhận xét

Đă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.