树莓派也跑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都没问题,一个月耗电也就三四度。所以可以做很多有趣的东西,随时待命可唤醒。
结束
最后给大家推荐一个开源项目quartzui:https://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
相关推荐
- http://www.ruanyifeng.com/blog/2017/06/raspberry-pi-tutorial.html
- https://www.cnblogs.com/haogj/p/4621926.html
- https://blog.docker.com/2017/09/docker-official-images-now-multi-platform/
树莓派也跑Docker和.NET Core的更多相关文章
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...
- 简单四步開始树莓派上的Docker之旅
大概这篇博文发表之后,应该算是我个人的第一篇翻译作品了,翻译的可能不是非常到位,望各位看官大刀砍过来. 原文链接:http://resin.io/blog/docker-on-raspberry-pi ...
- [IOT] - Raspberry Pi 4 Model B 系统初始化,Docker CE + .Net Core 开发环境配置
本教程为在 Docker 中配置 .Net Core,如果想在树莓派 Raspbian 系统中配置 .Net Core,请参考:[IOT] - 在树莓派的 Raspbian 系统中安装 .Net Co ...
- Docker 创建 Jira Core(Jira SoftWare) 7.12.3 中文版
目录 目录 1.介绍 1.1.什么是 JIRA Core? 1.2.什么是 JIRA SoftWare 2.JIRA 的官网在哪里? 3.如何下载安装? 4.对 JIRA 进行配置 4.1.JIRA ...
- Docker的使用初探(二):Docker与.NET Core的结合
目录 Docker的使用初探(二):Docker与.NET Core的结合 添加Dockefile 1. 在创建项目时添加 2. 手动添加 3. 容器业务流程协调控制程序支持 Dockefile语法 ...
- 使用jenkins来跑docker image的惨痛经历
记录一下我使用jenkins来跑docker container的艰辛路程吧,是照着jenkins官网的[文档](https://jenkins.io/doc/tutorials/build-a-ja ...
- Docker & ASP.NET Core 教程
第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 第五篇: Docker & ASP.NET Core (5):Docker Compose AS ...
- Docker 部署Dotnet Core MVC项目
原文:Docker 部署Dotnet Core MVC项目 1.dotnet core创建项目 dotnet new mvc -o myweb cd myweb 然后就是业务代码的编辑,增删改查乱七八 ...
- 七缸发动机预热,docker swarm + .net core 高速飙车成功
(图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...
随机推荐
- c# CacheManager 缓存管理
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Python Journey
1. 开发环境搭建 - Eclipse + PyDev搭建开发环境: http://www.cnblogs.com/Bonker/p/3584707.html (其实,如果不是License限制,推荐 ...
- jQuery功能强大的图片查看器插件
简要教程 viewer是一款功能强大的图片查看器jQuery插件.它可以实现ACDsee等看图软件的部分功能.它可以对图片进行移动,缩放,旋转,翻转,可以前后浏览一组图片.该图片查看器还支持移动设备, ...
- RS-485接口的防护电路设计
RS-485总线标准是安防系统设备上应用最为广泛的物理层协议之一.RS-485的主要特点:支持远距离传输,长达4000英尺:双向信号差分传输,提高信号的噪音抑制能力,并且允许一条总线上可以挂接多个发射 ...
- JQery 动态填充数据到table 中
说明: 1.把数据库中的数据查询出来,填充到前台的table中,注意 从数据查询出来的 属性IsNew="0"(table 行tr的属性) 2.单击“添加”按钮 新添加行追加到ta ...
- ChannelHandler揭秘(Netty源码死磕5)
精进篇:netty源码死磕5 揭开 ChannelHandler 的神秘面纱 目录 1. 前言 2. Handler在经典Reactor中的角色 3. Handler在Netty中的坐标位置 4. ...
- s:iterator
s:iterator 标签有3个属性: value:被迭代的集合 id :指定集合里面的元素的id status 迭代元素的索引 1:jsp页面定义元素写法 数组或list ...
- 常用的ES6
1 let 和 const 作用域: 只在声明指令的块级作用域内有效.① let所声明的变量可以改变,值和类型都可以改变,没有限制. let a = 123 a = 456 // 正确,可以改变 le ...
- IOS下WEBVIEW 的javascript数组与json定义 及交互
最近在折腾IOS新闻浏览客户端,当中需要用到webview传递JSON数据到IOS上,然后在IOS上解析.刚入门IOS不久,看了不少的书,但都是囫囵吞枣.在开发过程中,遇到不少问题.开发环境mac m ...
- git bash的使用
一.创建本地版本控制仓库 cd e: 进入e盘 cd gitspace 进入gitspace文件夹 git init 将E:\gitspace初始化为本地版本控制仓库 Initialized em ...