In this guide you will learn basic concepts and learn how you can deploy containers to the device with Eliot.
To work with Eliot, you describe the desired state and
eliotd Eliot Agent works to make the device current state match with desired state.
With Eliot, you run all your processes in containers. Containers gives easy software delivery, network, disk and resources isolation. You can use existing tooling, like Docker command line tool, to build container images and any Container Registry, for example Docker public hub.
You define what software containers you would like to run in the device, by deploying Pods in to the device.
Pod is a basic building block of Eliot and is the main model object that you deploy and manage. If you're familiar with Kubernetes definition of Pod, in Eliot it's exactly same except some features are not yet implemented.
A Pod wraps application container (or, in some cases, multiple containers) and gives configuration options like host network, restart policy, etc. All containers in same Pod are meant to get started, deployed, and deleted together.
Assuming that you already complete installation of
eli client and
eliot agent. If not, check theinstallation guide and come back after finishing it.
When you have connected RaspberryPI to network and power it on, first step is to check that Eliot can discover and connect to the device.
**[terminal] **[prompt ernoaapa@mac]**[path ~]**[delimiter $ ]**[command eli get devices] ✓ Discovered 1 devices from network HOSTNAME ENDPOINT linuxkit-96165e7f48d7.local. 192.168.64.79:5000
List should contain your RaspberryPI device.
There should not be anything running, you can verify it by listing all created Pods in the device
**[terminal] **[prompt ernoaapa@mac]**[path ~]**[delimiter $ ]**[command eli get pods] ✓ Discovered 1 device(s) from network • Connect to linuxkit-96165e7f48d7.local. (192.168.64.79:5000) NAMESPACE NAME CONTAINERS STATUS
Pod listing should be empty.
Now let's deploy eaapa/hello-world image, that just prints Hello World text.
eli create pod --image eaapa/hello-world testing **[terminal] **[prompt ernoaapa@mac]**[path ~]**[delimiter $ ]**[command eli create pod --image eaapa/hello-world testing] ✓ Discovered 1 device(s) from network • Connect to linuxkit-96165e7f48d7.local. (192.168.64.79:5000) ⠸ Download docker.io/eaapa/hello-world:latest Name: testing Namespace: eliot Device: linuxkit-96165e7f48d7 State: running(1) Restart Policy: always Host Network: false Host PID: false Containers: eaapa-hello-world: Image: docker.io/eaapa/hello-world:latest ContainerID: b97cq4r744405e9hmscg State: running Restart Count: 0 Working Dir: / Args: - /bin/sh Env: - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin - PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin Mounts: - type=proc,source=proc,destination=/proc,options= - type=tmpfs,source=tmpfs,destination=/dev,options=nosuid:strictatime:mode=755:size=65536k - type=devpts,source=devpts,destination=/dev/pts,options=nosuid:noexec:newinstance:ptmxmode=0666:mode=0620:gid=5 - type=tmpfs,source=shm,destination=/dev/shm,options=nosuid:noexec:nodev:mode=1777:size=65536k - type=mqueue,source=mqueue,destination=/dev/mqueue,options=nosuid:noexec:nodev - type=sysfs,source=sysfs,destination=/sys,options=nosuid:noexec:nodev:ro - type=tmpfs,source=tmpfs,destination=/run,options=nosuid:strictatime:mode=755:size=65536k
When create completes, you can check the output by attaching to the container
**[terminal] **[prompt ernoaapa@mac]**[path ~]**[delimiter $ ]**[command eli attach testing] Hello world! Hello world! Hello world! ^C
You should see now Hello World text printing once in a second to the terminal. Hit
CTRL + C to close the connection.
Next you want to remove the Pod from the device.
**[terminal] **[prompt ernoaapa@mac]**[path ~]**[delimiter $ ]**[command eli delete pod testing] ✓ Discovered 1 device(s) from network • Connect to linuxkit-96165e7f48d7.local. (192.168.64.79:5000) ✓ Fetched pods ✓ Deleted pod testing
Now the device is back to the initial state, clean and no any services running.
This was the quick start how to deploy containers to the Eliot. Next step is to learn how you can develop your software in the device in real time
When developing IoT solution, you usually need to develop software that reads data from hardware sensor and send it to the cloud. For this you need to have access to the device, connect to the sensor and be able to develop your software.
For this Eliot offer really easy way,
eli run -command.
eli run command you can connect to the device, start container that contains all required development tools and synchronize your local files to the device in real time.
Following command will:
- Detect what type of project you have and selects container image
/devdirectory into the container
/bin/bashsession in container
- Move your terminal session to the container
- Start syncing your local files to the container
**[terminal] **[prompt ernoaapa@mac]**[path ~/go/src/github.com/ernoaapa/eliot]**[delimiter $ ]**[command eli run --bind /dev:/dev /bin/bash] root@linuxkit-96165e7f48d7:/go/src/github.com/ernoaapa/eliot#
Now you should be in the container and you can make changes in your local computer, compile and run your project in the device.
If you type
exit your terminal session comes back to your local computer and Eliot removes all created containers.
When you're done with development, you can create container image with your preferred tools (e.g.
docker) and use the
create command to deploy your software to the device permanently.
Easy right! :)