使用 ASP.NET Core 通过 Docker 探索 Redis 缓存 – 第二部分
介绍
在上一篇文章中,我们见证了将 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 必须是 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
构建镜像
Docker build 命令从 DockerFile 构建 Docker 镜像。这是 Docker 构建的命令
docker build -t rediscachedemo:v1 。
这将生成一个将存储在本地计算机上的图像。您可能会看到通过运行安装的所有映像的列表:
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 中修改我们的代码
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!