Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

上一篇【.Net Core微服务入门全纪录(七)——IdentityServer4-授权认证】中使用IdentityServer4完成了鉴权中心的搭建,配合网关实现了统一的授权认证。进行到这里,系统环境已经比较复杂了,想把整个系统运行起来会非常繁琐:要运行Consul、业务服务、网关、鉴权中心、web客户端,还要安装数据库、MQ等等。。。那么本篇将使用Docker Compose来解决以上问题,仅需一个简单的命令,即可启动整个环境。

Docker Compose

什么是Docker Compose?

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

简单来理解,Compose类似一个批量工具,可以执行一组命令,支持批量构建镜像,批量启动容器,批量删除容器等等功能。

Windows的Docker Desktop中已经包括了Compose,Linux下Compose则需要单独安装一下。

yml file

yml文件是使用Compose必不可少的,在编写yml文件之前还需要准备Dockerfile。

之前的章节中,有些服务不是在Docker中运行的,现在全部放到Docker中。确保解决方案中每个项目都添加Docker支持。

在根目录新建docker-compose.yml文件:

以下是docker-compose.yml文件内容:

version: '3.4' #Compose文件版本
services: #服务
auth: #定义"auth"服务 对应的是鉴权中心项目
build: #构建
context: . #构建上下文(目录)
dockerfile: ./IDS4.AuthCenter/Dockerfile #Dockerfile文件目录
ports: #端口
- '9080:9080' #容器外部9080 容器内部9080
environment: #环境变量
- ASPNETCORE_URLS=http://+:9080 #程序在容器内部http://+:9080运行 也可以写成http://0.0.0.0:9080
networks: #容器网络
- my-net #自定义网络my-net web: #定义"web"服务 对应的web客户端项目
build:
context: .
dockerfile: ./Web.MVC/Dockerfile
ports:
- '5000:5000'
environment:
- ASPNETCORE_URLS=http://+:5000
networks:
- my-net
depends_on: #"web"服务依赖于"auth"服务和"apigateway"服务,此服务会在依赖服务之后执行
- auth
- apigateway apigateway: #定义"apigateway"服务 对应的网关项目
build:
context: .
dockerfile: ./Ocelot.APIGateway/Dockerfile
ports:
- '9070:9070'
environment:
- ASPNETCORE_URLS=http://+:9070
networks:
- my-net
depends_on:
- orderapi1
- orderapi2
- orderapi3
- productapi1
- productapi2
- productapi3 productapi1: #定义"productapi1"服务 对应的产品服务项目
image: productapi #指定镜像名称,如果不指定 默认是:netcoremicroservicedemo_productapi1,因为下面要用到所以指定一下
build:
context: .
dockerfile: ./Product.API/Dockerfile
ports:
- '9050:9050'
environment:
- ASPNETCORE_URLS=http://+:9050
- ConsulSetting:ServiceIP=productapi1 #程序参数
- ConsulSetting:ServicePort=9050 #程序参数
networks:
- my-net
depends_on:
- consul
- postgres
- rabbitmq
productapi2:
image: productapi #指定镜像名称为productapi,productapi1服务中已经构建了productapi镜像,所以不用重复构建
ports:
- '9051:9051'
environment:
- ASPNETCORE_URLS=http://+:9051
- ConsulSetting:ServiceIP=productapi2
- ConsulSetting:ServicePort=9051
networks:
- my-net
depends_on:
- productapi1
productapi3:
image: productapi
ports:
- '9052:9052'
environment:
- ASPNETCORE_URLS=http://+:9052
- ConsulSetting:ServiceIP=productapi3
- ConsulSetting:ServicePort=9052
networks:
- my-net
depends_on:
- productapi1 orderapi1:
image: orderapi
build:
context: .
dockerfile: ./Order.API/Dockerfile
ports:
- '9060:9060'
environment:
- ASPNETCORE_URLS=http://+:9060
- ConsulSetting:ServiceIP=orderapi1
- ConsulSetting:ServicePort=9060
networks:
- my-net
depends_on:
- consul
- postgres
- rabbitmq
orderapi2:
image: orderapi
ports:
- '9061:9061'
environment:
- ASPNETCORE_URLS=http://+:9061
- ConsulSetting:ServiceIP=orderapi2
- ConsulSetting:ServicePort=9061
networks:
- my-net
depends_on:
- orderapi1
orderapi3:
image: orderapi
ports:
- '9062:9062'
environment:
- ASPNETCORE_URLS=http://+:9062
- ConsulSetting:ServiceIP=orderapi3
- ConsulSetting:ServicePort=9062
networks:
- my-net
depends_on:
- orderapi1 consul:
image: consul #指定镜像名称为consul,本地如果没有consul镜像,会从docker远程仓库拉取
ports:
- '8500:8500'
networks:
- my-net postgres:
image: postgres
environment:
POSTGRES_PASSWORD: pg123456
networks:
- my-net rabbitmq:
image: rabbitmq
networks:
- my-net networks: #定义容器网络
my-net: #my-net网络
driver: bridge #网络模式为bridge

以上yml文件定义了auth,web,apigateway,productapi1,productapi2,productapi3,orderapi1,orderapi2,orderapi3,consul,postgres,rabbitmq 12个服务(容器),和一个容器网络 my-net。这里的productapi和orderapi相当于是基于同样的镜像各运行了3个容器,这其实不太合理,正常他们应该分布在多个docker中。。。

文件的内容虽然有点多,但是应该不难理解,上面的关键字我都有注释。下面再简单介绍一下文件中的networks容器网络。

容器网路

前面的章节中有提到过,默认情况下容器之间的通讯是比较麻烦的,之前是通过host.docker.internal或者容器的IP去访问,虽然是可以访问但有些不友好。更好的方式是,我们可以自定义一个bridge网络,将所有服务(容器)加入这个网络中,那么容器之间就可以直接通过服务名称通信了。bridge模式只是docker网络模式中的一种,有兴趣的话可以自行搜索一下。

代码修改

既然程序都运行在docker中,那就不能写localhosthost.docker.internal之类的主机名了,统一改为docker-compose.yml文件中定义的服务名。如下:

还有多处修改就不全贴出来了,都是些类似的改动。这些配置还是不要写在代码里,改动起来比较乱。

这里有一个特殊的就是identityserver4鉴权服务,这个服务是容器内外部都需要访问的(容器内部ids4发现文档等接口的调用,外部浏览器访问),所以不能直接写服务名auth,写auth的话外部无法访问,写localhost的话内部又无法访问。最后是参考eShopOnContainers项目,使用docker.for.win.localhost来满足内外部的访问需求:

理论上用host.docker.internal或许也可以,没去测试。。。这个配置放到Compose的环境变量里会比较好,这里只是为了方便。

eShopOnContainers项目是微软官方出品的开源项目,对于学习微服务,docker等技术非常有帮助。

项目地址:https://github.com/dotnet-architecture/eShopOnContainers

构建与启动

完成以上操作后,进入项目根目录执行docker-compose build

build完成后,执行docker-compose up -d,-d代表在后台运行

(第一次up,orderapi2,orderapi3,productapi2,productapi3这4个服务会起不来,是因为他们启动时有创建数据库的操作,同时启动会导致后起来的4个重复的服务创建数据库时报错,因为orderapi1和productapi1在创建同样的数据库。。。这个前面说过的。这里等up完再执行一次up就好了)

浏览器访问:http://localhost:5000/

登录后:

这样运行系统是不是非常简单呢?想要摧毁这个环境也很简单,只需要一句docker-compose down

如果不习惯docker命令,推荐使用vscode,装一下docker插件,很方便。

总结

上文用到了Docker-Compose的3个命令:

构建:docker-compose build

启动:docker-compose up

销毁:docker-compose down

其实build命令也可以省略,执行up时如果没有build的话会自动build,无论多复杂的系统环境,只需要一个docker-compose up命令即可启动。不过镜像需要重新bulid的时候,还是要用到build命令。Compose还有一些其他命令,需要的话可以自行搜索。

主要的工作量在于docker-compose.yml文件的编写。

需要代码的点这里:https://github.com/xiajingren/NetCoreMicroserviceDemo

.Net Core微服务入门全纪录(八)——Docker Compose与容器网络的更多相关文章

  1. .Net Core微服务入门全纪录(完结)——Ocelot与Swagger

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(八)--Docker Compose与容器网络]完成了docker-compose.y ...

  2. .Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)

    前言 上一篇[.Net Core微服务入门全纪录(一)--项目搭建]讲到要做到服务的灵活伸缩,那么需要有一种机制来实现它,这个机制就是服务注册与发现.当然这也并不是必要的,如果你的服务实例很少,并且很 ...

  3. .Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

    前言 上一篇[.Net Core微服务入门全纪录(二)--Consul-服务注册与发现(上)]已经成功将我们的服务注册到Consul中,接下来就该客户端通过Consul去做服务发现了. 服务发现 同样 ...

  4. .Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

    前言 上一篇[.Net Core微服务入门全纪录(三)--Consul-服务注册与发现(下)]已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来 ...

  5. .Net Core微服务入门全纪录(五)——Ocelot-API网关(下)

    前言 上一篇[.Net Core微服务入门全纪录(四)--Ocelot-API网关(上)]已经完成了Ocelot网关的基本搭建,实现了服务入口的统一.当然,这只是API网关的一个最基本功能,它的进阶功 ...

  6. .Net Core微服务入门全纪录(六)——EventBus-事件总线

    前言 上一篇[.Net Core微服务入门全纪录(五)--Ocelot-API网关(下)]中已经完成了Ocelot + Consul的搭建,这一篇简单说一下EventBus. EventBus-事件总 ...

  7. .Net Core微服务入门全纪录(七)——IdentityServer4-授权认证

    前言 上一篇[.Net Core微服务入门全纪录(六)--EventBus-事件总线]中使用CAP完成了一个简单的Eventbus,实现了服务之间的解耦和异步调用,并且做到数据的最终一致性.这一篇将使 ...

  8. .Net Core微服务入门全纪录(一)——项目搭建

    前言 写这篇博客主要目的是记录一下自己的学习过程,只能是简单入门级别的,因为水平有限就写到哪算哪吧,写的不对之处欢迎指正. 什么是微服务? 关于微服务的概念解释网上有很多... 个人理解,微服务是一种 ...

  9. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

随机推荐

  1. Java I/O模型及其底层原理

    Java I/O是Java基础之一,在面试中也比较常见,在这里我们尝试通过这篇文章阐述Java I/O的基础概念,帮助大家更好的理解Java I/O. 在刚开始学习Java I/O时,我很迷惑,因为网 ...

  2. @Component、@Service、@Controller、@Rrepository说明

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1       Spring容 ...

  3. 小技巧:如何用 Chrome 将 SVG 转成 PNG

    怎么把 SVG 转成 PNG ?用 Chrome 吧,非常好用,还能设定自己想要的尺寸. 什么是 SVG ? SVG (Scalable Vector Graphics,可缩放矢量图形) 是基于 XM ...

  4. [CF163E]e-Government

    题目   点这里看题目. 分析   首先,我们不需要真的从 AC 自动机中把串删掉.由于我们计算贡献和,我们只需要在 AC 自动机上,把已经删除的串的贡献抹掉就可以了.   接着考虑询问.这是一个很基 ...

  5. zabbix服务的部署

    1.zabbix的介绍 zabbix是一个基于WEB界面分布式系统监视以及网络监视功能的企业的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并且提供灵活的通知机制以让系统管 ...

  6. Quartz.Net系列(四):Quartz五大构件(Scheduler,Job,Trigger,ThreadPool、JobStore)之ThreadPool、JobStore解析

    整体示意图: 1.DefaultThreadPool 如果不存在PropertyThreadPoolType,那么就使用DefaultThreadPool var threadPoolTypeStri ...

  7. (六)获取http状态码和处理返回结果

    int StatusCode = httpResponse.getStatusLine().getStatusCode(); 处理返回结果: /** * 处理返回结果 * @param respons ...

  8. 随机抽样一致性(RANSAC)算法详解

    随机抽样一致性(RANSAC)算法能够有效的剔除特征匹配中的错误匹配点. 实际上,RANSAC能够有效拟合存在噪声模型下的拟合函数.实际上,RANSAC算法的核心在于将点划分为“内点”和“外点”.在一 ...

  9. Probius:一个功能强大的自定义任务系统

    断更的这些日子,我又折腾了一个轮子,文末参考源码 大约在一年半以前写过一篇文章『探秘varian:优雅的发布部署程序』,里边有讲到我们采用类似lego的模块化方式来构建CICD的流程,虽能满足我们的需 ...

  10. for, for in, for of, map, forEach 循环的区别:

    for, for in,  for of, map, forEach 循环的区别: for  遍历数组: //对象遍历数组 var arr = [ {Monday: '星期一', Tuesday: ' ...