简言:

  最近刚完成公司的新系统,系统使用的是微服务架构,由于领导说要将服务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. SEO知识点

    SEO中的长尾理论 长尾关键词就是包含关键信息,但是搜索量比较少的句子或词组. 每一个长尾关键词都可能会为网站带来流量.一般一个较大的网站,流量的主要来源可能都由长尾关键词构成,因为网站除了目标关键词 ...

  2. Jenkins 中使用 Git Parameter 插件动态获取 Git 的分支

  3. host主机监控规则

    1.先在 Prometheus 主程序目录下创建rules目录,然后在该目录下创建 host.yml文件,内容如下: 内容很多,可以根据实际情况进行调整. 规则参考网址:https://awesome ...

  4. 1. Fluentd安装方法

    Fluentd是一个跨平台的开源系统,支持在Linux(Redhat.Ubuntu.Debian).Windows平台上运行.MacOS呢?官方并没有明显指出,但是在安装说明中列出了通过Ruby Ge ...

  5. 4.Gitlab CI 与 Kubernetes 的结合

    参考网址:https://www.qikqiak.com/post/gitlab-ci-k8s-cluster-feature/

  6. Java SpringBoot 项目构建 Docker 镜像调优实践

    PS:已经在生产实践中验证,解决在生产环境下,网速带宽小,每次推拉镜像影响线上服务问题,按本文方式构建镜像,除了第一次拉取.推送.构建镜像慢,第二.三-次都是几百K大小传输,速度非常快,构建.打包.推 ...

  7. Rust学习入门

    介绍 特性: 高性能,内存利用率高,没有运行时和垃圾回收 可靠 , 丰富的类型系统和所有权模型保证内存和线程安全,编译器可以消除各种错误 生产力, 包管理器.构建工具一流, 多编辑器支持自动补齐和格式 ...

  8. Python实现给图片加水印功能

    前言 最近忙得连轴转,很久没更新博客了,代码倒是没啥写,积累了好些东西,接下来一有时间就来更新吧~ 本文记录使用Python实现给图片添加水印的功能实现过程 先看效果 把公众号的封面作为素材 原图是这 ...

  9. C#-14 枚举器和迭代器

    一 枚举器和可枚举类型 当我们为数组使用foreach语句时,这个语句为我们依次取出了数组中的每一个元素. var arrInt = new int[] { 11, 12, 13, 14 }; for ...

  10. sql中更换函数REPLACE

    update <表名> ser <更换的列名> replace(<更换的列名>,'<更换前的对象>','<更换后的对象>') 例 updat ...