从交通灯模型到Docker化IC编程

本文讲的是从交通灯模型到Docker化IC编程,【编者的话】本文通过一个树莓派制作交通灯系统的例子,介绍了树莓派如何应用Docker来简化开发与发布流程。本文作者是一位有20年经验的软件工程师,同时也是自动化设备的狂热爱好者。

我家七岁的小朋友问我交通灯是怎么工作的。在解释一大堆抽象概念前,我决定用LED灯和电线做一个手工的实物教具。最终我们要实现一个被应用程序控制的带按钮的行人过街系统——当然,这个应用是被Docker化(Dockerized)后跑在树莓派3代(Raspberry Pi 3)上的。

硬件规格

首先我们需要制作电路。要完成这个教具,你需要如下硬件

  • 树莓派 3代,但是任何其他型号也是可以的
  • Adafruit T-Cobbler Plus
  • 电路板
  • 2x 红色, 1x 黄色 and 2x 绿色 LED灯
  • 5x 220Ω 电阻
  • 1x 1kΩ 电阻
  • 1x 10kΩ 电阻
  • 1x 按钮
  • 1x 树莓派专用usb电源
  • 电线

软件实现

应用程序使用Python编写,它的核心逻辑是基于 Bob Rathbone的一篇博客Raspberry PI Traffic Lights。我增加了更多的LED灯从而把程序改造成符合本地的交通规则。你能从GitHub上找到源代码。

  1. 定义GPIO引脚。
  2. 初始化GPIO端口:在应用的最开始部分,我初始化了GPIO的端口并且关闭了所有的LED灯。因为它们可能在上一次运行时被打开了。
  3. 主循环:主循环开始运行时车辆行驶方向为绿灯。在这种情况下十字路口的按钮会被实时监测。
  4. 行人过街:按钮被按动后,程序的下一段代码块将车辆行驶方向的灯变成红灯,行人方向的灯变为绿灯。然后在回到最开始的状态。

这就完成了整个应用。我可以向我女儿解释交通灯是怎么工作的,并且她可以玩它好一阵呢。本该到此结束这个故事了,但是由于我是用Docker发布我的应用的,这将会是另外一个新故事了。

Docker化所有的东西

我希望保存我的工作成果并且让它能够被我和其他人所复用。所以除了将源代码上传到GitHub仓库外,我也Docker化了应用的开发与发布过程。在Docker及其工具的帮助下,在一台普通设备如MacBook上开发应用是非常容易的。

甚至在几个月后并且经历了一些其他项目后,因为有了这样一套标准的方式,我还能非常轻松的玩转那个应用。你既不需要备份SD卡的镜像,也不需要将树莓派上安装的应用记录下来。

如图所示,你需要在笔记本电脑上安装如下工具:

我不会深入讲解如何链接笔记本电脑与树莓派中的Docker Engine。那是上一篇博客的部分内容——关于如何使用docker-machine。

Dockerfile

我们需要一个Dockerfile去构建Docker镜像。使用一份Python基础镜像并且安装必要的工具和依赖。然后我们添加应用源代码并且定义了执行命令。

docker-compose.yml

Docker Compose 可以被用于简化容器的运行。使用docker-compose.yml配置文件我们可以记录启动容器所需的参数。这份文件会被放到Git上做版本化管理,所以我们不会忘记如何去运行这个容器。

开发应用

当我们开发应用或者想要修改源代码时,Docker镜像会使用新代码重新构建镜像。这些只需要一行命令:

docker-compose build

运行应用

docker-compose up

如果你想再次停止应用,只需按CTRL+C。你也可以连按这个按钮去杀掉应用。

长期运行

你可以在启动命令中增加-d去自动运行应用。如果docker-compose.yml 配置文件中的重启策略配置为总是(always),那么容器将会在树莓派启动后自动启动。这对于需要伴随树莓派启动而启动的硬件工程是非常有用的。

docker-compose up -d

如果你想停止应用,只需要使用如下命令

docker-compose kill

共享Docker化应用

使用Docker的好处是很容易与其他人共享Docker化的应用。作为一个应用的开发者你只需要将Docker镜像推送到Docker Hub中。其他人就可以从中拉取这个镜像,并且在完全不知道里面安装了什么工具或者依赖的情况下运行这个镜像。

推送Docker镜像

docker images
docker tag dockerrpitrafficlight_trafficlight stefanscherer/rpi-traffic-light
docker push stefanscherer/rpi-traffic-light

这样Docker镜像就被传送到Docker Hub中了。我的例子的镜像地址:stefanscherer/rpi-traffic-light

与其他人共享

如果有人想要搭建交通灯系统并运行你的程序,他应该使用如下一小段修改过的docker-compose.yml去拉取我已经发布的Docker镜像,而不是自己去构建它。

version: '2'
services:
trafficlight:
image: stefanscherer/rpi-traffic-light
devices:
  - "/dev/mem:/dev/mem"
cap_add:
  - SYS_RAWIO
restart: always

然后使用以下命令运行应用

docker-compose up -d

或者将所有参数添加到命令行上

docker run --rm --cap-add SYS_RAWIO --device /dev/mem stefanscherer/rpi-traffic-light

这个命令会检测如果本地的树莓派中没有该镜像那么就去Docker Hub上拉取这个Docker镜像。拉取完成后,它会运行包含应用程序的Docker容器。

使用这个方法任何应用都可以如此来做发布,而不用关心使用什么编程语言。

原文链接:How to build a traffic light (翻译:高洪涛)

===========================================
译者介绍
高洪涛,当当网架构师,开源数据库分库分表中间件Sharding-JDBC作者。目前从事Docker相关调研工作。

原文发布时间为:2016-03-24

本文作者:gaohongtao

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:从交通灯模型到Docker化IC编程

时间: 2024-09-29 00:43:21

从交通灯模型到Docker化IC编程的相关文章

我的Java开发学习之旅------>交通灯管理系统

1.交通灯管理系统的项目需求 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: Ø         异步随机生成按照各个路线行驶的车辆. 例如: 由南向而来去往北向的车辆 ---- 直行车辆        由西向而来去往南向的车辆 ---- 右转车辆        由东向而来去往南向的车辆 ---- 左转车辆        ... Ø         信号灯忽略黄灯,只考虑红灯和绿灯. Ø         应考虑左转车辆控制信号灯,右转车辆不受信号灯控制. Ø         具体信号灯控制

基于vhdl的交通灯控制程序,需要管教配置图,

问题描述 基于vhdl的交通灯控制程序,需要管教配置图, 基于vhdl的交通灯控制程序,需要管教配置图,,能在实验箱上实现 解决方案 http://www.docin.com/p-720997369.htmlhttp://wenku.baidu.com/link?url=RjrbDZu_vShXsVaEbTVNcgkJL2D1ztNAIZ0Pbh4dY2QtbZ2_gApTUswiRW3VnvA8_72tjZ6ui4lLkDHb_JsGcgffNxs_R72yJHGvB0YhLJm管脚配置根据你

基于MCS-51单片机的交通灯设计

设计一个基于单片机的交通灯信号控制器.已知东.西.南.北四个方向各有红黄绿色三个灯,在东西方向有两个数码管, 在南北方向也有两个数码管. 要求交通灯按照表 1进行显示和定时切换,并要求在数码管上分别倒计时显示东西.南北方向各状态的剩余时间. 表1 交通灯的状态切换表 文档下载:http://wenku.baidu.com/view/90f849876529647d26285204?fr=prin 警告:不同单片机的动态扫描显示不一样,即下面黄底红字是让数码管显示函数,如果单片机不一样,只需改显示

DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例

本文讲的是DockOne微信分享(一二一):喜马拉雅FM测试环境的Docker化实践案例[编者的话]随着容器技术的流行,作为线上应用Docker的铺垫,喜马拉雅FM从16年开始推进测试环境Docker化.本次分享将重点为大家介绍我们在Docker化的过程中如何进行技术选型.环境搭建,特别是实践中碰到的一些问题及其解决方案. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部

Docker化运维方式讲解

应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作必须足够简单, 没有学习成本, 点击一下即可. 快速.迁移过程能在极短的时间内完成. 无损.迁移之后应用与原应用一模一样, 不丢失任何配置和数据.迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险. 许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发

Docker 化运维方式

应用迁移需求 应用运维需要考虑的一个重要问题就是迁移, 在不同机器.机房.环境间迁移.迁移的原因有很多, 比如硬件过保(硬件故障), 机房迁移, 应用扩缩容等. 应用迁移的核心需求是: 简单.迁移操作必须足够简单, 没有学习成本, 点击一下即可. 快速.迁移过程能在极短的时间内完成. 无损.迁移之后应用与原应用一模一样, 不丢失任何配置和数据.迁移之后应用功能和业务逻辑与原部署应用一模一样,无任何业务风险. 许多公司还在使用古老的 rhel 5/6 和 linux 2.6.x 内核, 难以充分发

matlab交通流模型-急求基于Elman神经网络的高速公路动态交通流模型的matlab程序代码

问题描述 急求基于Elman神经网络的高速公路动态交通流模型的matlab程序代码 最近在写关于交通控制的论文,急需交通流模型,由于本人编程能力有限以及时间紧迫,请各位大神帮帮忙,给一个基于神经网络的交通流模型的程序吧,万分感激啊~~

DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践

本文讲的是DockOne微信分享( 八十九):恒生金融交易系统的Docker化实践[编者的话]Docker可以显著改善企业软件研发流程.提升企业DevOps效率.借助Docker,企业可以对现有IT系统进行一次梳理,解决IT软件系统部署.升级难的顽疾,重新释放企业生产力,降低企业成本.本次分享介绍了恒生电子运用Docker技术,加上自研配套工具,实现金融交易系统配置.部署.运维自动化的心得,包括: Docker的优势以及我们为什么要使用Docker: 恒生Docker运用现状: 恒生金融交易系统

交通灯管理系统

 项目需求    异步随机生成按照各个线路行驶的车辆.        例如:            由南向而来去往北向的车辆(南--->北)-------直行车辆            由西向而来去往南向的车辆(西--->南)-------直行车辆            由东向而来去往北向的车辆(东--->北)-------直行车辆    信号灯忽略黄灯,只考虑红灯和绿灯.    应考虑左转车辆控制信号灯,右转车辆不受信号灯控制    具体信号灯控制逻辑与现实生活中的普通交通灯控制逻