在前段時間嘗試過用Jenkins來進行asp.net core 程序在IIS上面的自動部署。大概的流程是Jenkins從git上獲取代碼
linux
最開始Jenkins是放在Ubuntu的Docker中,可是因爲Powershell執行的緣由,就把Jenkins搬到了windows上。由於咱們網站的部署須要停掉IIS站點,因此須要Powershell來遠程操做服務器(上傳文件,中止站點,啓動站點),也很順利的利用WinRM+Powershell腳本實現了上面的功能,可是最後在實際使用中發現,腳本中止站點偶爾會有是假狀態,進行Copy文件還老是會由於佔用而失敗,因此仍是隻能手動去中止站點,這樣就沒有達到一鍵化的目的,因此就有了用Docker來鏡像。git
.net core對Docker是大力支持了,在Core以前,我就特別羨慕我在Docker中使用一些工具的體驗--一行指令就能夠工具自動安全完整了,不用費力進行環境配置,並且對系統的入侵特別少。因此Core出來以後,我就一直會嘗試在Docker中運行Core程序 可是一直沒敢上正式環境,正好如今遇到自動化部署的問題,就打算先從測試環境開始,把Docker環境一步步的能應用到正式環境上。大概的流程是這樣的:
docker
Docker安裝Jenkins能夠直接到store.docker.com上搜索Jenkins的鏡像而後run容器就好了惟一要注意的是要讓容器中的Jenkins共用宿主機的Docker環境,命令以下shell
docker run --memory 1.5G --name ContainerName -p 18181:8080 -p 50000:50000 -u root -d --env JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxNewSize=256m" -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /home/buxiaoxia/software/jenkins:/var/jenkins_home -v /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 jenkins/jenkins:lts
後面的-v是用來指定宿主機的文件/文件夾掛載到宿主機的指定路徑上面,這裏主要是用來掛載宿主機的Docker環境。當容器啓動完成以後,咱們能夠用命令windows
docker exec -it containerid /bin/bash
進入容器中,執行docker ps的命令試試是否能執行成功。安全
當容器運行好以後,進行一些初始化的工做以後,咱們就能夠開始創建的部署Job了
bash
源代碼管理中配置咱們Git的地址
服務器
而後就是構建命令直接用執行Shellapp
#!/bin/bash # 獲取短版本號來用Image的版本號 GITHASH=`git rev-parse --short HEAD` docker build -t {imagename}:$GITHASH -f {DockerFile-PWD} {鏡像的初始目錄}
這裏就是在構建咱們的Image了
而後接下來就是推送當前構建的Image到遠程倉庫,再在構建後去執行遠程鏈接到須要發佈的服務器根據版本號獲取到須要部署的鏡像進行run就行,由於我當前都在測試環境 因此就直接在本地執行鏡像的run了。asp.net
docker stop {containername} #停掉原來的容器 docker rm {containername} #刪除原來 docker run -p 9526:80 -d -e ASPNETCORE_ENVIRONMENT='Development' -v /Path/Path/Logs:/app/App_Data/Logs --restart always --name {containername} {imagename}:$GITHASH
這樣就基本實現了一鍵化部署了,固然仍是有不少須要優化的地方,接下來我在使用的過程當中若是遇到用着不順的或者是大家有不順的地方咱們在來解決下。
最開始構建asp.net core 2.1版本的鏡像的時候,運行老是會找不到dotnet sdk,最後就只有在DockerFile中添加了一層 文件內容以下
FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /app # 拷貝全部文件到環境中,並進行restore,build and release COPY . . RUN dotnet restore RUN dotnet build WORKDIR /app/src/Path RUN dotnet publish -c Release -o out FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime WORKDIR /app COPY --from=build /app/src/Path/out ./ 把發佈好的文件拷貝到鏡像中 Copy --from=build /app/src/Path/bin/Debug/netcoreapp2.1/XXX.xml ./ #把Swagger使用的xml拷貝到目錄中 EXPOSE 80 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #時區的本地化 RUN echo 'Asia/Shanghai' >/etc/timezone ENTRYPOINT ["dotnet", "project.dll"] # 啓動程序
這種方式有個問題就是會有一些無用的images 分享的指令來進行清除
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop #停掉狀態爲Exited的容器 docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm #刪除狀態爲Exited的容器 docker images|grep none|awk '{print $3 }'|xargs docker rmi # 刪除tag爲none的鏡像 docker rmi $(docker images | grep imagename | awk '{print $3}') #刪除鏡像名稱爲imagename的鏡像 (只能針對沒有被用的Image)