简言:

  最近刚完成公司的新系统,系统使用的是微服务架构,由于领导说要将服务docker化。下面将我的研究结果分享出来,如若有错误的地方,还请各位大佬多多指点。

目录:  

  1. 什么是docker?

  2. 使用docker有什么好处?

  3. docker的使用和docker之间的通信

1. 什么是docker?  

  Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱(沙箱:一个虚拟系统程序)机制,相互之间不会有任何接口。也就是说,我们可以用docker把我们系统和系统所需要的环境以及依赖的软件都打包成一个安装包,然后可以安装到linux或windows上。

  关于docker三个核心概念:

  1. 仓库:存放镜像的仓库

  2. 镜像:类似于系统镜像

  3. 容器:镜像的实例

  小时候我特喜欢去河边沙滩上玩耍,一般都带着一个袋子,里面装了许多形状的摸具。把沙子打湿之后,拿模具一按,一个形状块就有了,记得小时候最喜欢就就是五角星的模具。偶尔有调皮捣蛋的小伙伴会把我做的形状给弄散,当时我不哭也不恼,拿起模具迅速就再做出一个来,气的他没话可说。有时候突发奇想,想到一种新的形状,然后把它做出来之后,我就会把它记下来,然后回家立马弄个新形状的模具出来。

  在这里,我把docker比喻沙滩,而我的袋子就好比仓库,而模具就是镜像,容器自然就是拿模具做出来的形状块。而真正的程序开发中,你可以把镜像理解为我们做的系统的安装包,容器理解为安装后的运行的系统。以上都是我自己个人对docker的理解,如果哪位大佬觉得不合理,还请多交流。

2.使用docker有什么好处?

  以往的系统开发有这么一个问题,在开发人员的电脑上开发的系统,跑到其他人的电脑上或者是服务器上,需要配环境、安装一大堆的软件。不同的操作系统安装方法还有可能不一样。等安装完了之后,一启动发现一大堆的报错,而再自己的电脑上跑的好好的(这里我遇到过)。还有就是,有可能公司的文件服务器比较悠闲,运行多个系统又怕干扰(这里可以使用虚拟机,但性能不是很好)。

  而使用docker,可以把开发好的系统以及系统所依赖的东西,打包成镜像,然后可以发布到支持docker的平台。并且docker能够确保每个容器都拥有自己的资源,并且和其他容器是隔离的。你可以用不同的容器来运行使用不同堆栈的应用程序等等(docker好处实在太多,我就不一一列举了)。

3.docker的使用和docker之间的通信

  怎么安装docker,去哪下载等等我就不讲了,大家都不是编程小白。

  第一步:首先下载dotnet core镜像:docker run -it microsoft/dotnet ,这个是启动命令,如果镜像不存在则会自动下载。

  第二步:创建项目

     1.首先创建一个userservice的web api core项目并创建一个usercontroller ,并修改Program类中的CreateWebHostBuilder  

[Route("api/[controller]")]

   [ApiController]

   public class UserController : ControllerBase

   {

       public IActionResult Get()

       {

           return Ok(new[] { new {Id=1,Name="li" }, new { Id = 2, Name = "lisi" } });

       }

   }      

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:5000")
.UseStartup<Startup>();

     2. 其次再创建一个emailservice的web  api core项目,并创建一个emailcontroller,在修改Program类中的CreateWebHostBuilder

[Route("api/[controller]")]

 [ApiController]

 public class EmailController : ControllerBase

 {

     public IConfiguration Configuration { getset; }

     public EmailController(IConfiguration Configuration)

     {

         this.Configuration = Configuration;

     }

     public async Task<IActionResult> Post(long userId)

     {

         using (HttpClient client = new HttpClient())

         {

             var content = await client.GetAsync("http://user-service:5000/api/user");    //这里的user-service是docker的link机制,下面会讲

             return new JsonResult(new { users= await content.Content.ReadAsStringAsync() ,constr= Configuration["databaseurl"] });

         }

     }

 }

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

           WebHost.CreateDefaultBuilder(args)

               .UseUrls("http://*:4001")

               .UseStartup<Startup>();

     最后,再分别发布下项目。

  第三步:编写Dockerfile

    分别在publish文件夹同级建一个Dockerfile。有关dockerfile里面的指令解释,请阅读:https://www.cnblogs.com/linjiqin/p/8735230.html

  1.首先编写emialservic的dockerfile:    

  2. 编写userservice的dockerfile:  

  第四步:分别在目录下运行cmd,然后输入:docker build -t dotnet/emailservice .和 docker build -t dotnet/userservice .(注意后面的 . 号),然后镜像就制作完成了。

  第五步:因为emailservice依赖于userservice,所以emailservice和userservice要进行通信。

      docker通信有三种方式:

  1. 通过docker容器ip加端口号。因为docker容器重启之后ip地址会改变,不方便迁移。所以不推荐使用。(除非使用固定ip)

  2. 通过映射到主机的端口号。这种方式可以,但是会占用主机端口号

  3. docker的link机制。docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器。

  我这采用link机制,首先编写一个docker-compose.yml文件      

  然后emailservice可以通过:http://user-service:5000端口来访问userservice服务 (我在前面的代码中已经设置好了,所以就不用了)。运行命令:docker-compose up,就行了

结果图如下:(我这里为了显示结果,然后映射到主机端口。在微服务中只需要把网关的端口映射出来就行)

  

原文地址:https://www.cnblogs.com/norain/p/docker_comunication.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

.netcore项目docker化,以及docker之间通信相关推荐

  1. android 多态如何组件化,Android组件化之子模块之间通信方案

    1 背景 Android开发中你的模块(Module)一般只有一个app主模块,随着功能不断扩展你会发现一个模块的缺点就是各种业务高度耦合,你就想测试登录模块,那么你可能会把支付模块也编译进去了,代价 ...

  2. 游戏研发与运营环境Docker化

    在泛娱乐时代,游戏行业特殊的业务特点为技术团队提出了更高的要求,而Docker对游戏研发的运营环境带来了很多好处.发展至今,游戏研发的行业现状是怎么样的?Docker和架构改进之间如何应用?通过Doc ...

  3. Docker学习总结(18)——阿里超大规模Docker化之路

    12月6-7日,由阿里巴巴集团.阿里巴巴技术发展部.阿里云云栖社区联合主办,以"2016双11技术创新"为主题的阿里巴巴技术论坛上,阿里巴巴研究员林昊分享了阿里超大规模Docker ...

  4. 微服务的「扩展立方」与 Docker 化实践

    2019独角兽企业重金招聘Python工程师标准>>> 微服务的扩展立方模型 "扩展立方模型"是指微服务架构的在拆分时包括三个维度,如上图所示,X 轴表示水平副本 ...

  5. python容器开发_python学习之容器化管理docker

    Docker简介 1.1 什么是虚拟化 在计算机中,虚拟化(英文: Virtualization)是一种资源管理技术,是将计算机的各种实体资源(如: 服 务器.网络.内存及存储等)予以抽象.转化后呈现 ...

  6. 「实战篇」开源项目docker化运维部署-后端java部署(七)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...

  7. .NETCore 实现容器化Docker与私有镜像仓库管理

    一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖.相较于虚拟机而 ...

  8. re.containerbase.startinternal 子容器启动失败_Python项目容器化实践(二) Docker Machine和Docker Swarm...

    前言 这篇文章介绍Docker生态中的常被提到的Engine.Machine和Swarm,大家以了解为主,工作需要再深入. Engine Docker Engine其实就是我们常说的「Docker」, ...

  9. docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

    本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...

最新文章

  1. 1000+ 常用 Python 库一览
  2. 【C语言刷题】交换两个变量(包含不创建临时变量)的解法
  3. 上海大学c语言程序设计,【基础强化】2020-2021学年秋季学期程序设计C语言项目顺利开展...
  4. Kubernetes 整体架构图
  5. 【论文精读】Temporally Refined Graph U-Nets for Human Shape and Pose Estimation From Monocular Videos
  6. odp.net连接oracle9i 出错解决_机电工程老出错?机电安装质量通病防治手册,解决常见多发问题...
  7. 消息发送样例介绍和步骤分析
  8. JMM模型到并发编程
  9. 国产手机可以复制苹果的成功吗?
  10. 实参与形参不兼容怎么解决_上岗证报名照片无法上传非官方解决方案
  11. IIS和tomcat共用80端口
  12. leetcode题解—1021、删除最外层的括号
  13. 六爪机器人_六爪机器人
  14. 玩转AgileCDN(二)——运维小哥做报表,不再为时区换算而烦恼
  15. 2021北京家庭摇号官网信息汇总
  16. 【小程序】IDEA实现qq邮件的发送
  17. 计算机应用软件用着总是闪退是什么原因
  18. 全网营销都有那些渠道
  19. 【WebAPI 验证】给 webapi加上token 验证(包括上传文件方法)
  20. Orcale 批量更新sql

热门文章

  1. chromebook刷机_如何将网站添加到您的Chromebook架子上
  2. 香港连续25年被评为全球最自由经济体
  3. jQuery.extend()方法
  4. centos7下别名(alias)的特殊用法
  5. Centos 安装配置 vsftpd
  6. 有没有一段代码,让你觉得人类的智慧也可以璀璨无比?【转】
  7. phpstrom 编辑器设置
  8. Zabbix如何监控Windows机器
  9. [IOS地图开发系类]2、位置解码CLGeocoder
  10. linux视频教程之vsftp_B