使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker
对于刚刚完成的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的更多相关文章
- 使用Docker compose编排Laravel应用
前言 Laravel官方开发环境推荐的是Homestead(其实就是一个封装好的Vagrant box),我感觉这个比较重,于是自己用Docker compose编排了一套开发环境,在这里分享下. 环 ...
- 使用docker compose编排容器
一.安装docker compose 二进制包安装 1.安装 Docker Compose 从 官方 GitHub Release 处直接下载编译好的二进制文件即可 # curl -L https:/ ...
- Docker(二十六)-Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- Docker系列之(五):使用Docker Compose编排容器
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- 通过 Docker Compose 组合 ASP NET Core 和 SQL Server
目录 Docker Compose 简介 安装 WebApi 项目 创建项目 编写Dockfile Web MVC 项目 创建项目 编写Dockfile 编写 docker-compose.yml文件 ...
- docker compose 编排
Compose是Docker的服务编排工具,主要用来构建基于Docker的复杂应用,Compose 通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景. 说明:Comp ...
- Docker Compose编排工具部署lnmp实践及理论(详细)
目录 一.理论概述 编排 部署 Compose原理 二.使用docker compose 部署lnmp 三.测试 四.总结 一.理论概述 Docker Compose是一个定义及运行多个Docker容 ...
- 使用Docker Compose编排Spring Cloud微服务
文章目录 微服务构建实例 简化Compose的编写 编排高可用的Eureka Server 编排高可用Spring Cloud微服务集群及动态伸缩 微服务项目名称 项目微服务中的角色 microser ...
- 在Windows Server 2019通过Docker Compose部署Asp.Net Core
一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...
随机推荐
- Pytest权威教程26-示例和自定义技巧
目录 示例和自定义技巧 返回: Pytest权威教程 示例和自定义技巧 这是一个(不断增长的)示例列表.如果你需要更多示例或有疑问,请联系我们.另请参阅包含许多示例代码段的 综合文档.此外,stack ...
- C 库函数 - strchr()
定义 char *strchr(const char *str, int c) 参数 str -- 要被检索的 C 字符串. c -- 在 str 中要搜索的字符 说明 该函数返回在字符串 str 中 ...
- 「SCOI2011」棘手的操作
传送门 Description 有\(N\)个节点,标号从\(1\)到\(N\),这\(N\)个节点一开始相互不连通.第$ i\(个节点的初始权值为\)a_i$ ,接下来有如下一些操作: U x y ...
- FCS省选模拟赛 Day4
传送门 Solution Code /* 斯坦纳树:O(n*3^n+kE*2^n) 暂且把O(k*E)当成是spfa的复杂度 15:15~16:20 原题:bzoj_4774 */ #include ...
- [洛谷 P4556] 雨天的尾巴
传送门 Solution 线段树合并的入门题 lca可以在dfs的时候离线求(用并查集) 更新的点有每条链的两个端点,它们的lca和dad[lca] 为了节省空间,lca和dad[lca]的更新可以先 ...
- "中国东信杯"广西大学第二届程序设计竞赛 - H - Antinomy与伊尔美格
题意:给一个有向图,n个点m条边,每个点有点权xi.规定从u点出发,到指定的k个点之一结束,可以多次经过同一个点和同一条边,求路径上点权和的最大值. 题解:直接缩点变成DAG,然后dp的时候并不是直接 ...
- docker理论 Cgroup namespace 各种隔离
耦合 是指两个或两个以上的体系或者两种运动形式间通过相互作用而批次影响以至联合起来的现象. Nginx与apache 在同一台服务器运行都占用80端口,起冲突这是我们修改其中一个端口为8080 半解耦 ...
- vim 替换所有字符串
将dev 替换 为 prod: :%s/dev/prod/g
- PHP异步非阻塞fsockopen(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)
index.php /** * php异步请求 * * @param $host string 主机地址 * @param $path string 路径 * @param $param array ...
- 007 CSS基本选择器
复习. 一:类选择器 1.多类名选择器 使用场景:某个标签上需要多个类进行描述. 多个类之间使用空格分开. 冲突的时候,和类名在html中的先后顺序没有关系,和css中的样式的先后顺序有关系. 2.案 ...