对于刚刚完成的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. 《挑战30天C++入门极限》c++中指针学习的两个绝好例子

        c/c++中指针学习的两个绝好例子 对于众多人提出的c/c++中指针难学的问题做个总结: 指针学习不好关键是概念不清造成的,说的简单点就是书没有认真看,指针的学习犹如人在学习饶口令不多看多学多 ...

  2. 4、http协议之二

    URL(Unifrom Resource Locator)简述 相对URL 从当前页面(同一个站点内或同一个文章内引用) 绝对URL 从当前页面或其他页面跳转而来(跨站引用) HTTPD版本<0 ...

  3. wpf防止界面卡死

    AsyncInvokeHelper.CallbackInvoke(new Action(() => { System.Threading.Tasks.Task.Factory.StartNew( ...

  4. Leetcode Majority Element系列 摩尔投票法

    先看一题,洛谷2397: 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 [h ...

  5. 解决Spring Boot 拦截器注入service为空的问题

    问题:在自定义拦截器中,使用了@Autowaire注解注入了封装JPA方法的Service,结果发现无法注入,注入的service为空 0.原因分析 拦截器加载的时间点在springcontext之前 ...

  6. HDU 6208 The Dominator of Strings ——(青岛网络赛,AC自动机)

    最长的才可能成为答案,那么除了最长的以外全部insert到自动机里,再拿最长的去match,如果match完以后cnt全被清空了,那么这个最长串就是答案.事实上方便起见这个最长串一起丢进去也无妨,而且 ...

  7. SyntaxError: Non-ASCII character 'æ' in file csdn.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

    错误信息: SyntaxError: Non-ASCII character , but no encoding declared; see http://python.org/dev/peps/pe ...

  8. python format 时间格式

    trainData['survey_time'] = pd.to_datetime(trainData['survey_time'],format = '%Y/%m/%d %H:%M') trainD ...

  9. 腾讯云CENTOS7安装MSSQL2017

    腾讯云CENTOS7安装MSSQL2017 mkdir -p /opt/sqlserver2017cd /opt/sqlserver2017/ 下载离线包:wget https://packages. ...

  10. 判断一个数组的长度用 Length 还是 SizeOf ?

    最近发现一些代码, 甚至有一些专家代码, 在遍历数组时所用的数组长度竟然是 SizeOf(arr); 这不合适! 如果是一维数组.且元素大小是一个字节, 这样用看不出错误, 譬如: var   arr ...