• .netcore项目docker化,以及docker之间通信


    简言:

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

       

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

      

         

  • 相关阅读:
    getElementsByTagName 与 $(élement)的区别
    php面向对象学习笔记
    使用php添加定时任务
    JS中数组Array的用法
    大陆居民身份证真伪校验
    安卓 日常问题 工作日志15
    安卓 日常问题 工作日志14
    安卓 日常问题 工作日志13
    安卓 日常问题 工作日志12
    安卓 日常问题 工作日志11
  • 原文地址:https://www.cnblogs.com/norain/p/docker_comunication.html
Copyright © 2020-2023  润新知