简言:

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

目录:   

  1. 什么是docker?
  2. 使用docker有什么好处?
  3. docker的使用和docker之间的通信

1. 什么是docker?  

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

  关于docker三个核心概念:

  1. 仓库:存放镜像的仓库
  2. 镜像:类似于系统镜像
  3. 容器:镜像的实例

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

  在这里,我把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 { get; set; }
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:    

FROM microsoft/dotnet     #本镜像继承自哪个镜像
COPY publish /publish    # 拷贝当前文件夹下的publish文件夹到镜像中的根目录下的publish文件夹
WORKDIR /publish        #设置镜像的工作目录
EXPOSE 4001/tcp       # 暴露 tcp连接的4001端口
CMD ["dotnet","EmailService.dll","--databaseurl=132456789"]    #设置命令,以及一些参数

  2. 编写userservice的dockerfile:  

FROM microsoft/dotnet  
COPY publish /publish
WORKDIR /publish
EXPOSE 5000/tcp
CMD ["dotnet","UserService.dll"]

  

  第四步:分别在目录下运行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文件      

version: '3'  #采用哪个docker-compose的版本
services:    #服务集合
user-service:    #服务名,name
image: dotnet/userservice    #启动哪个镜像
ports:        #端口映射设置,这里是主机的6001端口映射到docker里的5000端口
- "6001:5000"
email-service:    #服务名,name:
image: dotnet/emailservice  #启动哪个镜像
ports:          #端口映射设置,这里是主机的4001端口映射到docker的4001端口
- "4001:4001"
links:        #依赖哪个服务
- "user-service"
#docker-compose 指令详解:https://www.cnblogs.com/freefei/p/5311294.html

  

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

  

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

  

    

.netcore项目docker化,以及docker之间通信的更多相关文章

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

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

  2. 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S

    使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish   等几个常用命令. 2.了解Dock ...

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

    原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...

  4. AspNetCore容器化(Docker)部署(二) —— 多容器通信

    一.前言 着上一篇 AspNetCore容器化(Docker)部署(一) —— 入门,在单个容器helloworld的基础上引入nginx反向代理服务器组成多容器应用. 二.配置反向代理转接 配置转接 ...

  5. dotnet跨平台 - 使用Nginx+Docker Compose运行.NETCore项目

    参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...

  6. 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信

    官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...

  7. springboot 项目 docker化部署

    最近公司项目需要docker化,项目所使用的框架是springboot,linux环境.第一次接触docker化方面的技术.做的时候,所接触的新知识比较多,留下此文,以便以后用到的时候快速入手. 修改 ...

  8. SpringBoot项目docker化

    前言 有很多种方案构建Docker镜像,包括Dockerfile构建.maven插件构建,这里我使用了最简单的Dockerfile构建的. 一.安装Docker 我的虚拟机系统是CentOS7,需要是 ...

  9. .netcore项目部署到linux的docker里后,速度异常的慢

    .netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...

  10. 使用Jenkins与Docker持续集成与发布NetCore项目(实操篇)

    使用Jenkins与Docker持续集成与发布NetCore项目(教程一) 原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html 基本环境 该教程的 ...

随机推荐

  1. 内网横向渗透 之 ATT&CK系列一 之 信息收集

    前言 靶机下载地址:ATT&CK 拓扑图: 通过模拟真实环境搭建的漏洞靶场,完全模拟ATK&CK攻击链路进行搭建,形成完整个闭环.虚拟机默认密码为hongrisec@2019. 环境搭 ...

  2. 【疫情动态条形图】用Python开发全球疫情排名动态条形图bar_chart_race

    一.开发背景 你好,我是 @马哥python说 ,这是我用Python开发的全球疫情动态条形图,演示效果: https://www.zhihu.com/zvideo/15603276220259696 ...

  3. Spring笔记三

    Spring-03 1. AOP 1.1 概念 ​ AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.他是一种可以在不修改原来的核心代码的情况下给程序动态统一进 ...

  4. VideoPipe可视化视频结构化框架开源了!

    完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...

  5. POJ3311 Hie with the Pie(状压DP,Tsp)

    本题是经典的Tsp问题的变形,Tsp问题就是要求从起点出发经过每个节点一次再回到起点的距离最小值,本题的区别就是可以经过一个节点不止一次,那么先预处理出任意两点之间的最短距离就行了,因为再多走只会浪费 ...

  6. python今日分享(内置方法)

    目录 一.习题详解 二.数据类型的内置方法理论 三.整型相关操作 四.浮点型相关操作 五.字符串相关操作 六.列表相关操作 今日详解 一.习题详解 1.计算1-100所有数据之和 all_num = ...

  7. Hive Beeline 命令行参数

    [hadoop@hive ~]$ beeline --help[中文版] The Beeline CLI 支持以下命令行参数: Option Description --autoCommit=[tru ...

  8. RAID5 IO处理之写请求代码详解

    我们知道RAID5一个条带上的数据是由N个数据块和1个校验块组成,其校验块由N个数据块通过异或运算得出,这样才能在任意一个成员磁盘失效时通过其他N个成员磁盘恢复出用户写入的数据.这也就要求RAID5条 ...

  9. 2流高手速成记(之五):Springboot整合Shiro实现安全管理

    废话不多说,咱们直接接上回 上一篇我们讲了如何使用Springboot框架整合Nosql,并于文章最后部分引入了服务端Session的概念 而早在上上一篇中,我们则已经讲到了如何使用Springboo ...

  10. 二十八、Helm

    使用Helm3管理复杂应用的部署 认识Helm 为什么有helm? Helm是什么? kubernetes的包管理器,"可以将Helm看作Linux系统下的apt-get/yum" ...