对于刚刚完成的Alipay支的Demo, 我想要把它部署到Docker中去, 下面我来演示相关步骤.html
配置文件的重中之重是Dockerfile, 他的内容以下:
web
# 第一部分是编译并发布项目 # 以微软.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, 以下:redis
bin\ obj\
在建立了Dockerfile以后, 建立镜像将会很容易:docker
docker build -t alipayimg .
里面的两个参数:编程
最后是启动镜像:json
docker run -d -p 8666:8000 --name alipay alipayimg
参数说明:c#
一开始, 我按照网上的介绍, 一直使用以下命令指定端口:浏览器
dotnet AliPay.dll --server.urls http://*:8000
而它一直不起做用.bash
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-compose进行容器编排.
由于要进行编排, 因此咱们使用命令将以前建立的容器和镜像删掉:
docker stop container_id[container_name]
docker rm container_id[container_name] # 注意: 若是没有中止容器直接删除会报错
docker rm- image_id[image_name] # 注意: 若是没有删除容器而直接删除镜像会报错
若是是单个文件使用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