.net core項目docker部署
此為手動打包更新版
發布.net core程序,然后放到linux目錄:/data/app/docker_name
一、打包到容器
1、安裝docker
2、編寫Dockerfile (放到目錄:/data/app/docker_name)
1 #See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. 2 3 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base 4 WORKDIR /app 5 6 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build 7 WORKDIR /src 8 COPY . . 9 10 RUN apt-get update -y 11 RUN apt-get install -y libgdiplus 12 RUN apt-get clean 13 RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll 14 15 RUN rm -f /etc/localtime && \ 16 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 17 18 ENTRYPOINT ["dotnet", "Api.dll"]
下面內容為安裝.net core基礎依賴包,可根據自己選擇(如果服務器不可訪問外網,需要從本地導出image鏡像,在服務器導入image鏡像)
1 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base 2 WORKDIR /app 3 4 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build 5 WORKDIR /src 6 COPY . .
下面內容為安裝libgdiplus,主要作用:由于window上操作圖片是Draw,但是linux上沒有,此時需要安裝libgdiplus,如果不需要可以刪掉
1 RUN apt-get update -y 2 RUN apt-get install -y libgdiplus 3 RUN apt-get clean 4 RUN ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
下面內容為同步docker容器內部時間與宿主機時間(不設置會導致相差8小時)
1 RUN rm -f /etc/localtime && \ 2 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
3、生成鏡像
docker build -t docker_name:v1 .
4、運行容器
docker run -dit --name docker_name --add-host www.baidu.com:192.168.1.100 -p 8888:8000 --log-driver json-file --log-opt max-size=5120m --log-opt max-file=2 --restart=always -v /data/app/docker_name:/src:rw docker_name:v1 /bin/bash
-dit 不清楚
--name docker_name 定義docker容器的名稱,如果不填會隨機分配一個名字,建議還是填一個
--add-host www.baidu.com:192.168.1.100 設置host,如果一切沒問題,這個可以不要
-p 8888:8000 設置端口映射,8888為宿主機端口,8000為docker內部端口,含義:訪問宿主機8888的時候,相當于訪問docker里的8000端口
--log-driver json-file --log-opt max-size=5120m --log-opt max-file=2 --log-opt max-size=5120m為設置日志文件單個大小為 5120M --log-opt max-file=2 設置文件最多為2個,多余的會刪掉 (這一步建議根據自己服務器設置,不設置的話會無限增長)
--restart=always 設置會一直重啟,重啟dockers后會自啟動,防止以外終止
-v /data/app/docker_name:/src:rw 服務器文件夾與docker里文件夾映射,含義:宿主機/data/app/docker_name 這個文件夾對應容器里的/src ,容器對這個文件夾具有 rw權限,r : 獨 w:寫, 重要文件最好都這樣,比如用戶上傳的圖片等,防止docker rm docker_name 后丟失
docker_name:v1 image的名稱和版本號
/bin/bash 不清楚
5、此時,我們就可以訪問 http://127.0.0.1:8888了
二、更新代碼
手動更新:(需要執行兩個命令)
1、發布程序,需要更新的dll打包到zip
2、將zip上傳到/data/app/docker_name
3、解壓zip,解壓命令: unzip zip_name.zip
4、重啟容器,docker restart docker_name
此時最新程序就更新了
腳本更新:(只需要執行一個命令,包含備份和回滾)
準備工作:
1、新建文件夾 /data/bak
2、新建文件夾 /data/bak/docker_name
3、在/data/bak文件夾下新建文件 update.sh 和 bak.sh 兩個文件
以下是 update.sh 文件內容
注:第30-32行,第39-41行,請替換成自己需要更新的文件
1 echo "" 2 echo "" 3 echo "" 4 echo "" 5 echo "" 6 echo "------------------------------------------------------------------------------------" 7 echo "需要更新的文件:$1" 8 9 mulu=/data/app 10 11 cd $mulu/bak/docker_name 12 13 echo "解壓文件 開始" 14 unzip -o $1 15 16 echo "文件解壓 完成" 17 18 19 current_date=`date -d "-1 day" "+%Y%m%d_%H%M"` 20 21 22 echo "備份文件夾名為 :$current_date" 23 24 mkdir $current_date 25 26 echo "創建備份文件夾成功" 27 28 echo "將dll剪切到備份文件夾 start" 29 30 cp $mulu/docker_name/api.dll $mulu/bak/docker_name/$current_date/api.dll 31 cp $mulu/docker_name/api.exe $mulu/bak/docker_name/$current_date/api.exe 32 cp $mulu/docker_name/api.pdb $mulu/bak/docker_name/$current_date/api.pdb 33 34 echo "將dll剪切到備份文件夾 end" 35 36 37 echo "將解壓完的dll剪切到程序所在目錄 start" 38 39 mv $mulu/bak/docker_name/api.dll $mulu/docker_name/api.dll 40 mv $mulu/bak/docker_name/api.exe $mulu/docker_name/api.exe 41 mv $mulu/bak/docker_name/api.pdb $mulu/docker_name/api.pdb 42 43 echo "將解壓完的dll剪切到程序所在目錄 end" 44 45 echo "啟動程序 start" 46 echo "" 47 48 echo "docker restart docker_name" 49 50 docker restart docker_name 51 52 echo "" 53 echo "啟動結束 end" 54 echo "" 55 docker ps 56 echo "" 57 echo "這次備份的版本號為:$current_date,如果需要回滾,可以執行命令: bash $mulu/bak/bak.sh $current_date" 58 echo "------------------------------------------------------------------------------------" 59 echo "" 60 echo "" 61 echo "" 62 echo "" 63 echo ""
以下是bak.sh文件的內容
注:第13-15行請替換成自己需要回滾的內容
1 echo "" 2 echo "" 3 echo "" 4 echo "" 5 echo "" 6 echo "------------------------------------------------------------------------------------" 7 echo "需要回滾的版本號:$1" 8 9 mulu=/data/app 10 11 echo "將備份目錄[$1]的dll剪切到程序所在目錄 start" 12 13 cp $mulu/bak/docker_name/$1/api.dll $mulu/docker_name/api.dll 14 cp $mulu/bak/docker_name/$1/api.exe $mulu/docker_name/api.exe 15 cp $mulu/bak/docker_name/$1/api.pdb $mulu/docker_name/api.pdb 16 17 echo "將備份目錄[$1]的dll剪切到程序所在目錄 end" 18 19 echo "啟動程序 start" 20 21 docker restart base 22 23 echo "" 24 echo "" 25 echo "啟動結束 end 回滾完成" 26 echo "------------------------------------------------------------------------------------" 27 echo "" 28 echo "" 29 echo "" 30 echo "" 31 echo "" 32 docker ps
更新步驟:
1、發布程序,需要更新的dll打包到zip
2、將zip上傳到/data/bak/docker_name
3、cd /data/bak
4、bash update.sh zip_name.zip (每次更新替換zip_name)
此時最新程序就更新了
如果需要回滾請執行第4步出來的回滾語句

浙公網安備 33010602011771號