上一节已经在服务器安装了docker,这一节将介绍把我们的.net 6Web Api程序使用docker来运行:
1.为项目添加docker支持,如下图:

弹出如下所示界面:

直接点击"确定" 即可;
2.修改Dockerfile文件:
操作完成后,在你的工程下面会生成一个Dockerfile文件,如下图:

双击打开文件,将不用的地方注释掉,最后文件如下所示:
cs
# 请参阅 https://aka.ms/customizecontainer 以了解如何自定义调试容器,以及 Visual Studio 如何使用此 Dockerfile 生成映像以更快地进行调试。
# 此阶段用于在快速模式(默认为调试配置)下从 VS 运行时
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
# 此阶段用于生成服务项目
#FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
#ARG BUILD_CONFIGURATION=Release
#WORKDIR /src
#COPY ["CityInvest.Api/CityInvest.Api.csproj", "CityInvest.Api/"]
#COPY ["CityInvest.Domain/CityInvest.Domain.csproj", "CityInvest.Domain/"]
#COPY ["CityInvest.Infrastructure/CityInvest.Infrastructure.csproj", "CityInvest.Infrastructure/"]
#RUN dotnet restore "./CityInvest.Api/CityInvest.Api.csproj"
COPY . .
#WORKDIR "/src/CityInvest.Api"
#RUN dotnet build "./CityInvest.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
#
## 此阶段用于发布要复制到最终阶段的服务项目
#FROM build AS publish
#ARG BUILD_CONFIGURATION=Release
#RUN dotnet publish "./CityInvest.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
#
## 此阶段在生产中使用,或在常规模式下从 VS 运行时使用(在不使用调试配置时为默认值)
#FROM base AS final
#WORKDIR /app
#COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "CityInvest.Api.dll"]
3.发布项目
发布项目的时候填入:

填写完成,点击发布即可,等待一会儿发布完成。
注意:发布的文件包里面可能没有把刚刚新建的Dockerfile文件包含进去,这时就需要手动将文件拷贝进去。
4.打包镜像
将发布的文件目录拷贝到服务器上,进入工程目录,执行命令:
bash
docker build -t cityinvest.api .
注意:cityinvest.api 是我自己的工程名称,在Dockerfile文件里面可以看到:
就是dll前面的部分,但是要将大写字母换为小写,后面还要跟一个 空格 + .等待一会儿,打包镜像完成;此时,使用docker images可以看到打包的镜像,如下所示:
bash
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cityinvest.api latest b74648279b2a About a minute ago 292MB
hello-world latest 1b44b5a3e06a 5 months ago 10.1kB
第一列代表是镜像的名称,第二列是镜像的标签(可以更改的);
5.启动容器:
使用命令:
bash
docker run -d -p 8080:8000 --name cityinvest-docker cityinvest.api
-p 8080:8000将容器的8080端口映射到主机的8000端口(8000端口是我服务自己配置的端口 "Url": "http://*:8000" ),使用docker运行后,则使用8080来访问了。
cityinvest-docker 是自定义的容器名称;
cityinvest.api:就是我刚刚打包好的镜像的名称;
启动成功后,将打印出一串代码,这个是容器的 ID,可以通过这个 ID 来管理自己的容器,例如查看容器的日志或停止容器等;
6.测试:
此时用postman或者apifox等进行接口的测试,使用 8080端口,若接口调试通过,则表示启动成功。
注意事项:
1.服务的防火墙需要关闭;
2.如果运行报错如下:因为我们之前选择的是
System.InvalidOperationException: Unable to resolve service for type '***.***.***' while attempting to activate '***.***.***' 错误意思就是加载dll文件失败,后面将目标运行时改为 可移植 然后重新发布,更新后,重新运行dcoker;
补充:常用docker命令:
bash
#查看正在运行的容器
sudo docker ps
#查看所有容器(包括停止的)
sudo docker ps -a
#停止容器(格式:docker stop 容器ID/容器名)
sudo docker stop cityinvest-docker
#启动已停止的容器
sudo docker start cityinvest-docker
#重启容器
sudo docker restart cityinvest-docker
#进入正在运行的容器(格式:docker exec [参数] 容器ID/容器名 命令)
sudo docker exec -it cityinvest-docker /bin/bash
# 删除容器(格式:docker rm 容器ID/容器名)
# 注意:删除容器前需要先停止容器
sudo docker stop cityinvest-docker
sudo docker rm cityinvest-docker
# 查看容器日志(格式:docker logs 容器ID/容器名)
# 示例:查看cityinvest-docker容器的最新10条日志
sudo docker logs --tail 10 cityinvest-docker
#显示所有本地镜像
docker images
#删除一个镜像
docker rmi 镜像名称
#删除多个镜像
docker rmi 镜像名称1 镜像名称2 ...
后续研究K8s待补充...