枇杷花 發表於 2019-1-7 22:56:00

Asp.Net Core&Docker部署到树莓派3B中

<p>  花了一点时间将吃灰数月的树莓派装上了Docker,并在容器中部署了一个Asp.Net Core应用程序,通过花生壳映射树莓派中的程序,可以使用外网访问树莓派,玩起来很有意思(外网访问地址:http://aspnetcore.online/,访问不通可能树莓派断电了),过程中发现了一点问题,或许对于同样路线的朋友有所帮助,特此写出玩转过程。</p>
<p>  码云Demo地址:https://gitee.com/530521314/ControlEvent.git</p>
<p>&nbsp;</p>
<h3><span style="color: rgba(255, 0, 0, 1)"><strong>一、树莓派安装操作系统</strong></span></h3>
<p>  1、进入官网下载操作系统:https://www.raspberrypi.org/downloads/,我使用了官方的Raspbian系统,并且选择了无界面的轻量版<strong>Raspbian Stretch Lite.</strong></p>
<p><strong>  <img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107215043655-2093497119.png" alt=""></strong></p>
<p>  2、下载格式化SD卡的工具:https://www.sdcard.org/downloads/formatter_4/eula_windows/</p>
<p>  3、下载将系统烧录到SD卡中的工具Win32 DiskImager:http://sourceforge.net/projects/win32diskimager/,选择系统磁盘路径地址,选择卡,然后执行Write即可,等待几分钟,便完成烧录工作</p>
<h4>&nbsp;  <img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107215228392-1186981426.png" alt=""></h4>
<p>  4、做一些配置工作,方便启动树莓派后可以快速玩转</p>
<p>   4.1、启动SSH,在卡分区内创建一个名为ssh的文件夹即可</p>
<p>   4.2、设置无线连接,本次我没有使用外接显示器到树莓派中,使用Putty工具直接无线连接,个人感觉更为方便,在卡内boot文件夹内,创建一个wpa_supplicant.conf的文件,并写下如下内容,该内容在树莓派通电后会由系统自动添加到/etc/wpa_supplicant/wpa_supplicant.conf中,设置完毕后便可以插入到树莓派,开始通电了</p>
<div class="cnblogs_code">
<pre>country=<span style="color: rgba(0, 0, 0, 1)">CN
ctrl_interface</span>=DIR=/<span style="color: rgba(0, 0, 255, 1)">var</span>/run/wpa_supplicant GROUP=<span style="color: rgba(0, 0, 0, 1)">netdev
update_config</span>=<span style="color: rgba(128, 0, 128, 1)">1</span>

<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">WiFi没有密码</span>
network=<span style="color: rgba(0, 0, 0, 1)">{
ssid</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">你的无线网络名称(ssid)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    key_mgmt</span>=<span style="color: rgba(0, 0, 0, 1)">NONE
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">WiFi使用WEP加密</span>
network=<span style="color: rgba(0, 0, 0, 1)">{
    ssid</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">无线网络名称(ssid)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    key_mgmt</span>=<span style="color: rgba(0, 0, 0, 1)">NONE
    wep_key0</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wifi密码</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">WiFi使用WPA/WPA2加密</span>
network=<span style="color: rgba(0, 0, 0, 1)">{
    ssid</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">无线网络名称(ssid)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    key_mgmt</span>=WPA-<span style="color: rgba(0, 0, 0, 1)">PSK
    psk</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wifi密码</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">以我的举例(priority连接优先级最高):</span>
network=<span style="color: rgba(0, 0, 0, 1)">{
    ssid</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Yang1802</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    key_mgmt</span>=WPA-<span style="color: rgba(0, 0, 0, 1)">PSK
    psk</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xxxxxxxx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
    priority</span>=<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p><span style="color: rgba(255, 0, 0, 1)">   <span style="color: rgba(0, 0, 0, 1)">4.3、使用Putty连接树莓派,树莓派ip地址可以找办法查看(如我使用的华为路由器,则可以登录路由器管理平台查看),使用账号pi,密码raspberry完成登录,开始校正树莓派时间</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 设置时区为 亚洲(Asia) 上海(Shanghai)</span>
sudo dpkg-<span style="color: rgba(0, 0, 0, 1)">reconfigure tzdata
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 启动 NTP 使计算机时钟与 Internet 时间服务器同步</span>
sudo timedatectl <span style="color: rgba(0, 0, 255, 1)">set</span>-ntp <span style="color: rgba(0, 0, 255, 1)">true</span></pre>
</div>
<p>&nbsp;  5、切换到root账号,方便操作</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo</span> <span style="color: rgba(0, 0, 255, 1)">su</span></pre>
</div>
<p>&nbsp;&nbsp;</p>
<h3><strong><span style="color: rgba(255, 0, 0, 1)">二、树莓派安装Docker</span></strong></h3>
<p>&nbsp;  1、开始安装Docker,由于树莓派使用的是ARM板,因此在安装Docker时,需要使用ARM板的安装教程:https://docs.docker.com/install/linux/docker-ce/debian/#install-using-the-convenience-script,使用提供的安装脚本完成安装即可,需要等待一些时间。</p>
<div class="cnblogs_code">
<pre>$ curl -fsSL https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">get.docker.com -o get-docker.sh</span>
$ sudo sh <span style="color: rgba(0, 0, 255, 1)">get</span>-docker.sh</pre>
</div>
<p>  2、安装Git工具,安装Git的目的是用于下载码云上的代码到树莓派中,虽然这个环节是有点冗余的,当我配置好了一台Jenkins服务器后,完全可以使用Jenkins服务器的功能将需要的镜像生产完成,因此这个环节就显得不这么重要了,但是,如果没有Jenkins服务器,那么这个环节就不得不进行了,毕竟需要将代码转移到树莓派中,或是开发环境中开发完毕,使用ftp转移到树莓派中等多种方式实现,使用如下命令安装git工具。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">sudo apt-get install</span> git</pre>
</div>
<p>&nbsp;</p>
<h3><strong><span style="color: rgba(255, 0, 0, 1)">三、使用Dockerfile编译镜像并生成容器</span></strong></h3>
<p>  &nbsp;1、新建应用程序,按照约定的标准化应用程序构建方式完成项目搭建(前几篇文章中讲到了),具体的项目结构可以从码云中查看。</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107223344376-1768952529.png" alt=""></p>
<p>  2、增加Dockerfile并修改默认的Dockerfile内容,由于树莓派使用的是Arm板子,因此对于.net core运行环境也有所不同,在Dockerfile中需要指定发布目标平台,具体Dockerfile如下,使用的基础镜像可以从dotnet组织提供的示例中找到:https://github.com/dotnet/dotnet-docker,我针对该示例中有的Dockerfile做了一些改动,以适应项目结构的需要。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">FROM</span> microsoft/dotnet:2.2<span style="color: rgba(0, 0, 0, 1)">-sdk-stretch-arm32v7 AS build
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app

# copy csproj and restore as distinct layers
</span><span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> ControlEvent.Web.csproj ./ControlEvent.Web/
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app/ControlEvent.Web
</span><span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> dotnet restore

# copy and build app and libraries
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app/
</span><span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> . ./ControlEvent.Web/
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app/ControlEvent.Web
</span><span style="color: rgba(0, 128, 128, 1)">RUN</span><span style="color: rgba(0, 0, 0, 1)"> dotnet publish -c Release -r linux-arm -o out

</span><span style="color: rgba(0, 128, 128, 1)">FROM</span> microsoft/dotnet:2.2<span style="color: rgba(0, 0, 0, 1)">-runtime-deps-stretch-slim-arm32v7 AS runtime
</span><span style="color: rgba(0, 128, 128, 1)">WORKDIR</span><span style="color: rgba(0, 0, 0, 1)"> /app
</span><span style="color: rgba(0, 128, 128, 1)">COPY</span><span style="color: rgba(0, 0, 0, 1)"> --from=build /app/ControlEvent.Web/out ./
</span><span style="color: rgba(0, 128, 128, 1)">ENTRYPOINT</span> ["./ControlEvent.Web"]</pre>
</div>
<p>  3、提交代码,在树莓派中使用Git克隆项目获取代码,并进入到Dockerfile层级使用命令构建镜像</p>
<p>  <img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107224102460-401697734.png" alt=""></p>
<p>  使用如下命令构建镜像,我的目标镜像名称为controlevent,此次构建要花费点时间,需要下载相关的基础镜像,下一次构建时会很快了</p>
<div class="cnblogs_code">
<pre>docker build --pull -t controlevent .</pre>
</div>
<p>  4、使用如下命令生成容器,本次指定了-it参数,在生成完毕后可以查看控制台输出,直接按Ctrl Q和P退出即可,也可直接使用-d参数后台运行</p>
<div class="cnblogs_code">
<pre>docker run --<span style="color: rgba(0, 0, 255, 1)">rm</span> -it -p <span style="color: rgba(128, 0, 128, 1)">9527</span>:<span style="color: rgba(128, 0, 128, 1)">80</span> controlevent</pre>
</div>
<p>  <img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107224902122-533602531.png" alt=""></p>
<p>  5、使用ip地址及端口访问,如果绑定了花生壳,并且在花生壳中做了本地映射,也可以直接使用域名加端口直接访问树莓派中的服务</p>
<p><img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107225027304-296374935.png" alt="" width="1063" height="474"></p>
<p> <strong>至此,本次树莓派中安装Docker并部署Asp.Net Core应用程序就完成了。</strong></p>
<p>&nbsp;</p>
<p> 本文地址:https://www.cnblogs.com/CKExp/p/10233780.html</p>
<p> 欢迎关注微信订阅号,有新的文章将同步到订阅号中</p>
<p> &nbsp;<img src="https://img2018.cnblogs.com/blog/1133736/201901/1133736-20190107225239033-980180739.png" alt=""></p>
<pre class="lang-java prettyprint prettyprinted"><span style="color: rgba(0, 0, 0, 1)"><code><span class="typ"><span class="pln"><span class="str"><span class="pln"><span class="pun"><span class="pln"><span class="typ"><span class="pln"><span class="typ"><span class="pln"><span class="pun"><span class="pln"><span class="typ"><span class="pln"><span class="pun"><span class="pln"><span class="lit"><strong>2019-1-7,望技术有成后能回来看见自己的脚步</strong></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre><br><br>
来源:https://www.cnblogs.com/CKExp/p/10233780.html
頁: [1]
查看完整版本: Asp.Net Core&Docker部署到树莓派3B中