1.前置条件
1)Docker开启TCP端口,CloudBees Docker Build and Publish plugin插件会向目标主机docker生成docker镜像
开启docker apiserver的2375管理端口,本示例在CentOS7环境下。编辑docker.service文件,修改ExecStart参数,添加-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
vim /lib/systemd/system/docker.service
[Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always
2)搭建一个私有docker仓库,(可选)
有时候我们的镜像不希望对外公布,那么我们就需要自建docker仓库.在这方面harbor是一个不错的选择
有关harbor的搭建过程可以在网上查找
我这里没有私有化的需求,所以选择在docker hub上存放docker镜像即可.使用前需要到docker hub上注册一个账号
2.在jenkins中创建项目并进行配置
这里需要注意:
1.仓库名称前缀,请使用docker hub的账户名,如果使用harbor前缀未 harbor的用户名.并保证用户用push权限 ,示例:zhangsan/${JOB_NAME}
如果不这样填写,会提示没有权限推送
2.Docker Host URI 请填写docker主机的地址,并确保docker打开了2375端口.(这个作为前置条件已经说明)
3.Docker registy URL 填写docker仓库的地址,不填写默认使用docker hub作为仓库地址
4.Registry credentials 填写docker仓库的用户名和密码
执行shell脚本:
改脚本的主要作用是使用marathon的API 自动化创建应用程序.应用程序的镜像从docker仓库拉取
curl -XPUT -H 'Content-Type: application/json' http://www.xxxx.fun:port/v2/apps/${JOB_NAME} -d '{ "id": "'${JOB_NAME}'", "cmd": "dotnet T4.Startup.Web.Mvc.dll", "cpus": 0.2, "mem": 512, "disk": 0, "instances": 2, "container": { "type": "DOCKER", "volumes": [ { "containerPath": "/etc/hosts", "hostPath": "/etc/hosts", "mode": "RO" } ], "docker": { "image": "docker.io/your_dockerhub_name/'${JOB_NAME}':'${BUILD_NUMBER}'", "network": "BRIDGE", "portMappings": [ { "hostPort":31531, "containerPort":80, "servicePort": 0, "protocol": "tcp", "labels": {} } ], "privileged": false, "parameters": [], "forcePullImage": false } }, "env": { "TZ": "Asia/Shanghai", "LANG":"C.UTF-8" } }'
查看自动构建结果:
如果一切正常,我们将在marathon的 webUI上看到刚刚脚本中的应用程序.
3.其他问题
1.对于asp.net core程序,如果你的项目中使用了自定义的nuget源.可以自定义一个nuget.config
并放置到解决方案同一级目录,然后更改Dockerfile
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" /> <add key="www.007008.fun" value="http://www.007008.fun:7789/nuget/Default/" /> </packageSources> </configuration>
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build WORKDIR /src COPY ["Honeysuckle.AspNetCore.Web/Honeysuckle.AspNetCore.Web.csproj", "Honeysuckle.AspNetCore.Web/"] COPY ["Honeysuckle.AspNetCore.Core/Honeysuckle.AspNetCore.Core.csproj", "Honeysuckle.AspNetCore.Core/"] COPY ["Honeysuckle.AspNetCore.Application/Honeysuckle.AspNetCore.Application.csproj", "Honeysuckle.AspNetCore.Application/"] COPY ["Honeysuckle.AspNetCore.Repository/Honeysuckle.AspNetCore.Framework.csproj", "Honeysuckle.AspNetCore.Repository/"] COPY nuget.config / RUN dotnet restore "Honeysuckle.AspNetCore.Web/Honeysuckle.AspNetCore.Web.csproj" COPY . . WORKDIR "/src/Honeysuckle.AspNetCore.Web" RUN dotnet build "Honeysuckle.AspNetCore.Web.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "Honeysuckle.AspNetCore.Web.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "Honeysuckle.AspNetCore.Web.dll"]