<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniele Salatti</title>
    <description>The latest articles on DEV Community by Daniele Salatti (@danielesalatti).</description>
    <link>https://dev.to/danielesalatti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F548993%2F402079c2-f1d0-4ab0-af10-cc30a21b424d.jpeg</url>
      <title>DEV Community: Daniele Salatti</title>
      <link>https://dev.to/danielesalatti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielesalatti"/>
    <language>en</language>
    <item>
      <title>Goals for 2021: Learning Go and Rust</title>
      <dc:creator>Daniele Salatti</dc:creator>
      <pubDate>Thu, 31 Dec 2020 05:03:02 +0000</pubDate>
      <link>https://dev.to/danielesalatti/goals-for-2021-learning-go-and-rust-2g2a</link>
      <guid>https://dev.to/danielesalatti/goals-for-2021-learning-go-and-rust-2g2a</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--97Ehc2xe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1571171637578-41bc2dd41cd2%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDJ8fHByb2dyYW1taW5nfGVufDB8fHw%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--97Ehc2xe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1571171637578-41bc2dd41cd2%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMXwxMTc3M3wwfDF8c2VhcmNofDJ8fHByb2dyYW1taW5nfGVufDB8fHw%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/@ffstop?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Fotis Fotopoulos&lt;/a&gt; / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;amp;utm_medium=referral&amp;amp;utm_campaign=api-credit"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'll keep this short. In the past 6 or so years in Amazon I've been mostly working with Java and sometimes a little bit of Python. There's nothing wrong with that. I'm not against any of these languages, I might even enjoy working with them - at least when people don't abuse design patterns just for the sake of it and use 75 levels of indirection because "best practices", ending up with code that is impossible to maintain. And unlike what some think, I believe both languages are going to be around for a long time - their market share is far too big and they are far too widespread to be disappearing any time soon.&lt;/p&gt;

&lt;p&gt;But I'm digressing and I said I was going to keep this short.&lt;/p&gt;

&lt;p&gt;Like many other developers I like to spend time researching new technologies, look at new programming languages, and just experiment with things in my free time. Over the years two languages caught my attention, and I figured this is as good a time as any to start picking up on a couple of them. I'm talking about &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt; and &lt;a href="https://www.rust-lang.org/"&gt;Rust&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now, to be honest: I hate new years resolution, and I don't believe they make much sense. It's something you commit to and then just drop a few weeks later... (fun fact: I do have some sort of yearly cycle analysis that I do regularly - e.g. around finances - but I use my birthday as a "fiscal year" of sorts). I do want to learn these two new (to me) languages though, and I figured I'd try to use this blog as an "accountability buddy". So here we go.&lt;/p&gt;

&lt;p&gt;I'll be posting my notes and progress while I try to learn Go and Rust, in a format that can be used by others to learn as I go. If it ends up being decent enough it might even become a little course in Go and Rust programming. And I will release anything I end up building while learning as open source on &lt;a href="https://github.com/DanieleSalatti"&gt;my GitHub profile&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So there it is. Stay tuned and follow along :)&lt;/p&gt;

</description>
      <category>go</category>
      <category>rust</category>
      <category>course</category>
    </item>
    <item>
      <title>Monitoring With Prometheus: Experiments With a Raspberry Pi</title>
      <dc:creator>Daniele Salatti</dc:creator>
      <pubDate>Wed, 26 Aug 2020 06:55:38 +0000</pubDate>
      <link>https://dev.to/danielesalatti/monitoring-with-prometheus-experiments-with-a-raspberry-pi-4090</link>
      <guid>https://dev.to/danielesalatti/monitoring-with-prometheus-experiments-with-a-raspberry-pi-4090</guid>
      <description>&lt;p&gt;Code available on GitHub here: &lt;a href="https://github.com/DanieleSalatti/Prometeo"&gt;DanieleSalatti/Prometeo&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  What Is Prometheus
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://prometheus.io/"&gt;Prometheus&lt;/a&gt; is cool software used for event monitoring and alerting. It includes a time series database used to record real-time metrics, it has a pretty flexible query language and alerting functions. It scrapes metrics over HTTP using a pull model - which has some advantages in terms of scaling compared to a push model (more on this in a future post).&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker on a PC or laptop&lt;/li&gt;
&lt;li&gt;A Raspberry Pi (or ARMv6/v7 boards)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can get a Raspberry Pi from here if you don't have one already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://amzn.to/3lxQimr"&gt;Raspberry Pi 4 Model B 8GB RAM&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/33BUWcC"&gt;Raspberry Pi 4 Model B 4GB RAM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3g0Ajff"&gt;Raspberry Pi 4 Model B 2GB RAM&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The links above are for the Raspberry Pi only. You'll also need a power source, an SD card, a micro-HDMI to HDMI adapter, and optionally an enclosure. Sometimes it's worth to get it all as a bundle, so here's a couple links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2KSdBdM"&gt;Raspberry Pi 4 Basic Kit [8GB]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ogL2Fj"&gt;Raspberry Pi 4 Basic Kit [4GB]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/36wIQDO"&gt;Raspberry Pi 4 Basic Kit [2GB]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have the 8GB kit from the last link and can vouch for them.&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparing the Docker Image
&lt;/h1&gt;

&lt;p&gt;Well, actually, before we build our Docker image we need a way to test our Prometheus instance when we run it locally. That's a pretty simple thing to do as all we need it to set up a &lt;a href="https://prometheus.io/docs/guides/node-exporter/"&gt;NodeExporter&lt;/a&gt;instance. A NodeExporter is a simple local service that exposes an HTTP endpoint (usually on port 9100) and publishes a set of system/hardware metrics, allowing Prometheus to scrape it.&lt;/p&gt;

&lt;p&gt;I am going to set up my NodeExporter on my Raspberry Pi(s), but you can set it up locally or on any instance/VPS you want to monitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up a NodeExporter Instance
&lt;/h2&gt;

&lt;p&gt;Let's start by installing a NodeExporter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; pi@televisione:~ $ sudo apt-get install prometheus-node-exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the installation process finishes, we can test out endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pi@televisione:~ $ curl localhost:9100/metrics | less
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a bunch of metrics being emitted. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a New Docker Image
&lt;/h2&gt;

&lt;p&gt;Thankfully for us there already is a &lt;a href="https://hub.docker.com/r/prom/prometheus/"&gt;Prometheus image on Docker Hub&lt;/a&gt;, so all we need to do is change the config file to suit our needs.&lt;/p&gt;

&lt;p&gt;Extract default config file from Docker image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker create --name prom_empty prom/prometheus
$ docker cp prom_empty:/etc/prometheus/prometheus.yml ./prometheus.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use your favorite editor and open &lt;code&gt;./prometheus.yml&lt;/code&gt;. You'll see a block similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=&amp;lt;job_name&amp;gt;` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are going to add our endpoints in the &lt;code&gt;scrape_configs&lt;/code&gt; section. So let's add our test endpoint (comments removed for readability):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'televisione'
    static_configs:
      - targets: ['192.168.1.224:9100']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second job name is called &lt;em&gt;"televisione"&lt;/em&gt; because that Raspberry Pi is attached to my smart TV (TV = &lt;em&gt;televisione&lt;/em&gt; in Italian). Feel free to change that name. Now we need to create our Dockerfile, telling Docker to copy our config file over for Prometheus to use. Here's the content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM prom/prometheus
COPY ./prometheus.yml /etc/prometheus/prometheus.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally we need to build our image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker build -t prometheus/cluster-local .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the command succeed we can run Prometheus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker run -p 9091:9090 --restart=always --name prometheus-local -d prometheus/cluster-local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that I'm redirecting port 9091 from the host to port 9090 on the container. That's because I am going to have another Prometheus instance running on that Raspberry Pi as part of a separate tool that I'll discuss in a follow up post. You can leave it as &lt;code&gt;9090:9090&lt;/code&gt; if you prefer.&lt;/p&gt;

&lt;p&gt;When you want to stop the container type in: &lt;code&gt;docker rm -f prometheus-local&lt;/code&gt;. Remember that if you make any change to the config file, you will need to build the image again, then stop the container and run it again as above.&lt;/p&gt;

&lt;p&gt;Now you can go to &lt;a href="http://localhost:9091/"&gt;http://localhost:9091/&lt;/a&gt; and see Prometheus up and running. Click on &lt;em&gt;Status&lt;/em&gt; -&amp;gt; &lt;em&gt;Targets&lt;/em&gt; in the top menu to see a list of targets. There should be only two at the moment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The local Prometheus instance and&lt;/li&gt;
&lt;li&gt;The test NodeExporter we setup earlier&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Deploying to the Raspberry Pi
&lt;/h1&gt;

&lt;p&gt;Install Docker on your Raspberry Pis. Instructions here will differ depending on the OS. I'll cover Raspbian and Ubuntu server, since that's what I have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Docker on Ubuntu Server
&lt;/h2&gt;

&lt;p&gt;Do not use the install script, do it properly. Instructions &lt;a href="https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository"&gt;here&lt;/a&gt; and below in a shortened version.&lt;/p&gt;

&lt;p&gt;In essence what we have to do is install a few dependencies first, then add the Docker repository to our repository list, and finally install Docker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember to always validate any key you get from the Internet. You can do so by looking for the last 8 digits of the fingerprint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt-key fingerprint 0EBFCD88

pub rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [unknown] Docker Release (CE deb) &amp;lt;docker@docker.com&amp;gt;
sub rsa4096 2017-02-22 [S]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the fingerprint looks like this one you are good to go: &lt;code&gt;9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I have installed Ubuntu 64 bit on my Raspberry Pis 4 (8 GB RAM), so to add the repository I need to type this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo add-apt-repository \
   "deb [arch=arm64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have a different architecture you need to replace &lt;code&gt;arm64&lt;/code&gt; with &lt;code&gt;armhf&lt;/code&gt; or &lt;code&gt;amd64&lt;/code&gt; depending on what you have.&lt;/p&gt;

&lt;p&gt;And finally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Install Docker on Raspbian
&lt;/h2&gt;

&lt;p&gt;Unfortunately with Raspbian we cannot use the repository, so we need to use the convenience script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Start Prometheus
&lt;/h2&gt;

&lt;p&gt;Now that we have Docker running, we can copy our config and Docker file over to the Raspberry Pi and start our container. For convenience, I uploaded everything we need in this GitHub repository: &lt;a href="https://github.com/DanieleSalatti/Prometeo"&gt;https://github.com/DanieleSalatti/Prometeo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you do check that out, remember to change your config files. It would probably be a good idea to create a fork, so you can track your own changes there.&lt;/p&gt;

&lt;p&gt;Once everything is moved over to the Pi, all that's needed is to build and run our image again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker build -t prometheus/cluster-local .
$ docker run -p 9091:9090 --restart=always --name prometheus-local -d prometheus/cluster-local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Data Persistence
&lt;/h3&gt;

&lt;p&gt;Docker volumes aren't the best way to persist data, so I added a little script in the GitHub repository to start our Prometheus image in a slightly different way. The script is called &lt;code&gt;run.sh&lt;/code&gt;. Let's quickly take a look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#! /bin/bash
mkdir -p /media/usb-ssd-1/prometeo # creates a folder for your data
ID=$(id -u) # saves your user id in the ID variable

docker run -p 9091:9090 --restart=always \
--user $ID \
--volume "/media/usb-ssd-1/prometeo:/prometheus" \
--name prometheus-local -d prometheus/cluster-local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, at the top of the file we create a new folder (if it doesn't already exist - the &lt;code&gt;-p&lt;/code&gt; parameter takes care of that). After that we start our image, but there's one additional parameter that we pass to &lt;code&gt;docker run&lt;/code&gt;: &lt;code&gt;--volume "/media/usb-ssd-1/prometeo:/prometheus"&lt;/code&gt;. That allows us to specify a mount-point on our host for a folder in our container. We also run our image with our own user, and that's to ensure that we have the correct read/write permissions for the folder we just created. Be sure to change the &lt;code&gt;run.sh&lt;/code&gt; file to suit your needs before attempting to start it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Grafana
&lt;/h2&gt;

&lt;p&gt;Little bonus: in the GitHub repository I also included a second little script to run a Grafana image. No additional config is needed since Grafana can be configured from the UI itself. Just like the previous script it will attempt to create a folder and start the image with a volume mapped to that folder for data persistence. Be sure to tweak it as needed.&lt;/p&gt;

&lt;p&gt;Oh, and be sure to import &lt;a href="https://grafana.com/grafana/dashboards/11074"&gt;this dashboard&lt;/a&gt; once you start playing with your data. It's pretty well done.&lt;/p&gt;

&lt;h1&gt;
  
  
  What About Alerting?
&lt;/h1&gt;

&lt;p&gt;I'm not going to look at the alerting section for now, but given that this will be a series remember to tune in and check for updates. Better yet, subscribe :)&lt;/p&gt;

&lt;p&gt;Alright, that's it for now.&lt;/p&gt;

</description>
      <category>prometheus</category>
      <category>rapberrypi</category>
      <category>monitoring</category>
      <category>grafana</category>
    </item>
    <item>
      <title>Docker: permission denied while trying to connect to the Docker daemon socket</title>
      <dc:creator>Daniele Salatti</dc:creator>
      <pubDate>Sun, 23 Aug 2020 16:19:02 +0000</pubDate>
      <link>https://dev.to/danielesalatti/docker-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket-1dee</link>
      <guid>https://dev.to/danielesalatti/docker-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket-1dee</guid>
      <description>&lt;p&gt;This is mostly a memo for myself since I'm sure I'll stumble onto this in the future as well, but I figured it might be useful for others as well.&lt;/p&gt;

&lt;p&gt;If you try to run a docker command you may get an error like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create?name=prom_empty: dial unix /var/run/docker.sock: connect: permission denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is probably because your user is not in the docker group.&lt;/p&gt;

&lt;p&gt;To fix this, simply create the group and add yourself to it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo groupadd docker
$ sudo usermod -aG docker $USER
$ newgrp docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you installed Docker using &lt;code&gt;snap&lt;/code&gt;, i.e. with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo snap install docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you will need a couple additional steps:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo snap disable docker
$ sudo snap enable docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Log out and back in again, then test your Docker installation by running the hello-world image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:7f0a9f93b4aa3022c3a4c147a449bf11e0941a1fd0bf4a8e6c9408b2600777c5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;More details and useful post-install resources &lt;a href="https://docs.docker.com/engine/install/linux-postinstall/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Alright, that was it.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ubuntu</category>
    </item>
  </channel>
</rss>
