Docker能够说是如今微服务,DevOps的基础,我们.Net Core天然也得上Docker。.Net Core发布到Docker容器的教程网上也有很多,可是今天仍是想来写一写。
你搜.Net core程序发布到Docker网上通常常见的有两种方案:html
二、在服务端直接经过Git获取最新源代码后编译成Dll而后构建Docker镜像再运行容器。该方案免去了往服务器复制文件这步操做,可是服务器环境须要安装.Net Core SDK 来编译源代码。
自从用了Docker简直懒的不能自理,我既不想手工复制文件到服务器,也不想在服务器装.Net Core环境。显然只要Docker镜像包含.Net Core SDK环境就能够在Docker内帮咱们编译代码而后运行,这样连咱们的服务器都不用装啥.Net Core的环境拉。git
public class HomeController : Controller { public IActionResult Index() { return Content($"Core for docker , {DateTime.Now} , verson 2"); } }
修改HomeController下的index Action,直接输出一段文字web
public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(op => { op.ListenAnyIP(5000); }) .UseStartup<Startup>();
修改Program下的CreateWebHostBuilder方法,让Kestrel监听5000端口docker
本地运行一下试试shell
把咱们的代码推送到对应的Git仓库,方便咱们从部署服务器上直接拉取最新的代码。vim
X:\workspace\CoreForDocker>git remote add origin https://gitee.com/kklldog/CoreForDocker.git X:\workspace\CoreForDocker>git push -u origin master Username for 'https://gitee.com': xxx@gmail.com Password for 'https://xxx@gmail.com@gitee.com': Counting objects: 88, done. Delta compression using up to 4 threads. Compressing objects: 100% (83/83), done. Writing objects: 100% (88/88), 527.07 KiB | 2.43 MiB/s, done. Total 88 (delta 7), reused 0 (delta 0) remote: Powered By Gitee.com To https://gitee.com/kklldog/CoreForDocker.git * [new branch] master -> master Branch 'master' set up to track remote branch 'master' from 'origin'.
在CoreForDocker下新增一个Dockerfile文件,注意没有任何扩展名。咱们须要基于microsoft/dotnet:latest这个镜像构建一个新的镜像。而且在构建的过程当中直接对源码进行编译并发布。bash
FROM microsoft/dotnet:latest WORKDIR /app COPY /. /app RUN dotnet restore RUN dotnet publish -o /out -c Release EXPOSE 5000 ENTRYPOINT ["dotnet", "/out/CoreForDocker.dll"]
大概解释下Dockerfile的意思:
FROM microsoft/dotnet:latest:使用dotnet的最新镜像,这个镜像其实对应的应该就是2.2-sdk这个镜像,里面包含了dotnet-core 2.2 sdk
WORKDIR /app:指定工做目录为app
COPY /. /app:复制宿主机当前目录的内容到容器的app文件夹
RUN dotnet restore:还原nuget包
RUN dotnet publish -o /out -c Release:编译并发布程序集到容器的out目录
EXPOSE 5000:暴露5000端口
ENTRYPOINT ["dotnet", "/out/CoreForDocker.dll"]:容器启动的时候执行dotnet命令,参数为/out/CoreForDocker.dll服务器
Dockerfile的文件属性设置为始终复制
新建好Dockerfile后git push到代码仓库。并发
这里以Ubuntu为例,ssh登陆到服务器后使用git clone命令拉取源代码。mvc
git clone https://gitee.com/kklldog/CoreForDocker.git
进入源码目录
cd CodeForDocker\CodeForDocker
使用docker build命令构建新的镜像,注意不要忘记最后一个'.'
docker build -t image_code4docker .
若是以上步骤都没有报错,那么恭喜你镜像已经构建成功了,咱们可使用此镜像运行Docker容器了。
docker run -d --name code4docker -p 5000:5000 -v /ect/localtime:/ect/localtime image_core4docker
使用image_core4docker镜像运行一个名为core4docker的容器,绑定宿主机的5000到容器的5000口。其中须要注意的是-v参数映射宿主机的/ect/localtime文件夹到容器的/ect/localtime文件夹,由于通过实践发现容器中的时区有可能跟宿主机不一致,须要映射宿主机的/ect/localtime让容器的时区跟宿主机保持一致。
访问一下服务器的5000端口,发现可以正确返回数据表示咱们的Asp.net Core程序在容器中运行成功了
之后当咱们对源码进行修改,并提交后,咱们只需在服务器上拉取最新的代码而后使用docker build,docker run命令来再次生成镜像并运行容器。可是手工输入docker build,docker run的命令好像也很麻烦,参数又那么多,太烦了。
为了偷懒不想敲那么长的命令,咱们能够构建一个脚本,把命令一次性写好,之后只要运行一次脚本就能够了。
使用vim新建一个publish.sh的文件
vim publish.sh
键盘上按i进入编辑模式,输入如下内容
cd CoreForDocker/CoreForDocker git pull docker stop core4docker docker rm core4docker docker rmi image_core4docker docker build -t image_core4docker . docker run --name core4docker -d -p 5000:5000 -v /etc/localtime:/etc/localtime image_core4docker
以上命令,不光有新建镜像跟运行容器的命令,还有移除原来的容器跟镜像的命令
按ecs进入命令模式,退出保存
:wq
让咱们模拟修改一下源代码,并提交到代码仓库
public IActionResult Index() { return Content($"Core for docker , {DateTime.Now} , version 2"); }
再次修改homecontroller的index action,输出内容上新增一个version
ssh登陆到服务器,运行publish.sh文件
/bin/bash publish.sh
跑完以后咱们再次访问下服务器的5000口,数据返回正确,表示服务器上跑的已是最新的程序了
经过以上演示咱们基本了解如何经过git跟docker配合在Ubuntu服务器上不安装.Net Core SDK来发布.Net Core 程序到容器中运行,而且经过shell脚本的方式再次简化发布。可是尽管这样每次发布都须要ssh到服务器上而后运行脚本,特别是开发环境可能常常须要发布,仍是以为麻烦。有没有什么办法让咱们push代码后服务器自动就开始部署最新的代码的到容器中运行了呢? 后面我会介绍下如何经过jenkins跟webhook来作CICD。