.Net Core in Docker极简入门(下篇)
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。 目录
前言上一篇【.Net Core in Docker极简入门(上篇)】讲解了docker的一些基本命令和操作,并成功构建了自己的asp.net core web应用的镜像,启动容器。本篇继续。 开始上一篇的项目例子非常简单,通常我们的实际项目要复杂的多。项目中会依赖各种组件服务,比如数据库,MQ,缓存等等。这就会涉及到多个容器,如果手动用docker命令去一个一个的启动就很麻烦了,那么这时候就可以使用Docker-Compose来完成多个容器的管理。 Docker-Compose什么是Docker Compose?
简单来理解,Compose类似一个批量工具,可以执行一组命令,支持批量构建镜像,批量启动容器,批量删除容器等等功能。 Windows的Docker Desktop中已经包括了Compose,Linux下Compose则需要单独安装一下。 下面在项目中添加一些数据库操作的相关代码便于测试,使用EF Core+SQL Server。 代码修改安装EF Code相关的包: 修改代码:
appsettings.json添加数据库连接字符串配置:
注意:Server=sql-server,这个sql-server是需要在docker-compose.yml中定义的,下面再说。 添加迁移: yml file右键项目-添加-容器业务流程协调程序支持 添加后会生成docker-compose相关文件: 其中的docker-compose.yml文件需要修改一下:
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访问就可以,或者用 以上的yml内容还是比较简单,yml文件是使用Compose必不可少的,语法可以自行学习一下。掌握其语法关键字后,你就可以在docker-compose.yml文件中定义更复杂的环境。 up & down来到项目根目录,启动PowerShell或cmd执行docker命令。 执行 启动完成后,浏览器访问:http://localhost:5000/weatherforecast 成功。这里省略了 docker-compose是不是很方便呢,即使你的系统环境部署再复杂,也只需要一个up指令。 如果你想摧毁这个环境只需要执行 同样的,以上操作也可以直接在vs2019中完成,无需手动执行指令,只需要将docker-compose项目设为启动项,然后直接运行即可,还支持代码调试哦。不过由于网络等问题,可能会遇到一些坑。。。 镜像仓库我们也可以把自己的镜像推送到远程仓库,然后在其他机器上直接就能通过命令拉取了。国内阿里云之类的都有docker镜像仓库服务,也可以搭建私有仓库,本文就推送到docker的官方仓库docker hub。首先需要在docker官网https://www.docker.com/注册账号。 重新构建镜像: 其中xhznl是我的docker用户名。 登录docker: 登录成功后即可推送镜像,执行: 推送成功,在docker官网可以查看镜像: 这样在其他机器的docker中也可以通过 修改docker-compose.yml文件,将webapplication1服务的image改为xhznl/webapp1,然后把这个docker-compose.yml文件放到任何装有docker的机器上,只需执行
最后推荐一波vs code,安装docker相关插件,无论是编写yml文件还是管理docker都很方便, 很多操作都不用手敲命令啦。。。 最后Docker作为当今最流行的容器技术,是很多技术架构的基础。它有很多的优点,使用中也会面临各种问题,希望本篇入门文章能够帮助到一些初学的小伙伴。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-web-api – 使用WebAPI和RavenDB进行基本会话处理
- 如何在ASP.NET应用程序中查询Word docx?
- 在ASP.NET中使用Visual Studio发布功能有什么好处?
- asp.net-mvc – 如何编辑MVC4表单中的子对象?
- .net – 为什么要使用asp:HyperLink
- asp.net – 如何使用返回类型的System.Action?
- asp.net – 自定义日期colmn telerik网格的过滤器选项
- asp.net-mvc – 在ASP.Net MVC中寻找转发器类型功能
- asp.net – 在客户端启用/禁用RequiredValidator /不启动Cu
- 基于EntityFramework 6 Code First实现简单的多租户系统,支
- asp.net – “SELECT * FROM …”VS“SELECT ID
- 在Entity Framework中使用存储过程(四):如何为
- asp.net-core – Microsoft.AspNetCore.NodeServ
- 如何在ASP.Net中将HTML页面转换为图像格式
- asp.net-mvc-3 – EntityType’x’没有定义键.定
- asp.net-mvc-2 – 将区域限制为给定角色
- asp.net-mvc – Html.LabelFor语句不显示为赋值
- asp.net – 如何使用横向方向将页面大小设置为信
- 打造更好用的 EF 自动审计
- asp.net-mvc – ASP.Net MVC 4.在单独的程序集中