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