前言
Jenkins自动化部署DotNet5到DocKer已经很多,这篇的写的目的是为我在部署的时候遇到的坑整理一份写出来。
准备工作
- CentOS 7.x
- Docker
- Jenkins
- 支持Docker的.Net5的项目,可以用我自己测试的项目(https://gitee.com/i386ee/jenkins-test-project.git),当然也可以用自己现有的项目
安装CentOS 7.x
大家可以根据自己习惯下载对应的版本,这边只是为了给大家演示用
1.下载VMware Workstation 16 Player(官方下载地址:https://www.vmware.com/products/workstation-player/workstation-player-evaluation.html)
2.下载CentOS 7.9(清华大学开源软件镜像 下载地址:https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64)
3.VM安装CentOS 7.9 安装过程就不演示了,大家可以自行头条,百度,谷歌搜一搜。
4.CentOS安装好,小编没有直接用VM直接操作系统,因为操作不方便,系统间需要来回切换,这边使用了国产大神开发的工具FinalShell(官方下载地址:http://www.hostbuf.com/t/988.html)连接操作。
安装Docker
1.如果是新的系统,则建议首先更新 yum 和系统内核
yum update
2.确保卸载旧版docker,干净系统不需要此不做
- /var/lib/docker/ 下的镜像、容器、卷和网络都会保留
- 旧版本中Docker被命名为docker或docker-engine,现在被命名为docker-ce
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4.安装 yum-utils(其提供了yum-config-manager,下方要用到)
yum install -y yum-utils
5.配置 yum 阿里云 docker 仓库
- docker官方仓库: https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6.安装 docker
yum install -y docker-ce docker-ce-cli containerd.io
7.配置 docker 镜像加速器
- 获取加速器地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["这里填入你的加速器url"]
}
EOF
8.重启服务
CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系统启动和管理系统服务的相关命令全部由systemctl命令来
sudo systemctl daemon-reload
sudo systemctl restart docker
9.查看 docker 信息
docker info
看到此信息代表已经成功安装了Docker
10.测试 hello-world
docker run hello-world
看到这个我们已经成功运行了。
Docker常用命令
- docker build 构建镜像
- docker images 可以列出本地主机上的镜像
- docker rmi hello-world 删除镜像
- docker run 运行镜像
- docker logs 查看容器日记
- docker rm 删除容器
可以参考:https://www.runoob.com/docker/docker-image-usage.html
安装Docker版的Jenkins
正常在 Docker 中拉取得 Jenkins:lts 是无法执行 dotnet 命令的(就算你宿主机有 dotnet 环境、docker 中也有 dotnet 环境也不可以), 所以我们只能构建一个包含 dotnet 的镜像
1.切换根目录
CD /
2.创建.dockerignore文件,编写.dockerignore内容如下:
*
3.创建Dockerfile文件,编写Dockerfile内容如下:
# 封装Jenkins镜像(带有dotnet环境的) sdk=5.1
FROM jenkins/jenkins:lts
USER root
WORKDIR /dotnet
RUN apt-get update
RUN apt-get install wget
RUN wget -O dotnet.tar.gz https://download.visualstudio.microsoft.com/download/pr/820db713-c9a5-466e-b72a-16f2f5ed00e2/628aa2a75f6aa270e77f4a83b3742fb8/dotnet-sdk-5.0.100-linux-x64.tar.gz
RUN tar zxf dotnet.tar.gz -C ./
RUN rm -rf dotnet.tar.gz
ENV PATH="${PATH}:/dotnet:/var/jenkins_home/.dotnet/tools"
ENV DOTNET_ROOT="/dotnet"
RUN apt update -y
RUN apt install icu-devtools vim zip unzip -y
RUN usermod -a -G root jenkins
USER jenkins
命令行解析
- 1. 这个Docker镜像基于jenkins
- 2. 设置当前用户为root,因为后面安装需要使用root
- 3. 设置当前工作目录为dotnet
- 4. 更新apt-get
-5. 安装wget
- 6. 下载dotnet SDK包,保存为dotnet.tar.gz。这里要注意下载正确版本的SDK
- 7. 解压dotnet SDK到当前目录,即/dotnet目录
- 8. 删除dotnet SDK包
- 9. 把dotnet目录和dotnet tools目录添加到环境变量PATH,这样就可以使用dotnet命令了
- 10. 设置DOTNET_ROOT变量
- 11. 更新源
- 12. 安装一些必需的,常用的工具包,其中icu-devtools是运行dotnet需要的
- 13. 修改jenkins用户到root附加组
- 14. 设置当前用户为jenkins
下载dotnet SDK包,可前往微软官方网站获取下载链接:https://dotnet.microsoft.com/download
4.构建 Docker 镜像 name=jenkins:dotnet。
docker build -t jenkins:dotnet .
[不看][不看][不看]特别注意:结尾 . 不能省略
5.运行查看镜像列表命令
docker images
能看到图片红框所示的镜像,至此Docker版的Jenkins的镜像已经构建完成了。
6.运行Jenkins:dotnet镜像
docker run -d -p 51001:8080 -p 50000:50000 --name mjenkins \
--privileged=true \
--restart always \
-u root \
-e TZ="Asia/Shanghai" \
-v /mudata/jenkins:/var/jenkins_home \
-v /usr/bin/docker:/usr/bin/docker \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mudata/webroot/:/mudata/webroot \
jenkins:dotnet
5.运行查看容器列表命令
docker ps
能看到图片红框所示的镜像,好了我们Docker版的Jenkins已经成功运行起来了,小编喜欢喝啤酒,给自己上3瓶[啤酒][啤酒][啤酒]。接下来就可以通过浏览器访问:http://本机的IP地址:51001
不知道本机IP地址,可以运行
ifconfig
配置Jenkins
1.首次安装jenkins,访问jenkins时,需要输入管理员初始密码
已经我们构建到时候已经把/var/jenkins_home映射到了我们指定 /mudata/jenkins目录,此时我们需要进入路径找到initialAdminPassword文件,打开改文件复制里面的密码。
cd /mudata/jenkins/secrets
ls
当然我们也可以用find命令来查找
find / -name initialAdminPassword
2.安装插件这边演示就直接按默认的安装,大家根据自己的情况而选择,然后jenkins的引导一步的做,这边就不做演示。
3.进来后,jenkins的主页面就长这个样子
4.点击jenkins页面左侧菜单第一个“新建任务”,填入任务名,选择自由风格
5.源码管理勾选GIT,输入GIT上项目的URL地址
6.编写 Shell 脚本
7.Shell 脚本内容
# Jenkins 构建 测试服
echo '============查看打包环境================'
pwd
ls
echo $PATH
image_version=`date +%Y%m%d%H%M`;
echo $image_version;
dotnet --info
dotnet --version
# 获取短版本号
GITHASH=`git rev-parse --short HEAD`
echo '============================begin restore======================================='
dotnet restore
echo '============================end restore======================================='
#要构建的解决方案名称
solutionName=Test.Api
#docker run的容器名称
containerName=jenkinsscmbasic
#指定run的端口
port=9994
#.sln文件全路径
#solutionDir=20-Solution/${solutionName}.sln
#.csproj文件全路径
csprojDir=${solutionName}/${solutionName}.csproj
#项目发布的目录
webDir=/mudata/webroot/jenkins/publish/webapp
#归档目录
archivesDir=/mudata/webroot/jenkins/publish/archives
#清空文件夹
rm -rf ${webDir}/${JOB_NAME}/*
#发布网站到webDir
dotnet publish ${JENKINS_HOME}/workspace/${JOB_NAME}/${csprojDir} -c Release -o ${webDir}/${JOB_NAME} /p:Version=1.0.${BUILD_NUMBER}
#复制配置文件
#cp -rf /vdb1/jenkins/DotNetCoreWebPublishToDockerCommonConfigs/* ${webDir}/${JOB_NAME}/
#判斷是否存在
CID=$(docker ps | grep "${containerName}" | awk '{print $1}')
echo $CID
if [ "$CID" != "" ];then
docker stop ${containerName}
docker rm ${containerName}
docker rmi ${containerName}
#docker stop $CID
#docker rm $CID
fi
#通过Dockerfile重新构建镜像
docker build -t ${containerName} ${webDir}/${JOB_NAME}/.
#docker run容器并绑定到端口
#docker run -d -p ${port}:80 --name ${containerName} ${containerName}
docker run --name ${containerName} --restart=always -d -p ${port}:80 -v /etc/localtime:/etc/localtime:ro ${containerName}
echo "success!"
?[不看][不看][不看] 温馨提示:docker build -t ${containerName} ${webDir}/${JOB_NAME}/. 后面这 ’.‘不能忽略,前后不能有空格。
我们发布后构建:所以需要把当前发布的目录路径作为上下文目录,因为等下我们编写的Dockerfile文件内容,需要把当前的发布文件 COPY到容器目录内。如果上下文目录指定错误,就会导致镜像构建完成,运行容器成功,但是容器状态是重试状态,此时我们查看容器日志
docker logs 容器的ID
在执行DonNet XXX.DLL报错,翻译一下的错误内容大概是这样
无法执行,因为找不到指定的命令或文件。
docker build 命令最后有一个 . 。 . 表示当前目录,而 Dockerfile就在当前目录,因此不少初学者以为这个路径是在指定 Dockerfile 所在路径,这么理解其实是不准确的。如果对应上面的命令格式,你可能会发现,这是在指定上下文路径。那么什么是上下文呢?
??首先我们要理解 docker build 的工作原理。Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 DockerRemote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。
??当我们进行镜像构建的时候,并非所有定制都会通过 RUN 指令完成,经常会需要将一些本地文件复制进镜像,比如通过 COPY 指令、 ADD 指令等。而 docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的。那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
??这就引入了上下文的概念。当构建的时候,用户会指定构建镜像上下文的路径, docker build 命令得知这个路径后,会将路径下的所有内容打包,然后上传给 Docker 引擎。这样Docker 引擎收到这个上下文包后,展开就会获得构建镜像所需的一切文件。
————————————————
版权声明:本文为CSDN博主「大漠知秋」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wo18237095579/article/details/80540571
8.至此我们只要在Jenkins点击构建,等待构建成功。我们在执行一下
docker images
看到我们构建的镜像构建成功了[比心][比心][比心]
再执行一下
docker ps
看到我们运行的容器也启动成功[送心][送心][送心]
试着打开浏览器访问一下:http://本机的IP地址:9994。[爱慕][爱慕][爱慕]
9.到此我们已经全部完成自动化部署
.DotNet项目创建Dockerfile
我们主要讲一下如何在项目内添加Dockerfile文件并编写文件内容。
1.右键项目-添加-Docket项目支持,目标OS:LINUX。
2.右键点击Dockerfile文件,属性-复制到输出目录-如果较新则复制
??[不看][不看][不看]温馨提示:如果步骤不执行,当我们发布的时候,就没有Dockerfile文件,Jenkens Shell build的时候就会报错
3.Dockerfile文件内容
FROM mcr.microsoft.com/dotnet/aspnet:5.0.9
WORKDIR /app
EXPOSE 9994
COPY . .
RUN ls
ENTRYPOINT ["dotnet", "Test.Api.dll"]
命令行解析
- 1. 设置基础镜像的来源 aspnet:5.0 运行时
- 2. 切换目录app文件夹
- 3. 指定暴露的端口
- 4. 拷贝当前上下文目录文件到当前容器目录也就是 /app
- 5. 运行 ls 命令,查看当前容器是否已经有我们发布的文件了。此命令如果不要可以删掉
- 6.运行项目
.结束
至此整篇文章已经写好了,欢迎反馈与建议。
本文暂时没有评论,来添加一个吧(●'◡'●)