dockerdesktop 制作asp.net core webapi镜像-连接sqlserver数据库容器

news2024/11/25 4:18:50

1.使用visual studio 创建 asp.net core webapi项目
在这里插入图片描述
选择启用docker 会生成Dockerfile文件
2.使用efcore连接数据库,安装efcore的包

  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.10" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>

  </ItemGroup>

3.实体类和数据库对应

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;

namespace WebApplication4
{
    public class Inventory
    {
        [Key]
        public int id { get; set; }

        public string name { get; set; }
        public int quantity { get; set; }
    }
}

4.配置数据库连接字符串
//Data Source用的是容器里面的数据库容器名,这里需要容器之间通讯

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Data Source=sql-server2022;Database=TestDB;User Id=SA;Password=123456;"
  }
}

5.创建数据库上下文

using Microsoft.EntityFrameworkCore;

namespace WebApplication4
{
    public class AppDbContext : DbContext
    {
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options)
        {
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //optionsBuilder.UseSqlServer("server=localhost,1400;uid=SA;pwd=peng@123;database=TestDB");
        }

        public DbSet<Inventory> Inventory { get; set; }
    }
}

6.业务代码

namespace WebApplication4
{
    public interface Iservice
    {
        void add(Inventory inventory);

        void remove(int id);

        List<Inventory> Getlsit();
    }
}
namespace WebApplication4
{
    public class service : Iservice
    {
        private readonly AppDbContext _context;

        public service(AppDbContext context)
        {
            _context = context;
        }

        public void add(Inventory inventory)
        {
            _context.Inventory.Add(inventory);
            _context.SaveChanges();
        }

        public List<Inventory> Getlsit()
        {
            return _context.Inventory.ToList();
        }

        public void remove(int id)
        {
            var ENRTY = _context.Inventory.FirstOrDefault(p => p.id == id);
            _context.Inventory.Remove(ENRTY);
            _context.SaveChanges();
        }
    }
}

7.注入服务

using Microsoft.EntityFrameworkCore;

namespace WebApplication4
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddScoped<Iservice, service>();
            builder.Services.AddDbContext<AppDbContext>(options =>
             options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
            builder.Services.AddSwaggerGen();

            var app = builder.Build();
             //注释可以在生产环境看到swagger页面
            // Configure the HTTP request pipeline.
            //if (app.Environment.IsDevelopment())
            //{
            app.UseSwagger();
            app.UseSwaggerUI();
            //}

            app.UseAuthorization();

            app.MapControllers();

            app.Run();
        }
    }
}

8.contrllor代码

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication4.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class InveryController : ControllerBase
    {
        private readonly Iservice iservice;

        public InveryController(Iservice iservice)
        {
            this.iservice = iservice;
        }

        [HttpGet]
        public IActionResult Getlist()
        {
            return new JsonResult(iservice.Getlsit());
        }

        [HttpPost]
        public IActionResult Add([FromBody] Inventory inventory)
        {
            iservice.add(inventory);
            return Ok("add success");
        }

        [HttpDelete("{id}")]
        public IActionResult delete(int id)
        {
            iservice.remove(id);
            return Ok("remove success");
        }
    }
}

9.编写dockerfile文件
在这里插入图片描述
根据自己的项目信息更改

#获取asp.net6的镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
#创建工作目录
WORKDIR /app
#复制当前目录到工作目录
ADD . /app
#开放端口
EXPOSE 5999
CMD ["--urls","http://0.0.0.0:5999"]
#设置环境变量
ENTRYPOINT ["dotnet", "WebApplication4.dll"]

10.发布项目
在这里插入图片描述
11.切换到发布文件目录 终端打开
在这里插入图片描述
12.添加网络(不添加容器间无法通讯)

 docker network create mynetwork
 #sql-server2022(数据库容器)
  docker network connect mynetwork   sql-server2022 

13.构建镜像

docker build -t webapplication4 -f ./Dockerfile .

在这里插入图片描述

13.运行容器(把容器加到添加的网络里)
-d 后台运行
–name 容器的名字
-p 端口映射
–network 网桥名称
webapplication4 镜像的名称

docker run -d  --name webapiTest -p 5999:5999 --network=mynetwork webapplication4

在这里插入图片描述

14.查看运气是否运行

docker ps

在这里插入图片描述
15.在浏览器里运行(点击进入浏览器)
在这里插入图片描述
在网址里加上 /swagger/index.html
在这里插入图片描述
就可以访问数据了。
注意:如果访问的数据库不在docker容器里面就直接写ip地址就行,如果做了端口映射,数据库连接要127.0.0.1,1434 这样的形式。
end…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1287843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何配置WinDbg和VMware实现内核的调试

设置 VMware 的虚拟串口 运行 VMware&#xff0c;首先将 Guest OS 系统电源关闭&#xff0c;这样才能修改该系统的虚拟机设置。 单击界面上的“编辑虚拟机设置”选项对虚拟机的属性进行设置。 单击“添加”按钮&#xff0c;打开 VMware 的 添加硬件向导 对话框 选择“串行端口…

第17章 匿名函数

第17.1节 匿名函数的基本语法 [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 { // 函数体 }语法规则&#xff1a;lambda表达式可以看成是一般函数的函数名被略去&#xff0c;返回值使用了一个 -> 的形式表示。唯一与普通函数不同的是增加了“捕获列表”。 …

Python 调用企业微信群机器人发送消息及文件

Python 操作企业微信群机器人。 企业微信群创建机器人 &#xff1a; 安装 requests json &#xff1a; pip install requests pip install json发送消息&#xff08;markdown&#xff09; import requests import json# 企业微信机器人发送文字 def send_markdown (message, …

7.Vue UI库

7.Vue UI库 7.1移动端常用的UI库 &#xff08;1&#xff09; Vant&#xff1a;Vant 4 - A lightweight, customizable Vue UI library for mobile web apps.A lightweight, customizable Vue UI library for mobile web apps.https://vant-ui.github.io/vant/#/zh-CN &#xf…

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测

分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测 目录 分类预测 | Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现OOA-CNN-SVM鱼鹰算法优化卷积支持向量机分类预测&#xff0…

在AWS CodeBuild中更新Lambda导致进程被占用(status error 255)的解决方案

大纲 1 问题描述1.1 错误提示1.2 错误分析和解决方案 2 解决方法2.1 YMAL文件样例 参考文献 1 问题描述 在Lambda的部署实践中&#xff0c;我们尝试使用CodeBuild将代码更新到Lambda函数中。在这个过程中&#xff0c;偶尔会触发一个不太常见的状态&#xff1a;Lambda状态一直是…

用友NC Cloud FileParserServlet反序列化RCE漏洞复现

0x01 产品简介 用友 NC Cloud 是一种商业级的企业资源规划云平台,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,实现企业的数字化转型和业务流程优化。 0x02 漏洞概述 用友 NC Cloud FileParserServlet接口存在反序列化代码执行漏…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解

第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义&#xff0c;主要作用&#xff1a;所有子标签均需要设置在跟标签内部 1.3 核心配置文件…

设计模式之结构型模式(适配器、桥接、组合、享元、装饰者、外观、代理)

文章目录 一、结构型设计模式二、适配器模式三、桥接模式四、组合模式五、享元模式六、装饰者模式七、外观模式八、代理设计模式 一、结构型设计模式 这篇文章我们来讲解下结构型设计模式&#xff0c;结构型设计模式&#xff0c;主要处理类或对象的组合关系&#xff0c;为如何…

中文手写数字数据识别

实验环境 python3.7torch1.13.1cu117 torchaudio0.13.1cu117 torchvision0.14.1数据下载地址&#xff1a;Mnist中文手写数字数据集Python资源-CSDN文库 这些汉字包括&#xff1a; 零、一、二、三、四、五、六、七、八、九、十、百、千、万、亿 总共15个汉字&#xff0c;分别…

HarmonyOS学习--了解基本工程目录

1.工程级目录 工程的目录结构如下&#xff1a; 其中详细如下&#xff1a; AppScope中存放应用全局所需要的资源文件。entry是应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包&#xff0c;存放工程依赖的源文件。build-profile.json5是工…

Scrapy爬虫数据存储为JSON文件的解决方案

什么是JSON文件 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人们阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集&#xff0c;但独立于Smashing语言&#xff0c;因此在许多中…

C语言每日一题(46)整数转罗马数字

力扣网12 整数转罗马数字 题目描述 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D …

Get职场新知识:做分析,用大数据分析工具

为什么企业每天累积那么多的数据&#xff0c;也做数据分析&#xff0c;但最后决策还是靠经验&#xff1f;很大程度上是因为这些数据都被以不同的指标和存储方式放在各自的系统中&#xff0c;这就导致了数据的分析口径和标准不一致&#xff0c;无法在同一个分析软件上做综合分析…

nodejs微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Vue自定义hook函数

hook 本质是一个函数&#xff0c;可以把 setup 函数中使用的 Composition API 进行封装。 hook 类似于 Vue2 中的 mixin 混合。 自定义 hook 的优势&#xff1a;复用代码&#xff0c;让 setup 中的逻辑更加清晰易懂。 自定义hook函数&#xff1a; 1、在 src 目录下创建 hooks…

codeforces 题目 Chtholly‘s request

目录 题目&#xff1a; 题目描述&#xff1a; 思路&#xff1a; AC代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; zcy数&#xff1a;&#xff08;形如&#xff1a;11&#xff0c;1221&#xff0c;103301&#xff09; ①是回文数 ②数位个数是偶数 给你两个整数 k…

flask项目的基本配置

1. 目录结构 2. 入口文件app.py from manger import create_app, db from flask_migrate import Migrate from manger import models# 传入settings参数&#xff0c;开发版本“develop”&#xff0c;线上版本“product” app create_app(develop)# 数据库设置 migrate Migra…

Git 分支合并时 Merge, Rebase, Squash 的使用场景

前言 Git 的分支设计大大提升了并行开发的能力&#xff0c;但相应的&#xff0c;也就要解决如何进行分支合并。毕竟分久必合&#xff0c;最终还是要把大家的工作合并起来&#xff0c;进行统一发布的。在合并时&#xff0c;通常有三种操作&#xff1a; Merge commitsRebaseSqu…

vivado时序方法检查2

TIMING-4 &#xff1a; 时钟树上的基准时钟重新定义无效 时钟树上的时钟重新定义无效。基准时钟 <clock_name> 是在时钟 <clock_name> 下游定义的 &#xff0c; 并覆盖其插入延迟和/ 或波形定义。 描述 基准时钟必须在时钟树的源时钟上定义。例如 &#xff0…