点击上方蓝字"小黑在哪里"关注我吧

  • Docker-Compose

    • 代码修改

    • yml file

    • up & down

  • 镜像仓库

前言

上一篇【.Net Core in Docker极简入门(上篇)】讲解了docker的一些基本命令和操作,并成功构建了自己的asp.net core web应用的镜像,启动容器。本篇继续。

开始

上一篇的项目例子非常简单,通常我们的实际项目要复杂的多。项目中会依赖各种组件服务,比如数据库,MQ,缓存等等。这就会涉及到多个容器,如果手动用docker命令去一个一个的启动就很麻烦了,那么这时候就可以使用Docker-Compose来完成多个容器的管理。

Docker-Compose

什么是Docker Compose?

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

简单来理解,Compose类似一个批量工具,可以执行一组命令,支持批量构建镜像,批量启动容器,批量删除容器等等功能。

Windows的Docker Desktop中已经包括了Compose,Linux下Compose则需要单独安装一下。

下面在项目中添加一些数据库操作的相关代码便于测试,使用EF Core+SQL Server。

代码修改

安装EF Code相关的包:

修改代码:

public class WeatherForecast
{[Key]public int Id { get; set; }public DateTime Date { get; set; }public int TemperatureC { get; set; }public int TemperatureF { get; set; }public string Summary { get; set; }
}
public class DemoContext : DbContext
{public DemoContext(DbContextOptions<DemoContext> options): base(options){}public DbSet<WeatherForecast> WeatherForecasts { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//初始化种子数据modelBuilder.Entity<WeatherForecast>().HasData(new WeatherForecast{Id = 1,Date = DateTime.Now,Summary = "none",TemperatureC = 20,TemperatureF = 32 + (int)(20 / 0.5556)}, new WeatherForecast{Id = 2,Date = DateTime.Now.AddDays(1),Summary = "none",TemperatureC = 25,TemperatureF = 32 + (int)(25 / 0.5556)});}
}
public class Startup
{......public void ConfigureServices(IServiceCollection services){services.AddControllers();services.AddDbContext<DemoContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("DemoContext")));}public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DemoContext context){//自动迁移context.Database.Migrate();......}
}
public class WeatherForecastController : ControllerBase
{private readonly ILogger<WeatherForecastController> _logger;private readonly DemoContext _context;public WeatherForecastController(ILogger<WeatherForecastController> logger, DemoContext context){_logger = logger;_context = context;}[HttpGet]public IEnumerable<WeatherForecast> Get(){return _context.WeatherForecasts.ToArray();}
}

appsettings.json添加数据库连接字符串配置:

{......"ConnectionStrings": {"DemoContext": "Server=sql-server;Database=DemoDB;User Id=sa;Password=Password@2020;"}
}

注意:Server=sql-server,这个sql-server是需要在docker-compose.yml中定义的,下面再说。

添加迁移:

yml file

右键项目-添加-容器业务流程协调程序支持

添加后会生成docker-compose相关文件:

其中的docker-compose.yml文件需要修改一下:

version: '3.4'services:webapplication1:image: ${DOCKER_REGISTRY-}webapplication1build:context: .dockerfile: WebApplication1/Dockerfileports: - '5000:80'networks:- my-netdepends_on:- sql-serversql-server:image: mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04ports: - '1434:1433'environment: ACCEPT_EULA: YSA_PASSWORD: Password@2020networks: - my-netnetworks: my-net: driver: bridge

services下定义了2个服务webapplication1、sql-server,相当于2个容器。webapplication1是基于WebApplication1/Dockerfile构建的镜像${DOCKER_REGISTRY-}webapplication1来启动,depends_on用于指定依赖的服务,这里的webapplication1服务依赖于sql-server服务。networks用于指定网络,因为docker中容器之间默认是无法直接通信的,这里创建了一个bridge模式的网络my-net,webapplication1和sql-server都在my-net网络中,那么他们之间就可以通过服务名来通信。所以在上面webapplication1的数据库连接字符串中就可以写:Server=sql-server。通常数据库的数据目录会挂载到主机上,防止容器发生意外导致数据丢失。

上一篇有小伙伴问容器内能不能访问容器外的数据库,这个是可以访问的。访问宿主机的话直接用IP访问就可以,或者用host.docker.internal,这个host.docker.internal是docker安装时会写入到你的hosts文件里的一个主机名,实际还是指向你的主机IP。

以上的yml内容还是比较简单,yml文件是使用Compose必不可少的,语法可以自行学习一下。掌握其语法关键字后,你就可以在docker-compose.yml文件中定义更复杂的环境。

up & down

来到项目根目录,启动PowerShell或cmd执行docker命令。

执行docker-compose up,也可以加-d参数,让他在后台运行

启动完成后,浏览器访问:http://localhost:5000/weatherforecast

成功。这里省略了docker-compose build命令,你也可以在up前先执行build。

docker-compose是不是很方便呢,即使你的系统环境部署再复杂,也只需要一个up指令。

如果你想摧毁这个环境只需要执行docker-compose down即可

同样的,以上操作也可以直接在vs2019中完成,无需手动执行指令,只需要将docker-compose项目设为启动项,然后直接运行即可,还支持代码调试哦。不过由于网络等问题,可能会遇到一些坑。。。

镜像仓库

我们也可以把自己的镜像推送到远程仓库,然后在其他机器上直接就能通过命令拉取了。国内阿里云之类的都有docker镜像仓库服务,也可以搭建私有仓库,本文就推送到docker的官方仓库docker hub。首先需要在docker官网https://www.docker.com/注册账号。

重新构建镜像:docker build -t xhznl/webapp1 -f ./WebApplication1/Dockerfile .

其中xhznl是我的docker用户名。

登录docker:docker login,输入自己的用户名密码。

登录成功后即可推送镜像,执行:docker push xhznl/webapp1

推送成功,在docker官网可以查看镜像:

这样在其他机器的docker中也可以通过docker pull xhznl/webapp1来拉取这个镜像。

修改docker-compose.yml文件,将webapplication1服务的image改为xhznl/webapp1,然后把这个docker-compose.yml文件放到任何装有docker的机器上,只需执行docker-compose up,即可启动程序的所有环境,是不是很神奇。

services:webapplication1:image: xhznl/webapp1ports: - '5000:80'networks:- my-netdepends_on:- sql-server

最后推荐一波vs code,安装docker相关插件,无论是编写yml文件还是管理docker都很方便, 很多操作都不用手敲命令啦。。。

最后

Docker作为当今最流行的容器技术,是很多技术架构的基础。它有很多的优点,使用中也会面临各种问题,希望本篇入门文章能够帮助到一些初学的小伙伴。

如果本文对您有用,

不妨点个“”或者转发朋友圈支持一下

.Net Core in Docker极简入门(下篇)相关推荐

  1. .Net Core in Docker极简入门(上篇)

    点击上方蓝字"小黑在哪里"关注我吧 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & ...

  2. Docker极简入门

    原 Docker极简入门 2018年05月22日 20:25:12 阅读数:44 一.Docker概述 Docker通过一个包括应用程序运行时所需的一切的可执行镜像启动容器,包括配置有代码.运行时.库 ...

  3. 数据分析及机器学习环境配置(docker极简入门指南)

    做数据科学一般需要用到类似XGBOOST.TensorFlow之类的库,这些库在win下不是那么好安装的,但是很多人又需要它们,那怎么办呢,最简单的就是用docker的方式,不仅具备一个linux虚拟 ...

  4. Docker 极简入门教程,傻瓜都能看懂!

    富 Web 时代,应用变得越来越强大,与此同时也越来越复杂.集群部署.隔离环境.灰度发布以及动态扩容缺一不可,而容器化则成为中间的必要桥梁. 本文我们就来探索一下 Docker 的神秘世界,从零到一掌 ...

  5. Docker 极简入门指南,10 分钟就能看懂~

  6. SkyWalking 极简入门

    1. 概述 1.1 概念 SkyWalking 是什么? FROM http://skywalking.apache.org/ 分布式系统的应用程序性能监视工具,专为微服务.云原生架构和基于容器(Do ...

  7. Seata 极简入门

    1. 概述 Seata 是阿里开源的一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务. 1.1 四种事务模式 Seata 目标打造一站式的分布事务的解决方案,最终会提供四种事务 ...

  8. APISIX 极简入门(国产微服务网关)

    1. 概述 APISIX 是基于 OpenResty + etcd 实现的云原生.高性能.可扩展的微服务 API 网关.它是国人开源,目前已经进入 Apache 进行孵化,牛逼!!! OpenRest ...

  9. Nginx 极简入门教程

    Nginx 极简入门教程 基本介绍 Nginx 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP服务. Nginx 是由伊戈尔·赛索耶夫为俄罗斯访问量第 ...

最新文章

  1. 「NLP」ALBERT:更轻更快的NLP预训练模型
  2. 如何定义经济的网络(后期可以随意剪枝)
  3. Object:window_方法
  4. mini2440 uboot使用
  5. Java小游戏 —— 德州扑克
  6. QPW 企业维度评分表(tf_company_dimesion)
  7. libjpeg-turbo在Windows VS2010下的编译
  8. AI 假冒老板骗取 173 万!
  9. java 原型模式的应用_java中原型模式详解和使用方法
  10. 【强推】10个有趣的Python程序
  11. P物质肽[DArg1, DTrp5, 7, 9, Leu11]
  12. C#开发工控上位机编程 csdn_5种将死的编程语言
  13. C8051F C2/JTAG接口
  14. Kafka3.x详细笔记
  15. 鸿蒙系统可以装微信,网友:让腾讯支持华为,微信专用鸿蒙系统,安卓:你说啥?...
  16. Kaggle文本语义相似度计算Top5解决方案分享
  17. 有关java的演讲稿_有关超级演说家励志的演讲稿
  18. 酷我音乐歌手写真接口分享
  19. UFC/k1 VS中国散打!!!!!!!
  20. CpG ODN——艾美捷ODN 1826 (TLRGRADE)说明书

热门文章

  1. 页面上指定类型的控件的样式添加
  2. 薛定谔的猫——.NET 4.1 中的新基类,开源Preview中
  3. C语言程序设计实验最短路径,7最短路径C语言程序设计.pdf
  4. 中药ppi网络图太杂乱_太杂乱了吗? 这是您的iPhone,iPad,Android或台式机的15张简约壁纸...
  5. jsp 连接access数据库
  6. #、%和$符号在OGNL表达式中的作用
  7. DOM 事件深入浅出(二)
  8. .NET WinForm程序中给DataGridView表头添加下拉列表实现数据过滤
  9. 组策略链接顺序优先级
  10. 简单谈谈Server2008的NAP到底是什么