使用 ASP.NET Core 通过 Docker 探索 Redis 缓存 – 第二部分

作者 : 慕源网 本文共2870个字,预计阅读时间需要8分钟 发布时间: 2021-11-9 共538人阅读

介绍

在上一篇文章中,我们见证了将 Redis 添加到 Docker 容器中,并了解了有关将 Redis 容器与 ASP.NET Core web-api 连接的更多信息。

如果您还没有阅读我之前的文章,我强烈建议您点击此处阅读。

DockerFile

在详细介绍创建 DockerFile 之前,让我们深入了解 DockerFile 的概念。

Docker 可以通过从 DockerFile 读取指令来构建镜像。DockerFile 是一个文本文档,其中包含用户可以在命令行上调用以组合图像的所有命令。Docker build 执行来自 DockerFile 的指令以使用命令行创建自动构建。

通过在 VS 中选择“添加 Docker 支持”来创建一个新的 DockerFile

用法

使用以下指令更新 DockerFile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build WORKDIR /src COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet build -c Release -o /app/build FROM build AS publish RUN dotnet publish -c Release -o /app/publish FROM base AS final WORKDIR /app COPY –from=publish /app/publish . ENTRYPOINT [“dotnet”, “RadisCacheDocker.dll”]

让我们一步一步地理解这个 DockerFile 命令。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
FROM

设置用于后续说明的基本映像。FROM 必须是 DockerFile 中的第一条指令。

在上面的行中,我们一直在指示 Docker 将 ASP.NET Core运行时映像从集线器存储库下载并安装到容器中。在这里,由于多种原因,我们使用的是运行时映像而不是 SDK 映像。

  • 运行时映像较小,可以轻松地从集线器存储库到 docker 主机跨网络传输。
  • 由于较小的二进制文件,可以快速部署应用程序。

WORKDIR /app

WORKDIR

用于定义docker容器的工作目录。可以在指定的工作目录中执行ADD、COPY、RUN、CMD、ENTRYPOINT等命令。

如果 WORKDIR 命令没有写在 DockerFile 中,那么在这种情况下,docker 编译器会自动为你创建它。可以得出结论,WORKDIR 类似于 MKDIR 和 cd。

在上面的行中,我们指示 Docker 创建一个工作目录作为应用程序,如果该目录不存在。

EXPOSE 80 EXPOSE 443

EXPOSE

它用于通知 Docker 正在侦听指定网络端口的容器。

我们正在为我们的容器公开端口 80(HTTP)和端口 443(https)。

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build

您可能想知道,既然我们已经有了运行时映像,为什么还需要 SDK。正确的?答案是我们正在使用多阶段构建。

现在问题来了,什么是多阶段构建?这个想法是,要“构建”您的项目,您需要一组不同的东西。但是要“运行”你构建的代码,你需要一套不同的东西。

例如,可以使用microsoft/aspnetcore-build基本映像构建 .NET Core应用程序,而可以使用microsoft/aspnetcore 来运行应用程序。

COPY *.csproj .

在这里,我们将我们的项目复制到当前目录。

RUN dotnet restore 

通过使用 RUN dotnet restore 命令,我们指示 NuGet 恢复项目中指定的所有依赖项。

COPY . . RUN dotnet build -c Release -o /app/build

“COPY …” 将整个项目递归复制到构建的容器中。使用 dotnet restore 分离两个复制命令,然后使用 dotnet build 分离完整复制命令的主要原因是 Docker 缓存技巧,以加快构建速度。这样做是为了避免在每次代码更改时安装项目依赖项。

FROM build AS publish RUN dotnet publish -c Release -o /app/publish

在这里,我们以发布模式发布 .net core应用程序。

COPY –from=publish /app/publish .

上面的命令用于将输出目录的内容从发布阶段复制到我们运行时阶段的根目录中。

ENTRYPOINT [“dotnet”, “RadisCacheDocker.dll”]

ENTRYPOINT

它允许您配置作为可执行文件运行的容器。您可以认为 ENTRYPOINT 类似于 CMD,因为它允许您使用参数指定命令。

构建镜像

Docker build 命令从 DockerFile 构建 Docker 镜像。这是 Docker 构建的命令

docker build -t rediscachedemo:v1 。

注意
您需要从 DockerFile 所在的目录执行此命令。

这将生成一个将存储在本地计算机上的图像。您可能会看到通过运行安装的所有映像的列表:

docker image ls

运行镜像

docker run -p 32768:80 rediscachedemo:v1

这里,应用程序在 rediscachedemo:v1 映像上运行,并将容器的端口发布到端口号 32768 上的主机。

运行应用程序

运行应用程序后,您将收到一条错误消息,指出“无法在 localhost:6379 上连接”。该错误似乎是合理的,因为一方面,Redis 在不同的容器中运行,而我们的应用程序在不同的容器中。有了这个逻辑,我们的应用程序就无法使用 localhost 连接到 Redis

为了使我们的应用程序正常工作,您需要在连接多路复用器中指定 Redis 的网关 IP 地址。您可以通过运行获取网关详细信息:

docker ps   
//Get the container id from above command   
docker inspect <container id of redis>  

您可以在 NetworkSettings 部分找到有关网关的详细信息。

现在让我们在 Startup.cs 中修改我们的代码

public void ConfigureServices(IServiceCollection services) {  
    services.AddControllers();  
    IConnectionMultiplexer redis = ConnectionMultiplexer.Connect("172.17.0.1");  
    services.AddScoped(x => redis.GetDatabase());  
}  

修改后,代码似乎完美运行!

我希望你喜欢这篇文章。如果你觉得这篇文章有趣,那就点赞和分享吧!


慕源网 » 使用 ASP.NET Core 通过 Docker 探索 Redis 缓存 – 第二部分

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录