之前在本机测试并成功完成Docker+Subversion+Jenkins部署 .net core(教程见https://www.jianshu.com/p/63b79dad2a10),然而服务器是阿里云虚拟出来的windows server 2019系统,并不能开启Hyper-V,提示处理器没有所需的虚拟化功能。因而再次开始踩坑。
1.安装docker
由于不支持hyper-v,服务器不能安装Docker Desktop,只能安装Docker Engine。可以访问 docker hub查看说明。
打开powershell,运行如下命令:
Install-Module DockerMsftProvider -Force
Install-Package Docker -ProviderName DockerMsftProvider -Force
而后重启服务器,就可以尝试运行hello-world container查看docker是否安装成功了。
PS> docker container run hello-world:nanoserver
Unable to find image 'hello-world:nanoserver' locally
nanoserver: Pulling from library/hello-world
bce2fbc256ea: Pull complete
3ac17e2e6106: Pull complete
8cac44e17f16: Pull complete
5e160e4d8db3: Pull complete
Digest: sha256:25eac12ba40f7591969085ab3fb9772e8a4307553c14ea72d0e6f98b2c8ced9d
Status: Downloaded newer image for hello-world:nanoserver
Hello from Docker!
This message shows that your installation appears to be working correctly.
注意,该版本的docker只能运行windows container,并不能运行linux container。
2.在docker中执行 .net core程序
这部分大部分与上一篇文章一致,dockerfile内有部分不同,我可以放心大胆的复制粘贴啦。
在项目的 根目录 创建Dockerfile
文件,没有任何后缀名,写入如下:
#拉取镜像不同了
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-nanoserver-1903 AS base
#使用管理员权限,不然build的时候会有Access Denied的错误
USER Administrator
WORKDIR /app
EXPOSE 80
#拉取镜像不同了
FROM mcr.microsoft.com/dotnet/core/sdk:2.1-nanoserver-1903 AS build
#使用管理员权限,不然build的时候会有Access Denied的错误
USER Administrator
WORKDIR /src
#注意文件路径
COPY ["SmartForest.Api/SmartForest.Api.csproj", "SmartForest.Api/"]
COPY ["nuget.config", ""]
RUN dotnet restore "SmartForest.Api/SmartForest.Api.csproj"
COPY . .
#注意文件路径
WORKDIR "/src/SmartForest.Api"
RUN dotnet build "SmartForest.Api.csproj" -c Release -o /app/build
##
FROM build AS publish
RUN dotnet publish "SmartForest.Api.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SmartForest.Api.dll"]
或者有个简单的办法,使用vs重新创建项目,选择启用docker支持,注意.net core版本和项目名称和已有的应该一致,如下图所示:
项目创建好之后就会自带Dockerfile文件,添加
USER Administrator
,拷贝至对应目录 即可。在控制台进入当前目录,执行命令
docker build -t {tag} .
,其中 {tag} 是该镜像的标签,可根据需求填写或省略,例如api
;. 代表当前目录,不可以省略。运行成功后输入命令
docker images
可以查看全部镜像,会新增两个镜像:
REPOSITORY TAG IMAGE ID CREATED SIZE
api latest abcc825dfaaa 53 seconds ago 406MB
<none> <none> a9b1ff0f01f7 55 seconds ago 2.7GB
其中上面为发布的镜像,下面的为编译的镜像,可以使用docker image prune -f
删除中间镜像。
3.安装Jenkins
因为该版本docker不能运行linux container,而关于windows container的资料又很少,而且可能又有其他的坑要踩,我选择直接把Jenkins安装到服务器上。
官网地址:http://Jenkins-ci.org/
windows稳定版下载地址:http://mirror.serverion.com/jenkins/windows-stable/
下载解压完成后,直接点击安装,直接默认下一步即可。完成后浏览器会自动打开localhost:8080,出现如下界面:
等待片刻后,自动跳转:
使用记事本打开上述路径文件即可查看密码。
这里有个小插曲,因为服务器上8080和8081端口已经被GeoServer占用,所以上面界面打不开,可以修改安装目录下的jenkins.xml文件,将其修改为8082端口。
<arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8082 --webroot="%BASE%\war"</arguments>
等待片刻后安装推荐组件即可,然后继续等待zzZZ
安装完成后创建管理员账户和配置实例后就可以继续了。
4.创建Jenkins任务
点击左上角创建任务,出现如下界面,选择自由风格软件项目,填入名称,确定。
输入项目描述,选择源码管理,我这里使用的是公司的svn。
第一次添加项目时需要添加授权方式,点击右边添加之后下拉选择即可。
下一步设置构建触发器,这个是用来设置什么时间或者动作触发构建行为,有定时构建、轮询SCM、远程触发构建。
这里选择轮询SCM构建,即为Jenkins在定期轮询代码管理器,看是否有版本更新,如果有则立即开始构建项目。日程表填写
H/2 * * * *
,代表每2分钟轮询一次,注意*
之间有空格(这是crontab语法,教程可以查看https://www.cnblogs.com/yoyoketang/p/11167181.html)。继续设置构建环境,选择在开始构建前删除工作空间,设置构造超时时间,如果超时即为认定构建失败。
设置构建步骤,选择执行windows批处理命令,如下所示。
贴入执行windows批处理命令
::docker 镜像/容器名字名字 这里都命名为这个
set SERVER_NAME=wuzhouapi
::获取容器id
for /F "delims=" %%i in ('docker ps -aqf "name=%SERVER_NAME%"') do ( set CID=%%i)
::获取镜像id
for /F "delims=" %%i in ('docker images -q "%SERVER_NAME%"') do ( set IID=%%i)
if not defined CID goto build
echo "停止容器docker stop %CID%"
docker stop %CID%
echo "删除容器 docker rm %CID%"
docker rm %CID%
if not defined IID goto build
echo "删除镜像 docker rmi -f %SERVER_NAME%"
docker rmi -f %SERVER_NAME%
:build
echo "构建镜像 docker build -t "%SERVER_NAME%" ."
docker build -t="%SERVER_NAME%" .
echo "docker run创建容器... docker run -d --restart=always --name=%SERVER_NAME% -p 8086:80 %SERVER_NAME%"
docker run -d --restart=always --name=%SERVER_NAME% -p 8086:80 %SERVER_NAME%
echo "删除中间镜像 docker image prune -f"
docker image prune -f
echo "%SERVER_NAME%容器创建完成"
点击保存,完毕。
可以在左侧点击立即构建如下图,或修改代码上传触发构建过程。
等待构建完成,如果出现红色圆圈代表构建失败,出现蓝色代表成功。
如果失败可以在控制台输出查看失败原因,排除错误后重新再来。