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

创建配置文件

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

# 第一部分是编译并发布项目
# 以微软.Net Core SDK作为基础镜像, 并且以build作为别名
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
# 切换build镜像工作目录到/app
WORKDIR /app
# 拷贝sln和csproj项目文件
COPY *.sln .
COPY AliPay/*.csproj ./AliPay/
# Restore项目用到的包
RUN dotnet restore
# 拷贝项目文件到镜像里面相应到目录
COPY AliPay/. ./AliPay/
# 切换build镜像工作目录到/app/AliPay
WORKDIR /app/AliPay
# 以Release模式发布应用到out文件夹
RUN dotnet publish -c Release -o out
# 第二部分是启动项目
# 以微软.Net Core运行环境作为基础镜像, 并且以runtime作为别名
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
# 切换runtime镜像工作目录到/app
WORKDIR /app
# 把build镜像里面编译出来的文件拷贝到runtime镜像
COPY --from=build /app/AliPay/out ./
# 暴漏端口
EXPOSE 8000
# 启动应用
# ENTRYPOINT ["dotnet", "AliPay.dll", "--server.urls", "http://*:8000"]
ENTRYPOINT ["dotnet", "AliPay.dll"]

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

bin\
obj\

打包镜像

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

docker build -t alipayimg .

里面的两个参数:

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

启动容器

最后是启动镜像:

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

参数说明:

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

编程总结

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

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

而它一直不起作用.

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

Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration(config =>
{
config.AddJsonFile("alipay.json");
// config.AddCommandLine(args);
});
webBuilder.UseUrls("http://*:8000");
webBuilder.UseStartup<Startup>();
});

访问应用

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

Docker加强

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

移除容器和镜像

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

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

引进Redis

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

引入类库

首先使用nugget安装StackExchange.Redis.

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

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

改写代码

修改HomeController如下:

private readonly ILogger<HomeController> _logger;
private readonly IConnectionMultiplexer _connectionMultiplexer;
public HomeController(ILogger<HomeController> logger, IConnectionMultiplexer multiplexer)
{
_logger = logger;
_connectionMultiplexer = multiplexer;
}
public IActionResult Index()
{
var db = _connectionMultiplexer.GetDatabase();
var num = db.StringIncrement("count");
ViewData["num"] = num;
return View();
}

修改Home/Index的view如下:

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

添加编排文件

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

version: '3.0'
services:
alipay:
container_name: alipay
image: alipayimg
build:
context: .
dockerfile: ./Dockerfile
depends_on:
- myredis
links:
- "myredis:docker.myredis"
ports:
- "8666:8000"
myredis:
container_name: myredis
image: redis

编排项目:

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. Editorial of Codeforces Round #572

    技不如人啊emmm A \(f_{i}\)表示前\(i\)个最小割段,顺便用\(pre_{i}\)记录上一个转移过来的位置 B 这题似乎随便乱搞都能过 官方题解:\(a_{n-1},a_n,a_{n- ...

  2. [代码审计]PHP_Bugs题目总结(2)

    写的有点多了,上一篇放在一起显得有点臃肿,就再起一篇吧~ 迷路的老铁点这里:[代码审计]PHP_Bugs题目总结(1) 0x14 intval函数四舍五入 <?php if($_GET[id]) ...

  3. com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-418, SQLSTATE=42610, SQLERRMC=null

    写了一条sql,在db2数据库中可以执行,但是转换成mybatis的mapper文件后,在执行排序操作时报该错误. 我排序是这样写的 <if test="orderStr != nul ...

  4. ubuntu之路——day5(今天看了浅层神经网络的数学推导过程)

    1.初始化 2.前向传播 导数比较好理解 3.反向传播 全符号积分的推导看得我头有点晕 最后唤起我依稀的线代回忆 感谢吴恩达老师的反向传播讲解,第一遍看的有点晕,然后仔细看了一下又找了个B站的推导就懂 ...

  5. DNGuard HVM Unpacker(3.71 trial support and x64 fixed)

    DNGuard HVM Unpacker(3.71 trial support and x64 fixed) Gr8 news. Finally got the x64 crash fixed. DN ...

  6. 在 delphi (Object Pascal 语言)中,使用 array 关键字进行数组定义。

    如果需要定义二维数组可以采取以下定义形式: 一.静态数组定义 静态数组定义,通常用于数组元素的数目确定的情况.定义形式如下: 示例: 1 2 3 4 5 6 7 8 9 10 11 type   // ...

  7. 课程学习 - 人类疾病导论 | Introduction To Human Disease

    完美人类假设:一类人,具有最完美的基因组,享受最健康的环境和饮食,同时拥有最健康的思想情绪,最终以最长的寿命,自然死亡. 自然死亡是自然生命最终的归宿,这是写在目前基因组里的铁律! 不管科技如何发展, ...

  8. (基因功能 & 基因表达调控)研究方案

    做了好久的RNA-seq分析,基因表达也在口头溜了几年了,但似乎老是浮在表面. 对一件事的了解程度决定了你的思维深度,只想做技工就不用想太多,想做大师就一定要刨根问底. 老是说基因表达,那么什么是基因 ...

  9. 基于CentOS7系统添加自定义脚本服务及参数说明【转】

    概述 centos6如果要添加自定义脚本服务只需要把脚本放到/etc/init.d然后授权后用chkconfig添加后就可以管理了,那么centos7又是怎么添加自定义脚本服务呢? CentOS7添加 ...

  10. layer.msg 弹出不同的效果的样式

    icon 1到6的不同效果 layer.msg(,time:, shift: });//一个勾 layer.msg(,time:, shift: });//一个叉 layer.msg(,time:, ...