docker 部署.net core 3.1程序
公司部署網站一般是需要三台服務器,數據庫服務器,應用服務器以及一台通訊服務器(環保行業需要穩定的數據接收服務,並進行入庫),這種部署方式無疑給銷售帶來了麻煩,別人家都是1台服務器就夠了,而我們卻需要三台服務器,不占優勢,並且,如果小木較小,也神請三台服務器很容易造成浪費,所以領導決定使用docker來做程序的部署,對程序進行隔離,小項目一台服務器搞定,並且所有項目都開始遷移到雲上,這也是為什么上docker的背景了。
docker安裝
安裝所需的軟件包,yum-utils 提供了 yum-config-manager ,並且 device mapper 存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
使用命令來設置docker倉庫(阿里源,官方源太慢了)
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝docker
sudo yum install docker-ce docker-ce-cli containerd.io
啟動docker並設置開機啟動
啟動docker
sudo systemctl start docker
設置開機啟動
sudo systemctl enable docker
設置鏡像加速器
登錄阿里雲控制台,並搜索 容器鏡像服務 並選擇鏡像加速器
按照步驟設置鏡像加速器
docker使用
接下來就是使用docker部署我們的程序了,在我們的程序中添加Dockerfile
Dockerfile
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS base #修復調用System.Drawing生成圖片時確少 libgdiplus 的問題 RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll WORKDIR /app EXPOSE 5004 COPY . . ENTRYPOINT ["dotnet", "TyFrame.WebApi.dll"]
FROM:定制的鏡像都是基於 FROM 的鏡像,這里的asp.net core:3.1就是定制需要的基礎鏡像。后續的操作都是基於asp.net core:3.1。
RUN:用於執行后面跟着的命令行命令。這里是因為基礎鏡像中確少依賴 libgdiplus 需要安裝否則無法生成驗證碼。
WORKDIR :工作目錄。
EXPOSE :聲明端口,幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射,在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
CPOY :復制指令,從上下文目錄中復制文件或者目錄到容器里指定路徑,COPY . . 意思是將本機的當前目錄拷貝到容器中的工作目錄中。
ENTRYPOINT :類似於 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。
將編譯好的發布文件復制到安裝好docker的機器上,進入該目錄執行如下命令進行構建鏡像:
sudo docker build -t tyframeapi .
-t:鏡像的名字及標簽,通常 name:tag 或者 name 格式;可以在一次構建中為一個鏡像設置多個標簽。
如需要了解更多參數,https://docs.docker.com/engine/reference/commandline/build/
現在可以通過如下命令查看鏡像列表:
使用構建好的鏡像啟動容器
sudo docker run --name tyframeapi -v /etc/localtime:/etc/localtime:ro -d -p 5001:5001 tyframeapi
--name:為容器指定一個名稱
-v:掛載一個卷,-v /etc/localtime:/etc/localtime:ro 掛載本機的/etc/localtime到容器內的/etc/localtime :ro readonly
-d:后台運行容器,並返回容器ID
-p:指定端口映射,格式為:主機(宿主)端口:容器端口
tyframeapi:指定容器裝載的鏡像
如需要了解更多參數,https://docs.docker.com/engine/reference/commandline/run/
通過docker ps –a查看容器運行情況
看到STATUS 為UP狀態訪問該服務器的5001端口,網站可以正常訪問,docker的安裝和部署就完整完成了,由於很少使用Linux並且公司其他人使用的也不多,所以就采用了Jenkins來做持續集成。