.Net Core in Docker极简入门(下篇)
點(diǎn)擊上方藍(lán)字"小黑在哪里"關(guān)注我吧
Docker-Compose
代碼修改
yml file
up & down
鏡像倉庫
前言
上一篇【.Net Core in Docker極簡(jiǎn)入門(上篇)】講解了docker的一些基本命令和操作,并成功構(gòu)建了自己的asp.net core web應(yīng)用的鏡像,啟動(dòng)容器。本篇繼續(xù)。
開始
上一篇的項(xiàng)目例子非常簡(jiǎn)單,通常我們的實(shí)際項(xiàng)目要復(fù)雜的多。項(xiàng)目中會(huì)依賴各種組件服務(wù),比如數(shù)據(jù)庫,MQ,緩存等等。這就會(huì)涉及到多個(gè)容器,如果手動(dòng)用docker命令去一個(gè)一個(gè)的啟動(dòng)就很麻煩了,那么這時(shí)候就可以使用Docker-Compose來完成多個(gè)容器的管理。
Docker-Compose
什么是Docker Compose?
Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過 Compose,您可以使用 YML 文件來配置應(yīng)用程序需要的所有服務(wù)。然后,使用一個(gè)命令,就可以從 YML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)。
簡(jiǎn)單來理解,Compose類似一個(gè)批量工具,可以執(zhí)行一組命令,支持批量構(gòu)建鏡像,批量啟動(dòng)容器,批量刪除容器等等功能。
Windows的Docker Desktop中已經(jīng)包括了Compose,Linux下Compose則需要單獨(dú)安裝一下。
下面在項(xiàng)目中添加一些數(shù)據(jù)庫操作的相關(guān)代碼便于測(cè)試,使用EF Core+SQL Server。
代碼修改
安裝EF Code相關(guān)的包:
修改代碼:
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);//初始化種子數(shù)據(jù)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){//自動(dòng)遷移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添加數(shù)據(jù)庫連接字符串配置:
{......"ConnectionStrings":?{"DemoContext":?"Server=sql-server;Database=DemoDB;User?Id=sa;Password=Password@2020;"} }注意:Server=sql-server,這個(gè)sql-server是需要在docker-compose.yml中定義的,下面再說。
添加遷移:
yml file
右鍵項(xiàng)目-添加-容器業(yè)務(wù)流程協(xié)調(diào)程序支持
添加后會(huì)生成docker-compose相關(guān)文件:
其中的docker-compose.yml文件需要修改一下:
version:?'3.4'services:webapplication1:image:?${DOCKER_REGISTRY-}webapplication1build:context:?.dockerfile:?WebApplication1/Dockerfileports:?-?'5000:80'networks:-?my-netdepends_on:-?sql-serversql-server:image:?mcr.microsoft.com/mssql/server:2019-CU5-ubuntu-18.04ports:?-?'1434:1433'environment:?ACCEPT_EULA:?YSA_PASSWORD:?Password@2020networks:?-?my-netnetworks:?my-net:?driver:?bridge?services下定義了2個(gè)服務(wù)webapplication1、sql-server,相當(dāng)于2個(gè)容器。webapplication1是基于WebApplication1/Dockerfile構(gòu)建的鏡像${DOCKER_REGISTRY-}webapplication1來啟動(dòng),depends_on用于指定依賴的服務(wù),這里的webapplication1服務(wù)依賴于sql-server服務(wù)。networks用于指定網(wǎng)絡(luò),因?yàn)閐ocker中容器之間默認(rèn)是無法直接通信的,這里創(chuàng)建了一個(gè)bridge模式的網(wǎng)絡(luò)my-net,webapplication1和sql-server都在my-net網(wǎng)絡(luò)中,那么他們之間就可以通過服務(wù)名來通信。所以在上面webapplication1的數(shù)據(jù)庫連接字符串中就可以寫:Server=sql-server。通常數(shù)據(jù)庫的數(shù)據(jù)目錄會(huì)掛載到主機(jī)上,防止容器發(fā)生意外導(dǎo)致數(shù)據(jù)丟失。
上一篇有小伙伴問容器內(nèi)能不能訪問容器外的數(shù)據(jù)庫,這個(gè)是可以訪問的。訪問宿主機(jī)的話直接用IP訪問就可以,或者用host.docker.internal,這個(gè)host.docker.internal是docker安裝時(shí)會(huì)寫入到你的hosts文件里的一個(gè)主機(jī)名,實(shí)際還是指向你的主機(jī)IP。
以上的yml內(nèi)容還是比較簡(jiǎn)單,yml文件是使用Compose必不可少的,語法可以自行學(xué)習(xí)一下。掌握其語法關(guān)鍵字后,你就可以在docker-compose.yml文件中定義更復(fù)雜的環(huán)境。
up & down
來到項(xiàng)目根目錄,啟動(dòng)PowerShell或cmd執(zhí)行docker命令。
執(zhí)行docker-compose up,也可以加-d參數(shù),讓他在后臺(tái)運(yùn)行
啟動(dòng)完成后,瀏覽器訪問:http://localhost:5000/weatherforecast
成功。這里省略了docker-compose build命令,你也可以在up前先執(zhí)行build。
docker-compose是不是很方便呢,即使你的系統(tǒng)環(huán)境部署再復(fù)雜,也只需要一個(gè)up指令。
如果你想摧毀這個(gè)環(huán)境只需要執(zhí)行docker-compose down即可
同樣的,以上操作也可以直接在vs2019中完成,無需手動(dòng)執(zhí)行指令,只需要將docker-compose項(xiàng)目設(shè)為啟動(dòng)項(xiàng),然后直接運(yùn)行即可,還支持代碼調(diào)試哦。不過由于網(wǎng)絡(luò)等問題,可能會(huì)遇到一些坑。。。
鏡像倉庫
我們也可以把自己的鏡像推送到遠(yuǎn)程倉庫,然后在其他機(jī)器上直接就能通過命令拉取了。國(guó)內(nèi)阿里云之類的都有docker鏡像倉庫服務(wù),也可以搭建私有倉庫,本文就推送到docker的官方倉庫docker hub。首先需要在docker官網(wǎng)https://www.docker.com/注冊(cè)賬號(hào)。
重新構(gòu)建鏡像:docker build -t xhznl/webapp1 -f ./WebApplication1/Dockerfile .
其中xhznl是我的docker用戶名。
登錄docker:docker login,輸入自己的用戶名密碼。
登錄成功后即可推送鏡像,執(zhí)行:docker push xhznl/webapp1
推送成功,在docker官網(wǎng)可以查看鏡像:
這樣在其他機(jī)器的docker中也可以通過docker pull xhznl/webapp1來拉取這個(gè)鏡像。
修改docker-compose.yml文件,將webapplication1服務(wù)的image改為xhznl/webapp1,然后把這個(gè)docker-compose.yml文件放到任何裝有docker的機(jī)器上,只需執(zhí)行docker-compose up,即可啟動(dòng)程序的所有環(huán)境,是不是很神奇。
services:webapplication1:image:?xhznl/webapp1ports:?-?'5000:80'networks:-?my-netdepends_on:-?sql-server最后推薦一波vs code,安裝docker相關(guān)插件,無論是編寫yml文件還是管理docker都很方便, 很多操作都不用手敲命令啦。。。
最后
Docker作為當(dāng)今最流行的容器技術(shù),是很多技術(shù)架構(gòu)的基礎(chǔ)。它有很多的優(yōu)點(diǎn),使用中也會(huì)面臨各種問題,希望本篇入門文章能夠幫助到一些初學(xué)的小伙伴。
如果本文對(duì)您有用,
不妨點(diǎn)個(gè)“在看”或者轉(zhuǎn)發(fā)朋友圈支持一下
總結(jié)
以上是生活随笔為你收集整理的.Net Core in Docker极简入门(下篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用 Natasha 写个类型调用的架子
- 下一篇: 这么多Apache顶级项目,SkyWal