.Net Core微服务入门全纪录(八)——Docker Compose与容器网络

.Net Core微服务入门全纪录(八)——Docker Compose与容器网络,第1张

概述Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。 前言 上一篇【.Net Core微服务入门全纪录(七)——IdentityServer4-授权认证】中使用IdentityServer4

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-netnetworks: #定义容器网络    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与容器网络全部内容,希望文章能够帮你解决.Net Core微服务入门全纪录(八)——Docker Compose与容器网络所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/langs/1214766.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存