{"id":653,"date":"2021-07-10T20:31:29","date_gmt":"2021-07-10T18:31:29","guid":{"rendered":"https:\/\/macchina.io\/blog\/?p=653"},"modified":"2021-07-12T07:37:21","modified_gmt":"2021-07-12T05:37:21","slug":"building-an-iot-edge-application-with-macchina-io-and-docker-part-1","status":"publish","type":"post","link":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/","title":{"rendered":"Building an IoT Edge Application with macchina.io and Docker (Part 1)"},"content":{"rendered":"<p>Following up my <a href=\"https:\/\/macchina.io\/blog\/internet-of-things\/on-the-edge\/\" target=\"_blank\" rel=\"noopener\">previous blog post<\/a> about edge computing, in this blog post I will show how to build an edge computing application by combining <a href=\"https:\/\/macchina.io\/edge.html\">macchina.io EDGE<\/a> and <a href=\"https:\/\/macchina.io\/remote.html\">macchina.io Remote Manager<\/a> with a number of other applications. These are&nbsp;<a href=\"https:\/\/www.docker.com\">Docker<\/a>, as everything will be deployed in containers,&nbsp;<a href=\"https:\/\/www.portainer.io\" target=\"_blank\" rel=\"noopener\">Portainer<\/a>, for providing a nice remotely-accessible web interface for managing Docker, as well as&nbsp;<a href=\"https:\/\/www.influxdata.com\/products\/influxdb\/\" target=\"_blank\" rel=\"noopener\">InfluxDB<\/a>, a well-known time-series database. The actual &#8220;computing&#8221; aspect of this demo will be a bit limited, as we&#8217;re mostly writing sensor data into a time-series database and then building a dashboard. However, the setup will allow to add some sensor data analytics later on.<\/p>\n<p>macchina.io EDGE will run a small JavaScript application that periodically acquires sensor data from an industrial-grade multi-sensor device (<a href=\"https:\/\/www.bosch-connectivity.com\/products\/industry-4-0\/connected-industrial-sensor-solution\/downloads\/\" target=\"_blank\" rel=\"noopener\">Bosch CISS<\/a>) connected via USB, and write the sensor data (temperature, humidity, acceleration) into an InfluxDB database. I will use InfluxDB&#8217;s dashboard capabilities to create a dashboard showing the data. It&#8217;s also possible to add Grafana to the setup, for even better dashboarding capabilities.<\/p>\n<p>macchina.io Remote Manager will provide remote access to all applications, via the <a href=\"https:\/\/github.com\/my-devices\/gateway\">macchina.io Remote Manager Gateway<\/a> application, also running in a Docker <a href=\"https:\/\/github.com\/my-devices\/meta-gateway-docker\">container<\/a>.<\/p>\n<p>On the hardware side I will use a Raspberry Pi 4 (running Raspberry Pi OS Lite, formerly known as Raspbian) as edge device, although the whole setup can be replicated on any platform that runs Docker.&nbsp;<\/p>\n<p>An interesting aspect of this demo is that it shows the macchina.io EDGE can be used in two ways. On the one hand, macchina.io EDGE provides quite comprehensive C++ and JavaScript APIs, giving you lots of flexibility for building fully custom IoT and edge device applications. On the other hand, macchina.io EDGE can also be used &#8220;out of the box&#8221; (in our case, using the available Docker image), as a &#8220;low-code&#8221; platform for writing edge applications in JavaScript, by just using the already available APIs and device integrations. In this demo I will focus on the latter.<\/p>\n<p><div id=\"attachment_657\" style=\"width: 610px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-657\" class=\"wp-image-657\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-1024x780.jpg\" alt=\"macchina.io Edge Demo Setup\" width=\"600\" height=\"457\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-300x228.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-768x585.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-1536x1169.jpg 1536w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><p id=\"caption-attachment-657\" class=\"wp-caption-text\">macchina.io Edge Computing Demo Setup<\/p><\/div><\/p>\n<p>This blog post is split into two parts. In this first part, I will describe how to set up the basic system. In the second part, I will show how to build the JavaScript program that reads the data from the sensor and writes it to InfluxDB.<\/p>\n<h2>Prerequisites<\/h2>\n<p>In the following I assume you have some basic understanding of <a href=\"https:\/\/docs.docker.com\/get-started\/\" target=\"_blank\" rel=\"noopener\">Docker<\/a> and <a href=\"https:\/\/docs.docker.com\/compose\/gettingstarted\/\" target=\"_blank\" rel=\"noopener\">Docker Compose<\/a>. Some experience working with a Raspberry Pi is nice to have as well, but not required. However, it&#8217;s also possible to run the containers on any machine where Docker is available.&nbsp;<\/p>\n<h2>Preparing the Environment<\/h2>\n<p>I&#8217;m starting with a clean <a href=\"https:\/\/www.raspberrypi.org\/software\/\" target=\"_blank\" rel=\"noopener\">Raspberry Pi OS Lite<\/a>\u00a064-bit image on an SD card (32 GB or more). Note that a 64-bit image is required because of InfluxDB, which currently only supports 64-bit architectures. The Raspberry Pi OS Lite 64-bit image can be downloaded from the <a href=\"https:\/\/downloads.raspberrypi.org\" target=\"_blank\" rel=\"noopener\">Raspberry Pi Downloads<\/a> server, using <a href=\"https:\/\/downloads.raspberrypi.org\/raspios_lite_arm64\/images\/\" target=\"_blank\" rel=\"noopener\">this link<\/a>. Use the latest image version available, at the time of writing this was dated 2021-05-28. Open the image in <a href=\"https:\/\/www.raspberrypi.org\/software\/\" target=\"_blank\" rel=\"noopener\">Raspberry Pi Imager<\/a> tool and write it to an SD-Card. Click the <strong>CHOOSE OS<\/strong> button, then select <strong>Use custom<\/strong>\u00a0(the last option) and select the 64-bit image (<code>2021-05-07-raspios-buster-arm64-lite.img<\/code>). Then proceed as usual. The rest of the Raspberry Pi setup works just as with the &#8220;regular&#8221; 32-bit Raspberry Pi OS. Note that at the time of writing, the 64-bit version is still in beta, so some things may not work.<\/p>\n<blockquote>\n<p>Note: it&#8217;s possible to run a variant of that setup on a 32-bit Raspberry Pi OS. For that you have to replace InfluxDB 2.0 with 1.8 and additional install Grafana for the graphing\/dashboard capabilities.<\/p>\n<\/blockquote>\n<p>First step, as usual, is expanding the file system to make all space on the SD card available, <a href=\"https:\/\/www.raspberrypi.org\/documentation\/remote-access\/ssh\/\" target=\"_blank\" rel=\"noopener\">enabling SSH access<\/a> and, finally, upgrading all Linux packages to their latest versions:<\/p>\n<pre>$ sudo apt-get update &amp;&amp; sudo apt-get upgrade<\/pre>\n<p>You can verify that the Raspberry Pi is running a\u00a064-bit OS with:<\/p>\n<pre>$ uname -m<br \/>aarch64<\/pre>\n<blockquote>\n<p>Optional Step: In order to monitor the memory usage of containers with Docker (and Portainer), two additional arguments must be passed to the Linux kernel at boot time, to enable <em>cgroup<\/em> memory accounting. This can be done by editing the <code>\/boot\/cmdline.txt<\/code> file and adding <code>cgroup_enable=memory cgroup_memory=1<\/code> to the end of the line.<\/p>\n<\/blockquote>\n<p>Next is installing Docker. The easiest way is by running the <a href=\"https:\/\/docs.docker.com\/engine\/install\/debian\/#install-using-the-convenience-script\" target=\"_blank\" rel=\"noopener\">convenience installer script<\/a> from the Docker website. A quick word of warning: before running scripts downloaded from a website, always make sure to inspect the script first.\u00a0To download and run the script,\u00a0use the following commands:<\/p>\n<pre>$ curl -fsSL https:\/\/get.docker.com -o get-docker.sh<br \/>$ sudo sh get-docker.sh<\/pre>\n<p>This\u00a0will download the script\u00a0from\u00a0the Docker website and execute it to\u00a0install\u00a0the latest Docker version.\u00a0After the script completes,\u00a0we can verify\u00a0that\u00a0Docker was\u00a0successfully installed by running:<\/p>\n<pre>$ sudo docker version<\/pre>\n<p>At the time\u00a0of writing this post, the current version was 20.10.7.<\/p>\n<p>Note that <code>docker<\/code> must be run with <code>sudo<\/code>. For convenience, it&#8217;s possible to add the user account you&#8217;re using (<code>pi<\/code>) to the <code>docker<\/code> group to avoid having to use <code>sudo<\/code> all the time:<\/p>\n<pre>$\u00a0sudo usermod -aG docker pi<\/pre>\n<p>It&#8217;s also possible to run\u00a0the\u00a0hello-world container to make sure\u00a0everything is okay:<\/p>\n<pre>$ sudo docker run hello-world<\/pre>\n<p>This should print out some information that everything&#8217;s properly running.<\/p>\n<p>Next, I&#8217;m also going to <a href=\"https:\/\/docs.docker.com\/compose\/install\/#install-compose-on-linux-systems\" target=\"_blank\" rel=\"noopener\">install\u00a0Docker Compose<\/a>, as it will make it\u00a0easier to get all containers up and running. On the Raspberry Pi,\u00a0Docker Compose must be installed via\u00a0Python 3&#8217;s\u00a0pip package manager (<code>pip3<\/code>), which\u00a0requires\u00a0Python 3.x to be installed first:<\/p>\n<pre>$ sudo apt-get -y install libffi-dev libssl-dev python3-dev python3 python3-pip<br \/>$ sudo pip3 -v install docker-compose<\/pre>\n<p>Successful installation\u00a0can be\u00a0verified\u00a0by running:<\/p>\n<pre>$\u00a0docker-compose -v<\/pre>\n<p>which will\u00a0show the\u00a0version\u00a0number of\u00a0the installed <code>docker-compose<\/code> script.<\/p>\n<p>This completes the basic infrastructure setup. Before\u00a0moving on, I&#8217;ll connect the\u00a0CISS\u00a0sensor to one of the Raspberry Pi&#8217;s\u00a0USB ports and\u00a0verify that it shows up\u00a0in the\u00a0<code>\/dev<\/code> filesystem.\u00a0It should show up as a new device file\u00a0<code>\/dev\/ttyACM0<\/code>.<\/p>\n<pre>$ ls -l \/dev\/ttyACM0<br \/>crw-rw---- 1 root dialout 166, 0 Jul 9 07:17 \/dev\/ttyACM0<\/pre>\n<p>Note that accessing\u00a0this device\u00a0requires either <code>root<\/code>\u00a0or membership\u00a0in the <code>dialout<\/code> group. More on that later.<\/p>\n<blockquote>\n<p>Note: Make sure that the Raspberry Pi is connected to a sufficiently powerful power adapter. A Raspberry Pi 4 with an additional device (CISS multi-sensor) connected via USB requires significant energy, which is more than standard USB-C ports can provide. If you experience sudden freezes, check the kernel log (<code>dmesg<\/code>) for <code>undervoltage detected<\/code> messages.<\/p>\n<\/blockquote>\n<h2>macchina.io Remote Manager<\/h2>\n<p>I will use macchina.io Remote Manager to remotely access the Raspberry Pi (via SSH) and the applications it runs (macchina.io EDGE, Portainer, InfluxDB) once the device has been deployed to the final location (e.g., shop floor, etc.), where I no longer can directly access it in my local network. This requires setting up an account on our free Remote Manager server. After <a href=\"https:\/\/reflector.my-devices.net\/my-devices\/signup\" target=\"_blank\" rel=\"noopener\">registering your new account<\/a> and confirming your email address, sign in to the Remote Manager at <a href=\"https:\/\/reflector.my-devices.net\/my-devices\/login\" target=\"_blank\" rel=\"noopener\">reflector.my-devices.net<\/a> and click the user icon or your email address on the top right.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-665\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-300x73.jpg\" alt=\"macchina.io Remote Manager Account Settings\" width=\"640\" height=\"156\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-300x73.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-768x188.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-1536x375.jpg 1536w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmsignup-2048x500.jpg 2048w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>You will then see your Account page, and on it you will find your <strong>Domain ID<\/strong>. Copy that to the clipboard (by clicking the Copy button next to the ID) and save it in a text document. You will need it later on when setting up the <a href=\"https:\/\/github.com\/my-devices\/meta-gateway-docker\" target=\"_blank\" rel=\"noopener\">macchina.io Remote Manager Gateway<\/a> container.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-667\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-300x156.jpg\" alt=\"Remote Manager Account Settings\" width=\"640\" height=\"333\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-300x156.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-768x400.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-1536x799.jpg 1536w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rmdomain-2048x1066.jpg 2048w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<h2>Composing the Containers<\/h2>\n<p>Next I&#8217;m going to set up the containers. For that purpose, I&#8217;m going to use Docker Compose, and will write a <code>docker-compose.yml<\/code> file that specifies all the containers I want in my demo.<\/p>\n<p>The following container images will be used:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-docker\" target=\"_blank\" rel=\"noopener\">macchina\/edge-ce<\/a>: This is the GPL-licensed open source version of macchina.io EDGE, as available from GitHub.<\/li>\n<li><a href=\"https:\/\/github.com\/my-devices\/meta-gateway-docker\" target=\"_blank\" rel=\"noopener\">macchina\/rmgateway<\/a>: This is the macchina.io Remote Manager Gateway server, which will make SSH access and the various web interfaces of the applications available remotely via macchina.io Remote Manager.<\/li>\n<li><a href=\"https:\/\/hub.docker.com\/r\/portainer\/portainer-ce\" target=\"_blank\" rel=\"noopener\">portainer\/portainer-ce<\/a>: Portainer provides a web-based user interface for Docker. We will only use Portainer to show that its web user interface can be accessed remotely via macchina.io Remote Manager. Of course, you can use Portainer to set up additional containers, as desired.<\/li>\n<li><a href=\"https:\/\/hub.docker.com\/_\/influxdb\" target=\"_blank\" rel=\"noopener\">influxdb:2.0<\/a>: InfluxDB 2 provides a time-series database and includes a nice web-based user interface that, among other features, supports building dashboards.<\/li>\n<\/ul>\n<p>The <code><a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo\/blob\/main\/docker-compose.yml\" target=\"_blank\" rel=\"noopener\">docker-compose.yml<\/a><\/code> file for launching all of the above containers is nothing special. It sets up the four containers according to their respective documentation and also creates volumes where all data is persistently stored. It also exposes the ports for the various applications&#8217; web servers. The <code>docker-compose.yml<\/code> file requires an environment file, which sets the domain ID to use for connecting to the macchina.io Remote Manager server. The GitHub repository also contains a <code>.env<\/code> file which defines the <code>REMOTE_MANAGER_DOMAIN<\/code> environment variable. This must be set to the Domain ID obtained earlier, when setting up the macchina.io Remote Manager account.<\/p>\n<p>To set-up all the containers, clone the <a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo\" target=\"_blank\" rel=\"noopener\">GitHub repository<\/a>, edit the <code>.env<\/code> file and set <code>REMOTE_MANAGER_DOMAIN<\/code>, then run <code>docker-compose<\/code>:<\/p>\n<pre>$ git clone https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo.git<br>$ cd meta-macchina-edge-demo<br>$ vi .env # change REMOTE_MANAGER_DOMAIN<br>$ sudo docker-compose up -d<\/pre>\n<p>To verify that all applications work, you can open the different web applications in your browser. The web applications run on the following numbers:<\/p>\n<ul>\n<li>macchina.io EDGE: 22080 (<a href=\"http:\/\/raspberrypi:22080\" target=\"_blank\" rel=\"noopener\" data-wplink-url-error=\"true\">http:\/\/raspberrypi:22080<\/a>)<\/li>\n<li>macchina.io Remote Manager Gateway: 8080 (<a href=\"http:\/\/raspberrypi:8080\" target=\"_blank\" rel=\"noopener\" data-wplink-url-error=\"true\">http:\/\/raspberrypi:8080<\/a>)<\/li>\n<li>Portainer: 9000 (<a href=\"http:\/\/raspberrypi:9000\" target=\"_blank\" rel=\"noopener\" data-wplink-url-error=\"true\">http:\/\/raspberrypi:9000<\/a>)<\/li>\n<li>InfluxDB: 8086 (<a href=\"http:\/\/raspberrypi:8086\" target=\"_blank\" rel=\"noopener\" data-wplink-url-error=\"true\">http:\/\/raspberrypi:8086<\/a>)<\/li>\n<\/ul>\n<p>The default username for macchina.io EDGE is <code>edgeadmin<\/code>. The password is the same as the username. See the <a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-docker\/blob\/master\/README.md#configuration\" target=\"_blank\" rel=\"noopener\">README<\/a> for how to set a different password.<\/p>\n<p>For logging in to macchina.io Remote Manager Gateway, you use the username and password from your macchina.io Remote Manager account created earlier.<\/p>\n<p>When opening the Portainer web application for the first time, you will be asked to set a new username and password.<\/p>\n<p>The default username for InfluxDB (as set in the <code>docker-compose.yml<\/code>) is <code>macchina<\/code>. The password can also be found in the <a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo\/blob\/main\/docker-compose.yml\" target=\"_blank\" rel=\"noopener\">docker-compose.yml<\/a>&nbsp;file.<\/p>\n<h2>Setting Up Remote Access<\/h2>\n<p>As the final step in this first part, I will set up remote access to all applications via macchina.io Remote Manager. To begin, go to the Remote Manager Gateway web application on port <a href=\"http:\/\/raspberrypi:8080\" target=\"_blank\" rel=\"noopener\" data-wplink-url-error=\"true\">8080<\/a>. You will see a sign-in page, where you need to sign-in with your Remote Manager username and password, as you&#8217;ve set when registering for the account.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-681\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway1-300x254.jpg\" alt=\"Remote Manager Gateway Login\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway1-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway1-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway1-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway1-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Enter your credentials and click the <strong>Login<\/strong> button.<\/p>\n<p>Next you will see an empty list of local devices. Click the plus (<strong>+<\/strong>) button to create the first device connection.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-682\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway2-300x254.jpg\" alt=\"Remote Manager Gateway Dashboard\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway2-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway2-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway2-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway2-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>The first device connection will be for remote SSH access to the Raspberry Pi. Under <strong>Name<\/strong>, enter <code>Raspberry Pi<\/code>. <strong>ID<\/strong> and <strong>Domain<\/strong> can be left at the defaults. The ID has been randomly generated, and the Domain is the one specified in the Docker Compose environment file (<code>REMOTE_MANAGER_DOMAIN<\/code>). Then click <strong>Next<\/strong> to set up the IP address and SSH port.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-683\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway3-300x254.jpg\" alt=\"Remote Manager Gateway - Create Device\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway3-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway3-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway3-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway3-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Setting up the host IP address is a bit tricky, as there is no reliable way of determining the actual host IP address from within a Docker container on Linux. If the host has a fixed IP address, or a (local) domain name, we can use that. In my case, I will simply use <code>raspberrypi<\/code> as the host name, as my local router assigns that to the Raspberry Pi. Note that 127.0.0.1 (the default in the web user interface) will not work, as 127.0.0.1 is something different inside a container &#8211; it&#8217;s the container&#8217;s loopback address.\u00a0<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-684\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway4-300x254.jpg\" alt=\"Remote Manager Gateway Device Page\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway4-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway4-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway4-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway4-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>The <strong>SSH Server Port<\/strong> must be set to 22 (the default SSH port number in use) in order to enable remote access to SSH. The <strong>HTTP Server Port<\/strong> can be left as is, or set to empty &#8211; it will not be used. Clicking on <strong>Save<\/strong> brings you back to the Local Devices page, where you should now see the Raspberry Pi. After a few seconds, you should also see the Raspberry Pi in the Remote Manager Server web user interface, and should be able to connect to SSH via Remote Manager &#8211; more on that below.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-685\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway5-300x254.jpg\" alt=\"Remote Manager Gateway\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway5-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway5-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway5-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway5-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Next we will create device connections for macchina.io EDGE, Portainer, InfluxDB and Remote Manager Gateway itself. Click the plus (<strong>+<\/strong>) button again to create another device connection. For <strong>Name<\/strong>, enter <code>macchina.io EDGE<\/code>, leave the rest at the defaults and click <strong>Next<\/strong>. Set <strong>Device IP Address or Domain Name<\/strong> to <code>macchina-edge<\/code> (the service name defined in <code>docker-compose.yml<\/code>, which Docker&#8217;s internal DNS server maps to the container&#8217;s IP address in the Docker network set up for the Docker Compose stack, so that other containers can use it) and\u00a0<strong>HTTP Server Port<\/strong> to 22080 and click <strong>Save<\/strong>.<\/p>\n<p>Repeat the above for Portainer (Device IP Address or Domain Name: <code>portainer<\/code>, HTTP Server Port: 9000), InfluxDB (<code>influxdb<\/code>, 8086) and finally Remote Manager Gateway (<code>rmgateway<\/code>, 8080). When done, the Local Devices list should like like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-686\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway6-300x254.jpg\" alt=\"Remote Manager Gateway\" width=\"640\" height=\"541\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway6-300x254.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway6-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway6-768x650.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/gateway6-1536x1299.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>You should now also see all these devices in the macchina.io Remote Manager Server Devices list. Clicking on the device name will bring you to the web interface of the respective application.<\/p>\n<p>For SSH remote access, you can either install the <a href=\"https:\/\/macchina.io\/remote_downloads.html#helper\" target=\"_blank\" rel=\"noopener\">Remote Manager Helper<\/a> application if you are using Windows, or use the <a href=\"https:\/\/github.com\/my-devices\/sdk\/blob\/master\/WebTunnel\/WebTunnelSSH\/README.md\" target=\"_blank\" rel=\"noopener\">WebTunnelSSH<\/a> command-line tool from the <a href=\"https:\/\/github.com\/my-devices\/sdk\" target=\"_blank\" rel=\"noopener\">Remote Manager SDK<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-689\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rm-300x241.jpg\" alt=\"macchina.io Remote Manager Devices Page\" width=\"640\" height=\"515\" srcset=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rm-300x241.jpg 300w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rm-scaled.jpg 1024w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rm-768x618.jpg 768w, https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/rm-1536x1236.jpg 1536w\" sizes=\"(max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>With Remote Manager Helper installed, you can click the Shell (<code>&gt;_<\/code>) icon to launch the Windows SSH client (or PuTTY) via Remote Manager Helper for connecting to the Raspberry Pi. Alternatively, you can use <code>WebTunnelSSH<\/code> from the shell. Binary downloads for <code>WebTunnelSSH<\/code> for various platforms are <a href=\"https:\/\/macchina.io\/downloads\/RemoteManager\/SDK\/\" target=\"_blank\" rel=\"noopener\">available here<\/a>. You can also build <a href=\"https:\/\/github.com\/my-devices\/sdk\" target=\"_blank\" rel=\"noopener\">from source<\/a>.<\/p>\n<pre>$ WebTunnelSSH -l pi https:\/\/4ef4e66d-942c-48aa-9aeb-12d00b3573d4.my-devices.net\/<\/pre>\n<p>You will be asked for your macchina.io Remote Manager username and password, then, like with any <code>ssh<\/code> session, for the password for the <code>pi<\/code> user on the Raspberry Pi. Note that the Device ID in the URL passed to the <code>WebTunnelSSH<\/code> command (<code>4ef4e66d-942c-48aa-9aeb-12d00b3573d4<\/code>) is the one from creating the device connection in Remote Manager Gateway. You can get that URL by right-clicking the device name in the Remote Manager server device list and selecting <strong>Copy Link<\/strong> (or <strong>Copy Link Address<\/strong>).<\/p>\n<p>To connect to the other web applications (macchina.io EDGE, InfluxDB, etc.), click on the respective name on the Remote Manager Server Devices page. A new tab will then open with the login page of the respective application.<\/p>\n<p>This concludes the first part of this article. In the second part, I will first show how to write a script that reads sensor data from the CISS sensor and writes the data to InfluxDB, using the <a href=\"https:\/\/docs.influxdata.com\/influxdb\/v2.0\/write-data\/developer-tools\/api\/\" target=\"_blank\" rel=\"noopener\">InfluxDB HTTP API<\/a>. Then I&#8217;ll set up a simple dashboard to visualize the data with InfluxDB.<\/p>\n<p>On to <a href=\"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/\">part 2<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Following up my previous blog post about edge computing, in this blog post I will show how to build an edge computing application by combining macchina.io EDGE and macchina.io Remote Manager with a number of other applications. These are&nbsp;Docker, as everything will be deployed in containers,&nbsp;Portainer, for providing a nice remotely-accessible web interface for managing [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":657,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","footnotes":""},"categories":[41,3,37,31],"tags":[39],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]\" \/>\n<meta property=\"og:description\" content=\"Following up my previous blog post about edge computing, in this blog post I will show how to build an edge computing application by combining macchina.io EDGE and macchina.io Remote Manager with a number of other applications. These are&nbsp;Docker, as everything will be deployed in containers,&nbsp;Portainer, for providing a nice remotely-accessible web interface for managing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"macchina.io Blog [STAGING]\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-10T18:31:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-12T05:37:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"780\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00fcnter Obiltschnig\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@macchina_io\" \/>\n<meta name=\"twitter:site\" content=\"@macchina_io\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00fcnter Obiltschnig\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\"},\"author\":{\"name\":\"G\u00fcnter Obiltschnig\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b\"},\"headline\":\"Building an IoT Edge Application with macchina.io and Docker (Part 1)\",\"datePublished\":\"2021-07-10T18:31:29+00:00\",\"dateModified\":\"2021-07-12T05:37:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\"},\"wordCount\":2352,\"publisher\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg\",\"keywords\":[\"featured\"],\"articleSection\":[\"Edge Computing\",\"Internet of Things\",\"macchina.io\",\"my-devices.net\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\",\"url\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\",\"name\":\"Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]\",\"isPartOf\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg\",\"datePublished\":\"2021-07-10T18:31:29+00:00\",\"dateModified\":\"2021-07-12T05:37:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage\",\"url\":\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg\",\"contentUrl\":\"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg\",\"width\":1024,\"height\":780,\"caption\":\"macchina.io Edge Computing Demo Setup\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/web-staging.macchina.io\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building an IoT Edge Application with macchina.io and Docker (Part 1)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#website\",\"url\":\"https:\/\/web-staging.macchina.io\/blog\/\",\"name\":\"macchina.io Blog [STAGING]\",\"description\":\"Internet of Things, edge computing, IoT device software, C++\",\"publisher\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/web-staging.macchina.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#organization\",\"name\":\"macchina.io\",\"url\":\"https:\/\/web-staging.macchina.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png\",\"contentUrl\":\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png\",\"width\":1537,\"height\":529,\"caption\":\"macchina.io\"},\"image\":{\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/macchina_io\",\"https:\/\/www.linkedin.com\/showcase\/37869369\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b\",\"name\":\"G\u00fcnter Obiltschnig\",\"sameAs\":[\"http:\/\/www.appinf.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]","og_description":"Following up my previous blog post about edge computing, in this blog post I will show how to build an edge computing application by combining macchina.io EDGE and macchina.io Remote Manager with a number of other applications. These are&nbsp;Docker, as everything will be deployed in containers,&nbsp;Portainer, for providing a nice remotely-accessible web interface for managing [&hellip;]","og_url":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/","og_site_name":"macchina.io Blog [STAGING]","article_published_time":"2021-07-10T18:31:29+00:00","article_modified_time":"2021-07-12T05:37:21+00:00","og_image":[{"width":1024,"height":780,"url":"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg","type":"image\/jpeg"}],"author":"G\u00fcnter Obiltschnig","twitter_card":"summary_large_image","twitter_creator":"@macchina_io","twitter_site":"@macchina_io","twitter_misc":{"Written by":"G\u00fcnter Obiltschnig","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#article","isPartOf":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/"},"author":{"name":"G\u00fcnter Obiltschnig","@id":"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b"},"headline":"Building an IoT Edge Application with macchina.io and Docker (Part 1)","datePublished":"2021-07-10T18:31:29+00:00","dateModified":"2021-07-12T05:37:21+00:00","mainEntityOfPage":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/"},"wordCount":2352,"publisher":{"@id":"https:\/\/web-staging.macchina.io\/blog\/#organization"},"image":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg","keywords":["featured"],"articleSection":["Edge Computing","Internet of Things","macchina.io","my-devices.net"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/","url":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/","name":"Building an IoT Edge Application with macchina.io and Docker (Part 1) - macchina.io Blog [STAGING]","isPartOf":{"@id":"https:\/\/web-staging.macchina.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage"},"image":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg","datePublished":"2021-07-10T18:31:29+00:00","dateModified":"2021-07-12T05:37:21+00:00","breadcrumb":{"@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#primaryimage","url":"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg","contentUrl":"https:\/\/web-staging.macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg","width":1024,"height":780,"caption":"macchina.io Edge Computing Demo Setup"},{"@type":"BreadcrumbList","@id":"https:\/\/web-staging.macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/web-staging.macchina.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Building an IoT Edge Application with macchina.io and Docker (Part 1)"}]},{"@type":"WebSite","@id":"https:\/\/web-staging.macchina.io\/blog\/#website","url":"https:\/\/web-staging.macchina.io\/blog\/","name":"macchina.io Blog [STAGING]","description":"Internet of Things, edge computing, IoT device software, C++","publisher":{"@id":"https:\/\/web-staging.macchina.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/web-staging.macchina.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/web-staging.macchina.io\/blog\/#organization","name":"macchina.io","url":"https:\/\/web-staging.macchina.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png","contentUrl":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png","width":1537,"height":529,"caption":"macchina.io"},"image":{"@id":"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/macchina_io","https:\/\/www.linkedin.com\/showcase\/37869369"]},{"@type":"Person","@id":"https:\/\/web-staging.macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b","name":"G\u00fcnter Obiltschnig","sameAs":["http:\/\/www.appinf.com"]}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/posts\/653"}],"collection":[{"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/comments?post=653"}],"version-history":[{"count":36,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/posts\/653\/revisions"}],"predecessor-version":[{"id":745,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/posts\/653\/revisions\/745"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/media\/657"}],"wp:attachment":[{"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/media?parent=653"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/categories?post=653"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/web-staging.macchina.io\/blog\/wp-json\/wp\/v2\/tags?post=653"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}