.netcore项目docker化,以及docker之间通信
简言:
最近刚完成公司的新系统,系统使用的是微服务架构,由于领导说要将服务docker化。下面将我的研究结果分享出来,如若有错误的地方,还请各位多多指点。
目录:
- 什么是docker?
- 使用docker有什么好处?
- docker的使用和docker之间的通信
1. 什么是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱(沙箱:一个虚拟系统程序)机制,相互之间不会有任何接口。也就是说,我们可以用docker把我们系统和系统所需要的环境以及依赖的软件都打包成一个安装包,然后可以安装到linux或windows上。
关于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 { 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通信有三种方式:
- 通过docker容器ip加端口号。因为docker容器重启之后ip地址会改变,不方便迁移。所以不推荐使用。(除非使用固定ip)
- 通过映射到主机的端口号。这种方式可以,但是会占用主机端口号
- 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之间通信的更多相关文章
- Docker学习总结(18)——阿里超大规模Docker化之路
12月6-7日,由阿里巴巴集团.阿里巴巴技术发展部.阿里云云栖社区联合主办,以"2016双11技术创新"为主题的阿里巴巴技术论坛上,阿里巴巴研究员林昊分享了阿里超大规模Docker ...
- 使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S
使用Gitlab-CI 实现NetCore项目Docker化并部署到阿里云K8S 先行条件: 1.了解NetCore项目基础命令,如dotnet publish 等几个常用命令. 2.了解Dock ...
- .NETCore 实现容器化Docker与私有镜像仓库管理
原文:.NETCore 实现容器化Docker与私有镜像仓库管理 一.Docker介绍 Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技 ...
- AspNetCore容器化(Docker)部署(二) —— 多容器通信
一.前言 着上一篇 AspNetCore容器化(Docker)部署(一) —— 入门,在单个容器helloworld的基础上引入nginx反向代理服务器组成多容器应用. 二.配置反向代理转接 配置转接 ...
- dotnet跨平台 - 使用Nginx+Docker Compose运行.NETCore项目
参考文档: https://docs.docker.com/install/linux/docker-ce/centos/ http://www.dockerinfo.net/document htt ...
- 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信
官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...
- springboot 项目 docker化部署
最近公司项目需要docker化,项目所使用的框架是springboot,linux环境.第一次接触docker化方面的技术.做的时候,所接触的新知识比较多,留下此文,以便以后用到的时候快速入手. 修改 ...
- SpringBoot项目docker化
前言 有很多种方案构建Docker镜像,包括Dockerfile构建.maven插件构建,这里我使用了最简单的Dockerfile构建的. 一.安装Docker 我的虚拟机系统是CentOS7,需要是 ...
- .netcore项目部署到linux的docker里后,速度异常的慢
.netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...
- 使用Jenkins与Docker持续集成与发布NetCore项目(实操篇)
使用Jenkins与Docker持续集成与发布NetCore项目(教程一) 原文地址:https://www.cnblogs.com/Jackyye/p/12588182.html 基本环境 该教程的 ...
随机推荐
- 如何使用netlify部署vue应用程序
什么是Netlify? Netlify是一个现代网站自动化系统,其JAM架构代表了现代网站的发展趋势.所谓JAM,就是指基于客户端JavaScript.可重用API和预构建Markup标记语言的三者结 ...
- NOIP2015 普及组 洛谷P2671 求和 (数学)
一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...
- Hive之权限控制
Hive之权限 一.库级的权限 -- 授予所有权限给某个用户 grant all on msta to user {userName}; -- 授权admin privilege权限 grant AD ...
- RE语法
RE,英文为Regular Expression,中文译作正则表达式.用于文本过滤的工具.RE语法由一些元字符.其它任意字符串作为基本单元,匹配次数.分组匹配.锚定符等为操作单元组成.进行逐行扫描,满 ...
- 齐博X1-栏目的调用3
本节继续说明栏目的调用之同级别栏目 同级栏目的调用 fun('sort@brother',$fid,'cms') 这个函数用的比较多,特别是栏目页,在一个页面会把一个父级栏目下的子级栏目全部列出来, ...
- virtualenv +virtualenvwrapper
一.虚拟环境virtualenv 1.安装:pip3 install virtualenv 2.创建虚拟环境:virtualenv venv #venv为虚拟环境目录名,目录名自定义 #virtual ...
- 洛谷P5759题解
本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \ ...
- Spring boot pom 配置文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Aspose.Cell和NPOI生成Excel文件
1.使用Aspose.Cell生成Excel文件,Aspose.Cell是.NET组件控件,不依赖COM组件 1首先一点需要使用新建好的空Excel文件做模板,否则容易产生一个多出的警告Sheet 1 ...
- 我的Vue之旅 10 Gin重写后端、实现页面详情页 Mysql + Golang + Gin
第三期 · 使用 Vue 3.1 + Axios + Golang + Mysql + Gin 实现页面详情页 使用 Gin 框架重写后端 Gin Web Framework (gin-gonic.c ...