ZetCode

C# Docker

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何为 C# 应用程序使用 Docker。

应用程序容器化是一种 OS 级别的虚拟化方法,用于部署和运行分布式应用程序,而无需为每个应用程序创建一个完整的虚拟机。 使用容器,可以在单个主机上运行多个隔离的应用程序或服务,并访问相同的 OS 内核。 容器可以在裸机系统、云实例或虚拟机上运行。

Docker

Docker 是一个平台,供开发人员和系统管理员构建、运行和共享包含在容器中的应用程序。 Docker 提高了应用程序的可移植性和可伸缩性。 它提供应用程序隔离,从而消除了许多由库和环境差异引起的问题。 它有助于自动化开发和部署。 借助预定义的社区镜像,开发人员可以节省时间并改善他们的整体体验。

一个 Docker 镜像 是一个只读模板,其中包含创建 Docker 容器的说明。一个 Docker 容器 是镜像的一个可运行实例。

镜像存储在仓库中。Docker Hub 是官方 Docker 仓库。Docker Engine 是底层的客户端-服务器技术,它使用 Docker 的组件和服务构建和运行容器。

Dockerfile 是一个特殊的文件,其中包含构建 Docker 镜像所需的指令。

$ docker --version
Docker version 20.10.21, build baeda1f

这是我们使用的 Docker 版本。

C# Docker 控制台示例

在下面的示例中,我们将创建并运行一个非常简单的 Docker 镜像。 当我们运行镜像时,将执行一个控制台 C# 应用程序。

$ dotnet new console -o First

我们创建一个新的 C# 应用程序。

Program.cs
Console.WriteLine("C# in Docker");

Console.WriteLine(Environment.OSVersion);
Console.WriteLine(Environment.Version);
Console.WriteLine(Environment.MachineName);

该应用程序是一个控制台程序。 它打印一条消息和一些环境详细信息。

Dockerfile
FROM bitnami/dotnet-sdk
WORKDIR /app
COPY . .
RUN dotnet restore

RUN dotnet publish -c Release -o out
CMD ["dotnet", "out/First.dll"]

Dockerfile 是一系列用于构建镜像的命令。

FROM bitnami/dotnet-sdk

我们的镜像基于 bitnami/dotnet-sdk 镜像。 它是 Bitnami 提供的最新且安全的镜像。

WORKDIR /app

我们需要设置一个构建目录。 WORKDIR 命令指示 Docker 使用指定的目录作为所有后续命令的默认目标目录。

COPY . .

我们将所有文件复制到工作目录。

RUN dotnet restore

dotnet restore 安装当前目录范围内的 .NET 本地工具。

RUN dotnet publish -c Release -o out

dotnet publish 命令编译应用程序,读取项目文件中指定的依赖项,并将生成的文件集发布到目录。

CMD ["dotnet", "out/First.dll"]

CMD 指令在启动容器时运行程序。

$ docker build -t first .

我们构建镜像并将其命名为 first。

$ docker image ls
REPOSITORY               TAG          IMAGE ID       CREATED         SIZE
first                    latest       9bec9d62a4ba   4 minutes ago   1.13GB
web                      latest       2423121e25d3   5 months ago    131MB
hello                    latest       1525ae981450   5 months ago    966MB
docker/getting-started   latest       cb90f98fd791   7 months ago    28.8MB

我们使用 docker image ls 命令列出可用的镜像。

$ docker run first

Welcome to the Bitnami dotnet-sdk container
Subscribe to project updates by watching https://github.com/bitnami/containers
Submit issues and feature requests at https://github.com/bitnami/containers/issues

C# in Docker
Unix 5.10.104.0
7.0.0
a75c8bf3c3bf

我们运行镜像。

$ dotnet run
C# in Docker
Unix 5.15.0.56
7.0.0
andromeda

这是程序在我们本地机器上的输出。

C# Docker ASP.NET 示例

在下面的示例中,我们在 Docker 镜像中创建一个 ASP.NET 应用程序。

$ dotnet new web --no-https -o WebApp

我们创建一个新的 Web 应用程序。

Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "home page\n");
app.MapGet("/about", () => Results.Content("about page\n"));
app.MapGet("/contact", () => "contact page\n");

app.Run("http://0.0.0.0:3000");

该应用程序使用 Minimal API;它有三个终结点并映射到端口 3000。

Dockerfile
FROM bitnami/dotnet-sdk
WORKDIR /app
COPY . .
RUN dotnet restore

RUN dotnet publish -c Release -o out

EXPOSE 3000
CMD ["dotnet", "out/WebApp.dll", "--urls=http://0.0.0.0:3000"]

Dockerfile 包含构建镜像的指令。

$ docker build . -t webapp

我们构建镜像。

$ docker run -p 3000:3000 webapp

我们运行镜像。 容器的 3000 端口映射到我们主机的 3000 端口。

$ curl localhost:3000
home page
$ curl localhost:3000/about
about page

我们使用 curl 工具测试应用程序。

来源

容器化 .NET 应用程序

在本文中,我们使用了 C# 和 Docker。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 至今,我已撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程