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
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ụngVD:
dotnet run – 5
Tạo file Dockerfile
Trong Dockerfile, có thể chia ra làm 3 phần cơ bản:- Sử dụng base image
- Install dependency
- 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ớiENV : Đị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
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.
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 imagedocker 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
docker attach --sig-proxy=false core-counter
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish
Trả lờiXóa