• 树莓派也跑Docker和.NET Core


    树莓派是什么

    树莓派就是一个卡片大小的迷你电脑。

    安装系统

    有了电脑,我们当然得先安装系统。

    系统下载

    https://www.raspberrypi.org/downloads/raspbian/ ,我选择的Raspbian Stretch Lite,不带界面的最小安装。

    下载win32diskimager(烧录系统)

    https://sourceforge.net/projects/win32diskimager/

    下载Advanced IP Scanner(扫描工具,用来扫描树莓派的ip)

    http://www.tucows.com/download.html?software_id=267216&t=2

    开始烧录

    打开win32diskimager,插上读卡器。

    完成后在sd卡根目录添加两个文件ssh wpa_supplicant.conf

    wpa_supplicant.conf的内容

    准备工作

    把SD插入树莓派,然后插上电源线。

    插上电源它就会自动开机启动了。使用Advanced IP Scanner扫描树莓派的ip(如果过了两分钟还是没有扫描到,可以尝试重新往SD添加wpa_supplicant.conf文件)

    然后使用xshell连接。从现在开始,后面的操作你会感觉和普通linux没太大区别。

    更换国内源(为了提高下载速度)

    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   #更新
    

    安装自己想要的软件

    sudo apt-get install vim      #安装vim
    sudo apt-get install lrzsz    #安装rz sz
    sudo apt-get install git      #安装git
    

    另一种连接到树莓派的方式

    如果上面的方式失败。你可以再准备一个网线,分别插入树莓派和笔记本。
    然后打开“网络和共享中心”,会多了一个本来连接。点击上面的正常网络。

    然后WIN + R,cmd进入命令行,输入 arp -a查看网络ip。

    一般情况第一个ip就是树莓派的ip。(这里我显示不是,因为我已经在无线连接设置了ip)

    静态IP设置

    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
    

    防火墙

    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 端口
    

    安装Docker

    curl -sSL https://get.docker.com | sudo sh
    
    sudo systemctl enable docker   #自动启动
    sudo systemctl start docker    #启动
    sudo usermod -aG docker pi     #将 pi 或您的等效用户添加到 docker 组
    

    运行.NET Core程序

    实际上树莓派和我们平时使用的PC或云主机还是有区别的,树莓派是ARM架构。而我们平时用的PC、云主机一般都是x86架构。
    也就是说我们在PC机上能跑的程序放树莓派上很可能跑不起来,除非你做了ARM平台的发布。如:dotnet publish -r debian-arm -c Release

    所有运行平台
    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
    

    遇到的问题和解决方法

    正常情况我们Dockerfile可能是这样写的。

    #基础镜像(用来构建镜像)
    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"]
    

    这样在我们PC的Linux上没有任何问题。把docker镜像上传,然后在树莓派上下载运行。你会发现报错exec user process caused "exec format error"
    然后我又尝试直接在树莓派上编译运行,居然成功了。因性能问题,本以为会编译失败的。(说明树莓派的性能真不错)不过树莓派毕竟不是PC,性能肯定会跟不上。
    所以还是得想办法在普通PC编译,然后在树莓派上运行。
    修改改Dockerfile

    # ####修改##### 这里运行镜像改成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"]
    

    结果还是报错,最后修改成

    #基础镜像(用来构建镜像)
    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"]
    

    成功运行,完美。(RUN是在docker build的时候执行,而CMD 在docker run 时运行)
    至于最开始的Dockerfile文件为什么也可以在树莓派上编译运行。那是因为微软提供的docker镜像做了处理,pull的时候会识别环境然后下载对应的镜像。
    我们可以通过docker history --no-trunc 镜像ID查看历史构建命令

    树莓派实例演示

    演示地址:http://111.231.110.49:5088/
    本演示地址是我本地树莓派通过内网穿透的方式提供,也就是说你方式的直接是我家里的树莓派。因为内网网速问题,你访问速度可能会很慢。
    因为树莓派耗电量低,环保无噪音。不仅可以996甚至7*24都没问题,一个月耗电也就三四度。所以可以做很多有趣的东西,随时待命可唤醒。

    结束

    最后给大家推荐一个开源项目quartzuihttps://github.com/zhaopeiym/quartzui
    基于Quartz.NET 3.0的web管理界面,开箱即用。也可以完美运行在树莓派上。

    docker run -v /fileData/quartzuifile:/app/File  --restart=unless-stopped --privileged=true --name quartzui -dp 5088:80 bennyzhao/quartzui:RaspberryPi  
    

    运行在普通PC或云主机上

    docker run -v /fileData/quartzuifile:/app/File  --restart=unless-stopped --privileged=true --name quartzui -dp 5088:80 bennyzhao/quartzui  
    

    新建QQ群工控物联:995475200

    相关推荐

    出处:https://www.cnblogs.com/zhaopei/p/raspberrypi-docker-netcore.html

  • 相关阅读:
    对C# .Net4.5异步机制测试
    权限系统设计
    C#基础知识
    eclipse+pyDev
    Ubuntu下使用sublime text进行py开发
    110_02 补充模块:BeatifulSoup模块
    034 如何判断一个对象是否是可调用对象
    037 简单计算器实现
    036 re模块的小练习
    035 用Python实现的二分查找算法(基于递归函数)
  • 原文地址:https://www.cnblogs.com/mq0036/p/12760303.html
Copyright © 2020-2023  润新知