最近研究 docker 在Linux 下部署 .net core 項目,在過程中踩了很多坑,網上的資料對我幫助確實大,但有些問題未指明出來。
特地整理一份在發布文檔
本文使用的是 root 賬號操作,如果不是root賬號,命令前需要增加 sudo
1、安裝dotnet (這一步可以不需要)
https://dotnet.microsoft.com/download
以安裝運行時 2.1版本為例
https://dotnet.microsoft.com/download/linux-package-manager/centos/runtime-current
rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
yum update
yum -y install aspnetcore-runtime-2.1
查看 dotnet 版本
dotnet --info
2、安裝Docker CE 版
https://www.cnblogs.com/longjieboke/p/10734557.html
3、配置docker加速器
本方使用的是阿里雲鏡像加速器,參考
https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.549.19e611be46gAPY
容器鏡像服務 -> 鏡像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的鏡像加速地址"]
}
EOF
重啟docker服務
systemctl daemon-reload
systemctl restart docker
4、.net core 創建 Dockerfile

由於默認生成的 Dockerfile 是包含編譯和發布。更改Dockerfile文件內容
#基於 `microsoft/dotnet:2.1-aspnetcore-runtime` 來構建鏡像,自行更改為你自己的
FROM microsoft/dotnet:2.1-aspnetcore-runtime
#拷貝項目publish文件夾中的所有文件到 docker容器中的publish文件夾中 , publish 可自行更改名稱
COPY . /publish
#設置工作目錄為 `/publish` 文件夾,即容器啟動默認的文件夾
WORKDIR /publish
#設置Docker容器對外暴露5000端口,防火牆需要開放此端口,必須和 dotnet xx.dll運行時的端口保持一致
EXPOSE 5000
#使用`dotnet xx.dll`來運行應用程序
ENTRYPOINT ["dotnet", "ToolManager.dll"]
5、發布項目

6、將發布的文件拷備到 能發os的系統文件夾中
創建 docker(自定義名稱)文件夾
使用winSCP工具上傳文件到linux服務器的指定文件夾
7、生成鏡像
cd 到 剛才的文件夾下
docker build -t 鏡像名稱 . (注意:最后空格后面有一個.)。
示例: docker build -t demo-netcore .
8、查看生成的鏡像
docker images
9、運行docker容器
docker run --name 容器名稱 -d -p 5000:5000 鏡像名稱
示例: docker run --name democore -d -p 54907:80 demo-netcore
democore 容器的名稱。
-d 后台進程。
-p是進行宿主和容器之間端口的映射,(-p 宿主端口:容器端口)
docker run --name agentservice -d -p 8810:8810 agentservice-container:1.0 --restart=always
10、檢驗docker容器是否運行成功
docker ps -a
docker ps 查看正在運行的容器
如果異常,使用命令
docker run -it 鏡像名稱 bash
查看異常
如果 提示 sdk版本不同
刪除舊版 yum remove -y aspnetcore*
更新 yum -y install aspnetcore-runtime-2.1
11、防火牆開放端口
查看防火牆狀態:systemctl status firewalld
開啟防火牆:systemctl start firewalld
開放端口:firewall-cmd --zone=public --add-port=【端口】/tcp --permanent
firewall-cmd --reload 重啟防火牆
firewall-cmd --query-port=【端口】/tcp 查看端口是否開放
12、訪問
因為運行docker容器的時候 進行了 端口映射 所以外部訪問端口 為 5000
http://192.168.1.1:5000
13、停止和刪除容器
docker stop (容器id)
sudo docker rm (容器id)
14、刪除鏡像
docker rmi (鏡像ID)
15、查看docker日志
docker logs -f -t --since="2017-05-31" --tail=10 alibaba-vica-netapi
docker logs 6dc1e5f74c0
16、停止和刪除容器
docker stop (容器id)
sudo docker rm (容器id)
17、刪除鏡像
docker rmi (鏡像ID)
18、創建容器
docker commit -p 容器ID 快照名稱
19、保存本地tar備份
docker save -o ~/xxxx.tar 容器名稱
20、恢復docker備份
docker load -i docker-alibaba-server.tar
21、進入 docker容器內部
docker exec -it 容器id /bin/bash
22、退出容器
Ctrl + D 或 exit
遇到的問題
發布后訪問時提示 連接被重置

原因由於程序中

並且
dockerfile 文件中
EXPOSE 5000 #端口必須跟里面的端口保持一致
