树莓派也跑Docker和.NET Core
<h1 id="树莓派是什么">树莓派是什么</h1><p>树莓派就是一个卡片大小的迷你电脑。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507220726002-1183520909.png" alt="" loading="lazy"><img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507220536069-1633082296.png" alt="" loading="lazy"></p>
<h1 id="安装系统">安装系统</h1>
<p>有了电脑,我们当然得先安装系统。</p>
<h3 id="系统下载">系统下载</h3>
<p>https://www.raspberrypi.org/downloads/raspbian/ ,我选择的Raspbian Stretch Lite,不带界面的最小安装。</p>
<h3 id="下载win32diskimager烧录系统">下载win32diskimager(烧录系统)</h3>
<p>https://sourceforge.net/projects/win32diskimager/</p>
<h3 id="下载advanced-ip-scanner扫描工具用来扫描树莓派的ip">下载Advanced IP Scanner(扫描工具,用来扫描树莓派的ip)</h3>
<p>http://www.tucows.com/download.html?software_id=267216&t=2</p>
<h3 id="开始烧录">开始烧录</h3>
<p>打开win32diskimager,插上读卡器。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507205648547-1989251948.png" alt="" loading="lazy"><br>
完成后在sd卡根目录添加两个文件<code>ssh</code> <code>wpa_supplicant.conf</code><br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507210041797-611911943.png" alt="" loading="lazy"><br>
wpa_supplicant.conf的内容<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507210752323-2116145025.png" alt="" loading="lazy"></p>
<h1 id="准备工作">准备工作</h1>
<p>把SD插入树莓派,然后插上电源线。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507211040141-1495827179.png" alt="" loading="lazy"><br>
插上电源它就会自动开机启动了。使用Advanced IP Scanner扫描树莓派的ip(如果过了两分钟还是没有扫描到,可以尝试重新往SD添加wpa_supplicant.conf文件)<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507211930428-2052969436.png" alt="" loading="lazy"><br>
然后使用xshell连接。从现在开始,后面的操作你会感觉和普通linux没太大区别。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190507212145667-1047207770.png" alt="" loading="lazy"><br>
更换国内源(为了提高下载速度)</p>
<pre><code>sudo nano /etc/apt/sources.list
用#注释掉原文件内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
sudo nano /etc/apt/sources.list.d/raspi.list
用#注释掉原文件内容,用以下内容取代:
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ stretch main ui
sudo apt-get update #更新
</code></pre>
<p>安装自己想要的软件</p>
<pre><code>sudo apt-get install vim #安装vim
sudo apt-get install lrzsz #安装rz sz
sudo apt-get install git #安装git
</code></pre>
<h1 id="另一种连接到树莓派的方式">另一种连接到树莓派的方式</h1>
<p>如果上面的方式失败。你可以再准备一个网线,分别插入树莓派和笔记本。<br>
然后打开“网络和共享中心”,会多了一个本来连接。点击上面的正常网络。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190508083813534-1125343658.png" alt="" loading="lazy"><br>
然后WIN + R,cmd进入命令行,输入 arp -a查看网络ip。<br>
<img src="https://img2018.cnblogs.com/blog/208266/201905/208266-20190508084125296-1705351433.png" alt="" loading="lazy"><br>
一般情况第一个ip就是树莓派的ip。(这里我显示不是,因为我已经在无线连接设置了ip)</p>
<h1 id="静态ip设置">静态IP设置</h1>
<pre><code>sudo vi /etc/dhcpcd.conf
interface wlan0
static ip_address=IP/24
static routers=192.168.1.1
static domain_name_servers=114.114.114.114
</code></pre>
<h1 id="防火墙">防火墙</h1>
<pre><code>sudo apt-get install ufw #安装
sudo ufw enable #启用
sudo ufw default deny
sudo ufw disable #关闭
sudo ufw status #查看状态
sudo ufw allow 22 #允许外部访问ssh登录
sudo ufw allow 80 #允许外部访问80端口
sudo ufw delete allow 80 #禁止外部访问80 端口
</code></pre>
<h1 id="安装docker">安装Docker</h1>
<pre><code>curl -sSL https://get.docker.com | sudo sh
sudo systemctl enable docker #自动启动
sudo systemctl start docker #启动
sudo usermod -aG docker pi #将 pi 或您的等效用户添加到 docker 组
</code></pre>
<h1 id="运行net-core程序">运行.NET Core程序</h1>
<p>实际上树莓派和我们平时使用的PC或云主机还是有区别的,树莓派是ARM架构。而我们平时用的PC、云主机一般都是x86架构。<br>
也就是说我们在PC机上能跑的程序放树莓派上很可能跑不起来,除非你做了ARM平台的发布。如:<code>dotnet publish -r debian-arm -c Release</code></p>
<pre><code>所有运行平台
https://github.com/dotnet/corefx/blob/master/pkg/Microsoft.NETCore.Platforms/runtime.json
https://docs.microsoft.com/en-us/dotnet/core/rid-catalog#
.netcore的docker镜像地址
https://hub.docker.com/_/microsoft-dotnet-core-sdk
https://hub.docker.com/_/microsoft-dotnet-core-aspnet
arm平台发布命令
dotnet publish -c Release -r linux-arm
</code></pre>
<h1 id="遇到的问题和解决方法">遇到的问题和解决方法</h1>
<p>正常情况我们Dockerfile可能是这样写的。</p>
<pre><code>#基础镜像(用来构建镜像)
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
ENV TZ=Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Beijing
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#编译(临时镜像,主要用来编译发布项目)
FROM microsoft/dotnet:2.1-sdk AS publish
WORKDIR /src
COPY . .
WORKDIR /src/Host
RUN dotnet publish -c Release -o /app
#构建镜像
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
CMD ["dotnet", "Host.dll"]
</code></pre>
<p>这样在我们PC的Linux上没有任何问题。把docker镜像上传,然后在树莓派上下载运行。你会发现报错<code>exec user process caused "exec format error"</code>。<br>
然后我又尝试直接在树莓派上编译运行,居然成功了。因性能问题,本以为会编译失败的。(说明树莓派的性能真不错)不过树莓派毕竟不是PC,性能肯定会跟不上。<br>
所以还是得想办法在普通PC编译,然后在树莓派上运行。<br>
修改改Dockerfile</p>
<pre><code># ####修改##### 这里运行镜像改成arm32v7,也就是改成树莓派的CUP架构
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim-arm32v7 AS base
WORKDIR /app
EXPOSE 80
ENV TZ=Asia/Shanghai
RUN cp /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Beijing
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#编译(临时镜像,主要用来编译发布项目)
FROM microsoft/dotnet:2.1-sdk AS publish
WORKDIR /src
COPY . .
WORKDIR /src/Host
RUN dotnet publish -c Release -o /app
#构建镜像
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
CMD ["dotnet", "Host.dll"]
</code></pre>
<p>结果还是报错,最后修改成</p>
<pre><code>#基础镜像(用来构建镜像)
FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim-arm32v7 AS base
WORKDIR /app
EXPOSE 80
ENV TZ=Asia/Shanghai
#RUN命令修改成CMD
CMD cp /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Beijing
CMD ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#编译(临时镜像,主要用来编译发布项目)
FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS publish
WORKDIR /src
COPY . .
WORKDIR /src/Host
#RUN dotnet publish -c Release -o /app
RUN dotnet publish -r debian-arm -c Release -o /app
#构建镜像
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
CMD ["dotnet", "Host.dll"]
</code></pre>
<p>成功运行,完美。(RUN是在docker build的时候执行,而CMD 在docker run 时运行)<br>
至于最开始的Dockerfile文件为什么也可以在树莓派上编译运行。那是因为微软提供的docker镜像做了处理,pull的时候会识别环境然后下载对应的镜像。<br>
我们可以通过<code>docker history --no-trunc镜像ID</code>查看历史构建命令</p>
<h1 id="树莓派实例演示">树莓派实例演示</h1>
<p>演示地址:http://111.231.110.49:5088/<br>
本演示地址是我本地树莓派通过内网穿透的方式提供,也就是说你方式的直接是我家里的树莓派。因为内网网速问题,你访问速度可能会很慢。<br>
因为树莓派耗电量低,环保无噪音。不仅可以996甚至7*24都没问题,一个月耗电也就三四度。所以可以做很多有趣的东西,随时待命可唤醒。</p>
<h1 id="结束">结束</h1>
<p>最后给大家推荐一个开源项目quartzui:https://github.com/zhaopeiym/quartzui<br>
基于Quartz.NET 3.0的web管理界面,开箱即用。也可以完美运行在树莓派上。</p>
<pre><code>docker run -v /fileData/quartzuifile:/app/File--restart=unless-stopped --privileged=true --name quartzui -dp 5088:80 bennyzhao/quartzui:RaspberryPi
</code></pre>
<p>运行在普通PC或云主机上</p>
<pre><code>docker run -v /fileData/quartzuifile:/app/File--restart=unless-stopped --privileged=true --name quartzui -dp 5088:80 bennyzhao/quartzui
</code></pre>
<p>新建QQ群工控物联:995475200</p>
<h1 id="相关推荐">相关推荐</h1>
<ul>
<li>http://www.ruanyifeng.com/blog/2017/06/raspberry-pi-tutorial.html</li>
<li>https://www.cnblogs.com/haogj/p/4621926.html</li>
<li>https://blog.docker.com/2017/09/docker-official-images-now-multi-platform/</li>
</ul>
</div>
<div id="MySignature" role="contentinfo">
<div id="div_autograph">
<ul>
<li>学习本是一个不断抄袭、模仿、练习、创新的过程。</li>
<li>虽然,园中已有本人无法超越的同主题博文,为什么还是要写。</li>
<li>对于自己,博文只是总结。在总结的过程发现问题,解决问题。</li>
<li>对于他人,在此过程如果还能附带帮助他人,那就再好不过了。</li>
<li><strong>由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充!</strong></li>
<li><strong>感谢您的阅读。如果文章对您有用,那么请轻轻点个赞,以资鼓励。</strong></li>
<li><strong>工控物联Q群:995475200</strong></li>
</ul>
<div></div></div><br><br>
来源:https://www.cnblogs.com/zhaopei/p/raspberrypi-docker-netcore.html
頁:
[1]