.Net Core in Docker极简入门(下篇)
Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。
前言
上一篇【.Net Core in Docker极简入门(上篇)】讲解了docker的一些基本命令和操作,并成功构建了自己的asp.net core web应用的镜像,启动容器。本篇继续。
开始
上一篇的项目例子非常简单,通常我们的实际项目要复杂的多。项目中会依赖各种组件服务,比如数据库,MQ,缓存等等。这就会涉及到多个容器,如果手动用docker命令去一个一个的启动就很麻烦了,那么这时候就可以使用Docker-Compose来完成多个容器的管理。
Docker-Compose
什么是Docker Compose?
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
简单来理解,Compose类似一个批量工具,可以执行一组命令,支持批量构建镜像,批量启动容器,批量删除容器等等功能。
Windows的Docker Desktop中已经包括了Compose,Linux下Compose则需要单独安装一下。
下面在项目中添加一些数据库操作的相关代码便于测试,使用EF Core+SQL Server。
代码修改
安装EF Code相关的包:
修改代码:
public class WeatherForecast
{
[Key]
public int Id { get; set; }
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF { get; set; }
public string Summary { get; set; }
}
public class DemoContext : DbContext
{
public DemoContext(DbContextOptions<DemoContext> options)
: base(options)
{
}
public DbSet<WeatherForecast> WeatherForecasts { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//初始化种子数据
modelBuilder.Entity<WeatherForecast>().HasData(new WeatherForecast
{
Id = 1,
Date = DateTime.Now,
Summary = "none",
TemperatureC = 20,
TemperatureF = 32 + (int)(20 / 0.5556)
}, new WeatherForecast
{
Id = 2,
Date = DateTime.Now.AddDays(1),
Summary = "none",
TemperatureC = 25,
TemperatureF = 32 + (int)(25 / 0.5556)
});
}
}
public class Startup
{
......
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddDbContext<DemoContext>(opt => opt.UseSqlServer(Configuration.GetConnectionString("DemoContext")));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DemoContext context)
{
//自动迁移
context.Database.Migrate();
......
}
}
public class WeatherForecastController : ControllerBase
{
private readonly ILogger<WeatherForecastController> _logger;
private readonly DemoContext _context;
public WeatherForecastController(ILogger<WeatherForecastController> logger, DemoContext context)
{
_logger = logger;
_context = context;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
return _context.WeatherForecasts.ToArray();
}
}
appsettings.json添加数据库连接字符串配置:
{
......
"ConnectionStrings": {
"DemoContext": "Server=sql-server;Database=DemoDB;User Id=sa;Password=Password@2020;"
}
}
注意:Server=sql-server,这个sql-server是需要在docker-compose.yml中定义的,下面再说。
添加迁移:
yml file
右键项目-添加-容器业务流程协调程序支持
添加后会生成docker-compose相关文件:
其中的docker-compose.yml文件需要修改一下:
version: '3.4'
services:
webapplication1:
image: ${DOCKER_REGISTRY-}webapplication1
build:
context: .
dockerfile: WebApplication1/Dockerfile
ports:
- '5000:80'
networks:
- my-net
depends_on:
- sql-server
sql-server:
image: mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04
ports:
- '1434:1433'
environment:
ACCEPT_EULA: Y
SA_PASSWORD: Password@2020
networks:
- my-net
networks:
my-net:
driver: bridge
services下定义了2个服务webapplication1、sql-server,相当于2个容器。webapplication1是基于WebApplication1/Dockerfile构建的镜像${DOCKER_REGISTRY-}webapplication1来启动,depends_on用于指定依赖的服务,这里的webapplication1服务依赖于sql-server服务。networks用于指定网络,因为docker中容器之间默认是无法直接通信的,这里创建了一个bridge模式的网络my-net,webapplication1和sql-server都在my-net网络中,那么他们之间就可以通过服务名来通信。所以在上面webapplication1的数据库连接字符串中就可以写:Server=sql-server。通常数据库的数据目录会挂载到主机上,防止容器发生意外导致数据丢失。
上一篇有小伙伴问容器内能不能访问容器外的数据库,这个是可以访问的。访问宿主机的话直接用IP访问就可以,或者用host.docker.internal
,这个host.docker.internal是docker安装时会写入到你的hosts文件里的一个主机名,实际还是指向你的主机IP。
以上的yml内容还是比较简单,yml文件是使用Compose必不可少的,语法可以自行学习一下。掌握其语法关键字后,你就可以在docker-compose.yml文件中定义更复杂的环境。
up & down
来到项目根目录,启动PowerShell或cmd执行docker命令。
执行docker-compose up
,也可以加-d参数,让他在后台运行
启动完成后,浏览器访问:http://localhost:5000/weatherforecast
成功。这里省略了docker-compose build
命令,你也可以在up前先执行build。
docker-compose是不是很方便呢,即使你的系统环境部署再复杂,也只需要一个up指令。
如果你想摧毁这个环境只需要执行docker-compose down
即可
同样的,以上操作也可以直接在vs2019中完成,无需手动执行指令,只需要将docker-compose项目设为启动项,然后直接运行即可,还支持代码调试哦。不过由于网络等问题,可能会遇到一些坑。。。
镜像仓库
我们也可以把自己的镜像推送到远程仓库,然后在其他机器上直接就能通过命令拉取了。国内阿里云之类的都有docker镜像仓库服务,也可以搭建私有仓库,本文就推送到docker的官方仓库docker hub。首先需要在docker官网https://www.docker.com/注册账号。
重新构建镜像:docker build -t xhznl/webapp1 -f ./WebApplication1/Dockerfile .
其中xhznl是我的docker用户名。
登录docker: docker login
,输入自己的用户名密码。
登录成功后即可推送镜像,执行:docker push xhznl/webapp1
推送成功,在docker官网可以查看镜像:
这样在其他机器的docker中也可以通过docker pull xhznl/webapp1
来拉取这个镜像。
修改docker-compose.yml文件,将webapplication1服务的image改为xhznl/webapp1,然后把这个docker-compose.yml文件放到任何装有docker的机器上,只需执行docker-compose up
,即可启动程序的所有环境,是不是很神奇。
services:
webapplication1:
image: xhznl/webapp1
ports:
- '5000:80'
networks:
- my-net
depends_on:
- sql-server
最后推荐一波vs code,安装docker相关插件,无论是编写yml文件还是管理docker都很方便, 很多操作都不用手敲命令啦。。。
最后
Docker作为当今最流行的容器技术,是很多技术架构的基础。它有很多的优点,使用中也会面临各种问题,希望本篇入门文章能够帮助到一些初学的小伙伴。
.Net Core in Docker极简入门(下篇)的更多相关文章
- .Net Core in Docker极简入门(上篇)
目录 前言 开始 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & run 前言 Docker 是一个开源 ...
- 小白的docker极简入门(二)、5分钟教你玩转docker安装
0-前言 上一篇中,我们已经安装后Linux了,我们需要在Linux下安装docker,然后才能在docker中安装和部署各种应用 同样,5分钟教你完成docker正确安装和使用, 不是纸上谈兵,不是 ...
- Docker极简入门:使用Docker运行Java程序
运行简单的Java程序 先在当前目录创建App.java文件 public class App{ public static void main(String[] args){ String os = ...
- Docker极简入门:使用Docker-Compose 运行网站浏览量统计Demo
Docker-Compose 是一个可以对 Docker 容器集群的快速编排的工具,能够减轻您心智和手指的负担. 简单的来说 Docker-Compose 就是将你运行多个容器的命令编写到了一起,类似 ...
- Docker极简入门:使用Docker-Compose 搭建redis集群
为了构建一个集群,我们首先要让 redis 启用集群模式 一个简单的配置文件如下redis.conf # redis.conf file port 6379 cluster-enabled yes c ...
- Spring Security极简入门三部曲(上篇)
目录 Spring Security极简入门三部曲(上篇) 写在前面 为什么要用Spring Security 数据库设计 demo时刻 核心代码讲解 小结 Spring Security极简入门三部 ...
- Git 极简入门教程学习笔记
Git 极简入门教程 http://rogerdudler.github.io/git-guide/index.zh.html 测试用 https://github.com/xxx/BrnShop. ...
- ElasticSearch极简入门总结
一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...
- Spring Security极简入门三部曲(中篇)
目录 Spring Security极简入门三部曲(中篇) 验证流程 Authentication接口 过滤器链 AuthenticationProvider接口: demo时刻 代码讲解 小结 Sp ...
随机推荐
- MongoDB快速入门教程 (3.2)
3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...
- vue全家桶(1)
1.环境搭建 1.1.脚手架搭建 1.1.1什么是脚手架 百度搜索一下脚手架长什么样子,它们是这样的: 从百度百科抄过来一段话: 脚手架是为了保证各施工过程顺利进行而搭设的工作平台.如果明白了脚手架在 ...
- 洛谷 P6136 【【模板】普通平衡树(数据加强版)】
爱死替罪羊树了 这种暴力的数据结构爱死了.什么?!你还不知道替罪羊树?那就看看这篇博客这篇博客吧.替罪羊树就是当不平衡时,拍扁重建,然后就平衡了.想切这道题,要先把普通平衡树那道题做了(这篇博客讲了的 ...
- vscode 配置 c++ 环境
vscode 配置 c++ 环境 参考的这篇bloghttps://blog.csdn.net/bat67/article/details/81268581 1.安装编译器.这里安装 codebloc ...
- 分享几个很实用的CSS技巧对前端技术很有帮助
创建剪切动画 对于剪切动画,使用clip-path代替width/height,避免DOM重排导致性能过低. .animate { width: 200px; height: 200px; backg ...
- css中vertical-aling与line-height
基线 baseline:字符x的底部 x-height: 字母x的高度,vertical-aling设置为middle的时候,对齐的是baseline往上1/2的x-height,所以vertical ...
- 如何快速部署一条Simplechain子链
我们都知道Simplechain是一种主子链架构,主链Simplechain是POW共识算法的公链.那如何快速创建一条属于自己的子链呢?下面我们就是快速部署一条子链流程.首先clone 源码, 然后按 ...
- NOIP 2016 洛谷 P2827 蚯蚓 题解
题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...
- [JAVA]《JAVA开发手册》规约详解
[强制] 使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时,不可以对其进行添加元素操作,否则会抛出 UnsupportedOperationExceptio ...
- UDP/TCP 流程与总结
1 UDP流程 前序:可以借助网络调试助手工具进行使用 1 UDP 发送方 1 创建UDP套接字 2 准备目标(发送方) IP和端口 3 需要发送的数据内容 4 关闭套接字 from socket i ...