首页 > 编程语言 >docker容器化.NET程序

docker容器化.NET程序

时间:2024-10-12 15:13:14浏览次数:7  
标签:容器 name image dotnet 镜像 docker NET

C# 使用 docker 容器化程序

创建 dockerfile

单项目应用:如果你的应用只有一个 .csproj 文件,建议将 Dockerfile 放在该 .csproj 文件所在目录,这样更加简单、清晰,且易于维护。

多项目解决方案:如果你的项目有多个子项目,并且你希望构建整个解决方案或特定的子项目,建议将 Dockerfile 放在解决方案根目录下(与 .sln 同一层级)。这样可以更容易地管理依赖关系,并构建多个项目。

适用于多项目解决方案:这种方法更适合有多个子项目的解决方案。如果你有多个 .csproj 文件,并且需要构建整个解决方案,这种结构是最佳选择。
管理多个项目:可以从解决方案层级管理和构建多个项目,而不是单个项目。
选择哪种方式?

编写dockerfile

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env
WORKDIR /App

COPY . ./

RUN dotnet restore

RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]

解释dockerfile

#第一阶段:构建阶段

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env:
#指定.NET SDK 8.0 的官方基础镜像来定义了一个名为 build-env 的构建环境,我们可以在后面引用这个环境。

WORKDIR /App:
#这会在容器内创建一个工作目录 /App 并将其设为当前工作目录。后续的所有命令都将在这个目录中执行。
#如果 /App 目录不存在,它会自动创建。

COPY . ./:
#将当前目录(也就是包含 Dockerfile 的目录)的所有文件复制到容器的 /App 目录中。

RUN dotnet restore:
#执行 dotnet restore 命令,恢复项目依赖项和 NuGet 包。它会基于项目的 .csproj 或 .sln 文件下载项目的依赖库。
#这个步骤通常会缓存起来以避免每次构建都重复下载依赖项。


RUN dotnet publish -c Release -o out:
#这个命令会编译项目并发布(生成)一个发布版本(Release)的构建。
#-c Release 指定构建配置为 Release(优化后的生产环境版本)。
#-o out 表示将编译好的文件输出到 /App/out 目录中。


#第二阶段:运行时环境

FROM mcr.microsoft.com/dotnet/aspnet:8.0:
#使用的是较轻量的 .NET Runtime 镜像,也就是 ASP.NET Core 运行时镜像,只包含运行 .NET 应用程序的必要组件,而没有用于构建和调试的工具,这使得它体积较小,非常适合生产环境部署。


WORKDIR /App:
#再次创建并设置工作目录为 /App,这次是在运行时镜像中创建的。


COPY --from=build-env /App/out .:
#这里是多阶段构建的关键之处。
#COPY --from=build-env 表示从之前的 build-env 阶段中复制文件。
#具体来说,它将构建阶段中 /App/out 目录下的所有已编译和发布的文件复制到当前阶段(运行时阶段)的工作目录 /App 下。


ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]:
#这个命令定义了容器启动时的默认命令。在这里,ENTRYPOINT 指定容器运行时将执行 dotnet DotNet.Docker.dll,也就是运行编译好的 .NET 应用程序。
#DotNet.Docker.dll 是在之前的 dotnet publish 阶段生成的应用程序的主可执行文件。
#(DotNet.Docker.dll 这个是自己项目发布的文件,可以去发布目录查看自己的执行文件)

构建镜像

#若是提示(权限不足)connect: permission denied

#那就在命令前面添加 sudo

#如 docker images 就写成 sudo docker images   (查看镜像)
#sudo docker images -a (查看所有镜像)

#如 docker ps 就写成 sudo docker ps   (查看运行中的容器)
#sudo docker images -a (查看所有容器)
docker build -t image-name -f Dockerfile .

#1. docker build
#docker build 命令用于从指定的 Dockerfile 构建一个 Docker 镜像。它会根据 Dockerfile 中的指令,逐步创建镜像层,并最终生成一个可以运行的 Docker 镜像。

#2. -t image-name
#-t 选项是 --tag 的简写,它用于为构建的镜像指定一个标签(tag)。

#3. -f Dockerfile
#-f 选项是 --file 的简写,它用于指定构建过程中使用的 Dockerfile。

#4. .(上下文)
#. 代表构建上下文(build context)。构建上下文是指 Docker 将哪些文件发送到 Docker 守护进程(Docker Daemon)用于镜像的构建。
#在这个命令中,. 表示当前目录作为上下文。也就是说,当前目录下的所有文件和子目录会被发送给 Docker 守护进程供其使用。

现在你已经创建好一个镜像了

根据镜像创建容器

docker create core-name image-name
#create 命令创建容器,core-name是容器名称,image-name是镜像名称


docker run image-name
#run 命令 创建并运行容器 

#可选参数

#1. 后台运行容器(Detached Mode)
#docker run -d image-name
#使用 -d 选项可以让容器在后台运行,通常称为“守护模式”(detached mode)。
#这将基于 myapp:latest 镜像启动一个容器,并使其在后台运行,而不会占用当前终端。

#2. 命名容器
#docker run --name my_container image-name
#使用 --name 选项可以为容器指定一个名称,方便管理和跟踪。
#这会创建并运行一个名为 my_container 的容器。

#3. 绑定端口
#docker run -p 8080:80 image-name
#如果容器中的应用程序监听某个端口(如 Web 服务器),你可以使用 -p 选项将主机端口映射到容器内部端口。
#这会将主机的端口 8080 映射到容器的端口 80。如果容器中的应用运行在 80 端口,你可以通过访问主机的 8080 端口与之交互。

#4. 交互模式(Interactive Mode)
#docker run -it ubuntu /bin/bash
#使用 -it 可以让容器以交互模式运行,通常用于需要与容器内部的命令行交互。
#这会启动一个基于 ubuntu 镜像的容器,并打开一个交互式的 Bash 终端。你可以在容器中执行命令,退出容器时,它会自动停止。

#5. 挂载卷
#docker run -v /path/on/host:/path/in/container image-name
#使用 -v 选项可以将主机上的目录挂载到容器中,方便数据共享或持久化。
#这会将主机上的 /path/on/host 目录挂载到容器的 /path/in/container 目录。

#6. 自动删除容器
#docker run --rm image-name
#使用 --rm 选项可以在容器停止后自动删除它。这样可以避免堆积无用的停止状态的容器。

#7. 查看日志
#docker logs <container_name_or_id>
#当容器在后台运行时,可以使用 docker logs 查看容器的输出日志。

#8. 环境变量
#docker run -e MY_ENV_VAR=value image-name
#使用 -e 选项可以向容器传递环境变量。
#这会在容器内部设置 MY_ENV_VAR 环境变量,值为 value。

其他

连接到容器来查看输出。 使用 docker attach 命令查看输出流

docker attach --sig-proxy=false core-counter
#core-counter为容器名称

将镜像保存导出

docker save -o save-image-name.tar image-name
#将名为'image-name'的镜像,保存到当前目录下,名称为'save-imaage-name.tar'

docker导入镜像

docker load -i save-image-name.tar
#将当前目录下的 save-image-name.tar 镜像文件导入至docker

停止容器

docker stop core-counter
#core-counter为容器名称

删除容器与镜像

docker rm core-counter
#core-counter为容器名称

docker rmi image-name
#core-counter为容器名称

标签:容器,name,image,dotnet,镜像,docker,NET
From: https://www.cnblogs.com/20lxj666/p/18460579

相关文章

  • ICT50220 ICTNWK562 Configure Internet Gateways
    DEPARTMENTOFINFORMATIONTECHNOLOGY ICT50220DiplomaofInformationTechnology AssessmentICTNWK562ConfigureInternetGatewaysAssessmentTask4022Preparedby:CurriculumUnit,MelbournePolytechnic CoursecodeandnameICT50120DiplomaofInformat......
  • k8s和docker关系
    Docker首先诞生于2013年,它引入了现代容器化技术的概念,使得开发者能够将应用程序及其依赖项一起打包,以便在不同环境中实现一致性和可移植性。Docker的出现极大地简化了应用程序的部署和管理过程。随着Docker的普及,容器化应用程序的数量不断增加,人们开始需要一个有效的方法来管......
  • docker 存储管理
    docker存储管理docker持久化方案docker提供三种持久化存储方案:volumes:卷存储提供了名为volumes的机制,其本质是存储在宿主机的文件夹,但是能够通过docker命令管理,同时能够通过volumes的别名方便挂载bindmounts:绑定挂载tmpfs:仅存储在宿主机的内存中,而不会写入宿主机......
  • .NET MAUI 手搓 UDP/TCP 通信
    在.NETMAUI中,UDP和TCP是网络通信协议,与MAUI框架本身的关系在于.NETMAUI可以利用.NET的网络功能来实现跨平台的网络通信。.NET提供的System.Net.Sockets命名空间来处理。该命名空间提供了创建和管理套接字(Sockets)来进行网络通信的相关类和方法。在.NETMAUI......
  • 在 .NET 中的 ConvertAll 和 Select 方法哪个性能好
    .NET的List中提供了ConvertAll和Select两个方法,在开发中实际上应该使用哪一个?接下来通过基准测试脚本来对比性能。先编写基准测试脚本:[MemoryDiagnoser]publicclassBenchmarksTerrible{privatereadonlyList<Order>_orders;publicBenchmark......
  • lake3哈希算法的介绍、特点、原理与Blake3.Net的特点
    1.Blake3的介绍与特点哈希函数专为文件完整性验证等应用而设计,加密数字签名的消息认证和数据生成。Blake3不是为散列密码而设计的,因为它旨在尽可能快地计算散列(对于密码,建议使用慢散列和escrypt、bcrypt、scrypt或Argon2函数)。所讨论的散列函数对正在处理的数据大小不敏感,并......
  • Docker:容器化技术的强大力量
    一、Docker简介与优势Docker是一个开源的应用容器引擎,它可以将应用程序及其依赖项打包到一个可移植的容器中,实现快速部署和运行。Docker具有以下特点:轻量级:相比传统虚拟机,Docker容器更加轻量级。它共享操作系统内核,启动时间更快,资源消耗更低。例如,一个相同配置的主机......
  • 地平线双目深度估计参考算法 StereoNetPlus优化 思路解读
    【参考算法】地平线双目深度估计参考算法StereoNetPlus-v1.2.11.引言本文将介绍地平线基于公版的双目深度估计算法StereoNet做的优化设计。首先介绍了双目深度估计的原理以及双目点云和Lidar点云的对比,然后由公版StereoNet的介绍切入到地平线参考算法的针对性优化,最后对......
  • K8S控制器理解-摘录自《云原生操作系统Kubernetes》
    摘录自罗建龙等著的《云原生操作系统Kubernetes》,详细了解请查看原著。虽然控制器是Kubernetes比较复杂的组件,但是控制器这个概念本身,对我们来说并不陌生。我们生活中使用的洗衣机、冰箱、空调等,都要有控制器才能正常工作。以下我们通过思考一个简易冰箱的设计过程,来理解Kuber......
  • kubernetes 初始化集群 证书100年操作 【kubeadm】
    1、下载源码[root@SPHQBKCEK8SMS01~]#gitclonehttps://github.com/kubernetes/kubernetes#切换到自己的版本,修改源码,比如我的是v1.20.15版本[root@SPHQBKCEK8SMS01kubernetes]#cdkubernetes/[root@SPHQBKCEK8SMS01kubernetes]#gitcheckoutv1.20.15[root@SPHQBKCE......