对于刚刚完成的Alipay支的Demo, 我想要把它部署到Docker中去, 下面我来演示相关步骤.

创建配置文件

配置文件的重中之重是Dockerfile, 他的内容如下:

  1. # 第一部分是编译并发布项目
  2. # 以微软.Net Core SDK作为基础镜像, 并且以build作为别名
  3. FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
  4. # 切换build镜像工作目录到/app
  5. WORKDIR /app
  6. # 拷贝sln和csproj项目文件
  7. COPY *.sln .
  8. COPY AliPay/*.csproj ./AliPay/
  9. # Restore项目用到的包
  10. RUN dotnet restore
  11. # 拷贝项目文件到镜像里面相应到目录
  12. COPY AliPay/. ./AliPay/
  13. # 切换build镜像工作目录到/app/AliPay
  14. WORKDIR /app/AliPay
  15. # 以Release模式发布应用到out文件夹
  16. RUN dotnet publish -c Release -o out
  17. # 第二部分是启动项目
  18. # 以微软.Net Core运行环境作为基础镜像, 并且以runtime作为别名
  19. FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
  20. # 切换runtime镜像工作目录到/app
  21. WORKDIR /app
  22. # 把build镜像里面编译出来的文件拷贝到runtime镜像
  23. COPY --from=build /app/AliPay/out ./
  24. # 暴漏端口
  25. EXPOSE 8000
  26. # 启动应用
  27. # ENTRYPOINT ["dotnet", "AliPay.dll", "--server.urls", "http://*:8000"]
  28. ENTRYPOINT ["dotnet", "AliPay.dll"]

还可以再多一个.dockerignore, 如下:

  1. bin\
  2. obj\

打包镜像

在创建了Dockerfile之后, 创建镜像将会很容易:

  1. docker build -t alipayimg .

里面的两个参数:

  • -t: 指定要创建的目标镜像名
  • .: Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

启动容器

最后是启动镜像:

  1. docker run -d -p 8666:8000 --name alipay alipayimg

参数说明:

  • -d: 镜像启动后在后台运行
  • -p 8666:8000: 端口的映射关系, 主机端口:容器端口
  • --name alipay: 启动容器的名字
  • alipayimg: 使用的镜像名

编程总结

一开始, 我按照网上的介绍, 一直使用如下命令指定端口:

  1. dotnet AliPay.dll --server.urls http://*:8000

而它一直不起作用.

Github上说需要添加Microsoft.Extensions.Configuration.CommandLine, 可是添加完了依然不起作用, 没办法, 最后只能在代码里把端口写死:

  1. Host.CreateDefaultBuilder(args)
  2. .ConfigureWebHostDefaults(webBuilder =>
  3. {
  4. webBuilder.ConfigureAppConfiguration(config =>
  5. {
  6. config.AddJsonFile("alipay.json");
  7. // config.AddCommandLine(args);
  8. });
  9. webBuilder.UseUrls("http://*:8000");
  10. webBuilder.UseStartup<Startup>();
  11. });

访问应用

打开主机浏览器, 访问http://localhost:8666, 大功告成.

Docker加强

在之前的基础上, 我们继续使用docker-compose进行容器编排.

移除容器和镜像

因为要进行编排, 所以我们使用命令将之前创建的容器和镜像删掉:

  • 关闭容器:
  1. docker stop container_id[container_name]
  • 删除容器:
  1. docker rm container_id[container_name]
  2. # 注意: 如果没有停止容器直接删除会报错
  • 删除镜像:
  1. docker rm- image_id[image_name]
  2. # 注意: 如果没有删除容器而直接删除镜像会报错

引进Redis

如果是单个文件使用compose实际上意义不大, 所以我们引进Redis.

引入类库

首先使用nugget安装StackExchange.Redis.

安装完成之后, 在Startup的ConfigureService添加内容如下:

  1. services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect("docker.myredis:6379"));

改写代码

修改HomeController如下:

  1. private readonly ILogger<HomeController> _logger;
  2. private readonly IConnectionMultiplexer _connectionMultiplexer;
  3. public HomeController(ILogger<HomeController> logger, IConnectionMultiplexer multiplexer)
  4. {
  5. _logger = logger;
  6. _connectionMultiplexer = multiplexer;
  7. }
  8. public IActionResult Index()
  9. {
  10. var db = _connectionMultiplexer.GetDatabase();
  11. var num = db.StringIncrement("count");
  12. ViewData["num"] = num;
  13. return View();
  14. }

修改Home/Index的view如下:

  1. @{
  2. ViewData["Title"] = "Home Page";
  3. }
  4. <div class="text-center">
  5. <h1 class="display-4">Welcome, 您是当前 @ViewData["num"] 位访客, 更新1</h1>
  6. <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
  7. </div>

添加编排文件

在项目根目录添加docker-compose.yml, 内容如下:

  1. version: '3.0'
  2. services:
  3. alipay:
  4. container_name: alipay
  5. image: alipayimg
  6. build:
  7. context: .
  8. dockerfile: ./Dockerfile
  9. depends_on:
  10. - myredis
  11. links:
  12. - "myredis:docker.myredis"
  13. ports:
  14. - "8666:8000"
  15. myredis:
  16. container_name: myredis
  17. image: redis

编排项目:

  1. docker-compose up --build -d

使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker的更多相关文章

  1. 使用Docker compose编排Laravel应用

    前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环 ...

  2. 使用docker compose编排容器

    一.安装docker compose 二进制包安装 1.安装 Docker Compose 从 官方 GitHub Release 处直接下载编译好的二进制文件即可 # curl -L https:/ ...

  3. Docker(二十六)-Docker Compose编排容器

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

  4. Docker系列之(五):使用Docker Compose编排容器

    1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...

  5. 通过 Docker Compose 组合 ASP NET Core 和 SQL Server

    目录 Docker Compose 简介 安装 WebApi 项目 创建项目 编写Dockfile Web MVC 项目 创建项目 编写Dockfile 编写 docker-compose.yml文件 ...

  6. docker compose 编排

    Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景. 说明:Comp ...

  7. Docker Compose编排工具部署lnmp实践及理论(详细)

    目录 一.理论概述 编排 部署 Compose原理 二.使用docker compose 部署lnmp 三.测试 四.总结 一.理论概述 Docker Compose是一个定义及运行多个Docker容 ...

  8. 使用Docker Compose编排Spring Cloud微服务

    文章目录 微服务构建实例 简化Compose的编写 编排高可用的Eureka Server 编排高可用Spring Cloud微服务集群及动态伸缩 微服务项目名称 项目微服务中的角色 microser ...

  9. 在Windows Server 2019通过Docker Compose部署Asp.Net Core

    一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...

随机推荐

  1. 坑:pytest 运行报错unknown hook 'pytest_namespace' in plugin <module 'allure.pytest_plugin'

    右键运行pytest run时报错,原因是pytest版本过高导致的.有时候会遇到在自己本机没问题,拉取服务器代码下来后就出问题了,所以把pytest版本改低就可以,亲测有效,希望对你有帮助 完整报错 ...

  2. 创建一个简单tcp服务器需要的流程

    1.socket创建一个套接字 2.bind绑定ip和port 3.listen使套接字变为可以被动链接 4.accept等待客户端的链接 5.recv/send接收发送数据

  3. Redis恢复数据

    对于单点或者集群,都可以用 cat data.txt | redis-cli --pipe方式进行冷恢复. 对于大数据量会很慢,但不会出错.

  4. ubuntu之路——day3(本来打算做pytorch的练习 但是想到前段时间的数据预处理的可视化分析 就先总结一下)

    首先依托于一个场景来进行可视化分析 直接选了天池大数据竞赛的新人赛的一个活跃题目 用的方式也是最常用的数据预处理方式 [新人赛]快来一起挖掘幸福感!https://tianchi.aliyun.com ...

  5. C# 复制数组容易踩到的坑--引用类型与值类型

    原文链接:https://my.oschina.net/u/3744313/blog/1794235 笔者近期做的项目里大量使用了数组,而在使用过程中,笔者曾经遇到了一个比较低级的问题:如何将一个数组 ...

  6. 文献阅读 - Genome-wide consequences of deleting any single gene

    现在在做单基因敲除后的转录组数据分析,一个显而易见却又百思不得其解的问题出现了: 为什么敲掉一个基因会导致其他那么多基因的表达发生了变化,甚至是其他很多调控基因(转录因子)? 我敲掉的只是一个普通基因 ...

  7. 什么是epistatic effects | 上位效应

    epistatic与interaction之间的区别与联系? genetic上的interaction是如何定义的? Epistasis is the phenomenon where the eff ...

  8. End-To-End Memory Networks

    End-To-End Memory Networks 2019-05-20 14:37:35 Paper:https://papers.nips.cc/paper/5846-end-to-end-me ...

  9. Java static静态关键字 有啥用

    #static有啥用 在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块.static的主要作用在于创建独立于具体对象的域变量或者方法. ...

  10. Socket: java Socket的isConnected()、和isClosed()判断是否在线的问题(转)

    首先,很多初学者都会用这两个API来判断对方是否在线,但是经过我的实践,此API并不能实时判断是否在线的状态. 经过百度查询资料后,得出结论: 事实上这些方法都是访问socket在内存驻留的状态,当s ...