發布至docker for windows.
提示:
image operating system "windows" cannot be used on this platform
解決:
網上查了,說是運行環境不對,要在win虛擬機上執行,都是把docker的環境切換成windows。
不過我們如果在創建項目的時候,選擇docker文件是“linux”版本,就不需要windows版本,所以我們保持docker默認的linux版本,只需要確保新建項目時生成的DockerFile,不是基於windows就好。
由於是樹莓派,這里准備把aspnetcore2.1項目,發布為 linux-arm 方式。
# 首先,定位到要發布的項目根目錄,也就是csproj文件所在位置,按住shift鍵右擊,選擇在此處打開命令行/powershell,兩個選項差不多這個看系統設定。 # 以 linux-arm 方式發布 dotnet publish -c Release -r linux-arm
之后,我們將目光放到樹莓派上,我用的是三代,也就是ARMv7,所以core sdk是沒法裝的,只能使用runtime的方式,所以最簡單的DockerFile如下:
# 添加基礎鏡像:docker會從網絡下載這個鏡像 FROM microsoft/dotnet:2.1-sdk-stretch-arm32v7 AS build MAINTAINER suntai #容器中系統的工作空間 WORKDIR /app #拷貝當前文件夾下的文件到容器中系統的工作空間(注意:“.”后面有空格) COPY . /app #設置程序要偵聽的端口 EXPOSE 80 # 下面這里是dotnetcore runtimez執行方式 ENTRYPOINT ["./WebCoreHost"]
之后就可以通過樹莓派開啟ssl,用sftp從微軟平台傳文件到樹莓派的linux平台了。當然要傳輸的目錄就是剛才生成的目錄,則你可能要拷貝的目錄就是
bin\Release\netcoreapp2.1\linux-arm\publish\
先直接運行下試試,進入我們程序所在位置。
# 我們先把程序入口點設置為可運行,當然你可以設置權限為755,也可以用+x方式 sudo chmod +x ./WebCoreHost # 然后我們基於runtime執行 ./WebCoreHost # aspnetcore runtime會執行程序,如果什么都不管的話,是啟用5000端口。
當然,之后如果你想結束程序測試,或者端口被占了,可以kill掉程序
# 顯示占用端口的程序 sudo netstat -ltp # 結束指定程序,比如說程序標識是233 sudo kill 233
在樹莓派上創建容器並運行程序,注意句點的位置,表示操作當前目錄(linux docker for aspnetcore)
# 將當前目錄添加到為docker鏡像,起一個別名叫做aspnetapp。
docker build -t aspnetapp .
# 以關閉后自動銷毀的方式,啟動一個容器,偵聽外部的8000端口,並轉發至程序內部的80端口 docker run --rm -it -p 8000:80 aspnetapp
提升當前操作用戶操作Docker的權限,不需要sudo,也能解決 permission denied
# 如果還沒有 docker group 就添加一個 sudo groupadd docker # 將用戶加入該 group 內。然后退出並重新登錄就生效啦 sudo gpasswd -a ${USER} docker # 重啟 docker 服務 sudo service docker restart # 切換當前會話到新 group 或者重啟 X 會話 newgrp - docker
常用的Docker容器和鏡像操作
# 停用全部正在運行的容器 docker stop $(docker ps -q) # 刪除全部容器 docker rm $(docker ps -aq) # 一條命令實現停用並刪除容器 docker stop $(docker ps -q) & docker rm $(docker ps -aq) # 刪除所有鏡像 docker rmi $(docker images -q) # 停止並刪除none鏡像 docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
