- 1. Componentes de Hardware
- 2. Componentes de Software
- 3. Instalación de DietPI
- 4. Config Inicial
- 4.1. Actualización
- 4.2. Neovim
- 4.3. Git
- 4.4. Configuración de las Fuentes de Terminal
- 4.5. SSH
- 4.6. Banners
- 4.7. Avahi
- 4.8. Compilador de C
- 4.9. Creando Usuario Elixir
- 4.10. Instalar ZSH
- 4.11. Instalar Exa
- 4.12. Instalar Starship
- 4.13. Instalar asdf
- 4.14. Instalar Elixir
- 4.15. Instalar Phoenix
- 4.16. Instalar Rust
- 4.17. Instalar ZelliJ
- 4.18. Instalar GitUI
- 4.19. Actualizar Neovim
- 4.20. Instalar Docker
Un simple proyecto para documentar la configuración del ambiente para desarrollo con Elixir en una Raspberry Pi 4.
También servirá en su mayoria para cualquier Debian 11.
La idea es tener un entorno minimalista pero bonito, que tenga todas las herramientas necesarias para desarrollar proyectos con Elixir. Buscando una estética Synthwave/Cyberpunk.
El objetivo es tener un entorno que se pueda usar con el teclado lo más posible, evitando el uso de ratón (solo para uso en el navegador).
Escrito por Camilo Castro y colaboradores. Para Elixir Chile.
A menos que se especifique explícitamente, los contenidos de ésta obra están bajo una Licencia Creative Commons Atribución-No-Comercial-Compartir-Igual 4.0 Internacional

-
Rasperry PI 4 Model B 8GB Ram comprada en https://altronics.cl/kit-raspberry-pi4-8gb
-
Tarjeta SD Kingstone 32 GB (KN3-042).
Algunos software que se usarán, algunos son opcionales y mera opinión personal.
-
DietPI https://dietpi.com/ ARMv8 64-bit (https://dietpi.com/downloads/images/DietPi_RPi-ARMv8-Bullseye.7z)
Para comenzar descargaremos la imagen de DietPI y utilizaremos Balena Etcher para grabarla en nuestra tarjeta SD.
La insertamos en nuestra Raspberry y comenzaremos el proceso de instalación. Idealmente siguiendo las guías de instalación y seguridad.
Nuestro editor de cabecera será NeoVim, para instalarlo debemos seguir su manual. Ésto solamente será para tener un editor de texto básico. Luego realizaremos una instalación y configuración más apropiada para la edición de código fuente.
# apt-get install neovimNuestro control de versiones será con GIT. Luego podremos configurarlo apropiadamente. Por ahora nos servirá para descargar algunas herramientas.
# apt-get install gitTambién si se trabaja mucho con Github se puede instalar hub:
# apt install hubLa terminal se verá mejor si se selecciona la fuente TerminusBold de 16x32.
La terminal utiliza fuentes .psf (bitmap) y no permite .ttf (vectorial) ver más.
# dpkg-reconfigure console-setupÉsto sólo aplica si vas a usar la pantalla directamente. Si te conectas por SSH a la raspberry entonces puede no ser necesario. De todas formas se puede configurar para mayor facilidad de lectura en pantallas con alta resolución.
SSH es necesario para acceder remotamente a nuestra máquina. DietPI ofrece dos alternativas. Dropbear y OpenSSH.
Dropbear es una alternativa ligera, pero carece de ciertas características como scp y sftp. Por lo que debemos instalarlas por separado mediante las herramientas de OpenSSH (solo cliente, no servidor).
# apt install openssh-client openssh-sftp-serverOpenSSH es la opción tradicional y más completa.
Se puede instalar mediante:
# dietpi-software install 105o (para Debian 11)
# apt install openssh-serverPodremos verificar su funcionamiento mediante el comando:
# ss -tlpnLo primero que haremos es poner un login screen bien pulento, recordando los viejos tiempos de la BBS. Usaremos el siguiente ANSI:
Obtenido desde https://16colo.rs/pack/rev0902/LD-EMENU.ANS
También usaremos un conversor de CP437 a UTF8
con unos pocos ajustes se debería ver así:
[35m░░▓▌ ▐██▀[37m [1;33m▄▄▄▄▄[0m [35m▀▀███▓▓▓▀▀▀▀▀█▓▀▀▀▀▀▀▀▀█▓▀▀▀▀▀▀▀▀▀▀▀▀▀▀▓▓██▀ █▓▓▓▓██▄ ▐▓░░
▓▓██▄▄▄[1;45m░[0;35m▀▐▌[37m [1;33m▐█[0;33m▀▀[1;43m▀[47m▓▓[43m█[40m▄▄▄[0m [35m▀▀▀[37m [1;33;47m▓▓[43m█[0m [35m██[37m [1;33;47m▓[43m█[40m▌[43m█[47m▓[40m▄[0;35m▀[37m [1;33m▄[43m██[40m▐[47m▓[43m█[0m [1;33;43m█[47m▓[43m▓▓█[40m▄▄[0m [35m▀[1m▒[0;35m▄▄█▀ ▐██▓▓██▓▓[37m[0m
[35m ▐██[1;45m░[0;35m▄▄[1;45m▓░[0;35m▓▄[37m [33m [1m▀▀[0m [33m▐[1;43m█▓▓[40m▀▀▀[43m███▓[0;33m [1;43m▓▓▒[0m [35m▓█░[33m [1m▐[43m▓▓[0m [1;33m▀[43m█▓[40m▄[47m▓▓[40m▀[0m [1;33m▐[43m▓▓[0m [1;33;43m▓▓▒[0m [1;33m▀▀[47m▓[43m█[40m▌[0;35m▐███▄ ▄███[1;45m░░░[0;35m███[37m[0m
[35m▄▄█▌▄██[1;45m░░░[0;35m███▄▄▌[37m [33m▐[1;43m▓▒[0;33m▌[37m [35m ▄[37m [33m▐[1;43m▒▒[0;33m▌[35m▐█[1m▒[0;35m▌[33m ▐[1;43m▒▒[0m [33m▄[1;43m░▓▓[40m▄[0m [35m [1;33;43m░▒[40m▌[0m [1;33m▐[43m▒▒[0;33m▄▄[1;43m▒▓[40m▀[0;33m [35m▓█▀▄▓████[1;45m░░▓▓▓░[0;35m██
[1;45m░░[0;35m██▀[37m [33m▄▄▄▄▄[37m [35m▀██[37m [33m█[1;43m░[0;33m█▀▀▀▀[35m▄▓░[37m [33m▓[1;43m░░[0;33m▌[35m▀ [33m▄▄▄▓[1;43m░░[0;33m▄█[1;43m░[0;33m▀[37m [33m▀[1;43m░░[0;33m▄[1;43m░░[0;33m▓[37m [33m▐[1;43m░░[0;33m▓[1;43m░░[0;33m▄▄[37m [35m▀██▀▀[37m [33m▄▄▄▄▄[37m [35m▀[1;45m░[0;35m█[1m▒[0;35m█[37m[0m
[35m██▓▓[37m [33m▓[1;43m▓▓▀[0;33m▀▀▀▌[35m▐█[37m [33m███[37m [35m▓▀▀[37m [33m▄▄██▌▀▄███▀▀▀███▄[37m [35m▐▄ [37m [33m▀██▌▀▄▓██▌[37m [33m▀▀██▄[37m [35m░[37m [33m▐▀▀▀[1;43m▀▓▓[0;33m▓[37m [35m███▓[37m[0m
[35m▀[37m [33m▄[37m [35m [33m█[1;43m▒▒[0;33m [37m [35m▄▄▐▓░[37m [33m▐[1;43m░░[0;33m▓▄▄███▀▀▐█[1;43m [0;33m▀[37m[3C[33m▄▄ ▀██▓ [35m▓█[37m[3C[33m▀▀███▀▀[35m ▓▌[37m [33m [1;43m░░[0;33m█[37m [35m▓▄▄[37m [33m [1;43m▒▒[0;33m█[37m [33m▄[37m [35m░[37m[0m
[1;33;43m▄[0;33m▌[35m░[37m [33m▐[1;43m░░[0;33m▌[37m [35m▐[1m▒[0;35m███▌ [33m▀███▀▀▄▄███[1;43m░░[0;33m▄ [35m░[33m [1;43m░[0;33m▌ ▀[37m [33m▐█[1;43m░[0;33m▌[35m░[37m [33m▄▄███[1;43m░░[0;33m▄▄[35m ▀▀ [1;33m▐[43m▓░[0;33m▌[35m▐██▌[33m ▐[1;43m░░[0;33m▌[35m░[37m [33m▐[1;43m░[0m
[1;33;43m▓▌[0;33m▄▄▄▀██▄▄▄[37m [35m▀▀▀[37m [33m▄▄▄█[1;43m░░[0;33m▀▀[37m[4C[33m▀[1;43m░▓[0;33m ▀█▄▄▄[1;43m░░[0;33m▀ ▄█▀▀[37m[5C[33m▀▀███▄▄▄[1;43m░░[0;33m█[37m [35m▀[37m [33m▄▄▄█[1;43m░[0;33m▀▄▄▄[1;43m░▓[0m
[1;33;43m▒▒[0;33m▀▀▀█[1;43m░░[0;33m▀▀▓▓▓█▓███▀▀▀[37m[9C[33m▐[1;43m░[0;33m [37m [33m▀▀▀▀ █▌[37m[11C[33m▀▀▀██████▓▓▀▀██▓▀▀▀[1;43m░▒[0m
[33m▐[1;43m░[0;33m▌ [35m▄[33m ▀▌ [37m[3C[33m [37m[3C[33m ▐▄▄▀ [35m [33m ▀▄▄▀ [37m[6C[33m▐▀[37m [35m▄ [33m▐[1;43m░[0;33m▌[37m[0m
[33m█[1;43m░[0;33m▌ [35m▓▄[33m [37m[61C[35m▄█ [37m [33m█[1;43m░[0;33m [37m[0m
[33m░[37m [33m █▓▌ [35m▀[33m [37m[4C[33m [37m [9C[33m [37m [5C[33m [37m [35m▀[37m [33m█▓ ░[37m[0m
[33m [37m [33m▐█▓▌[37m[6C[33m [37m [6C[33m [37m [9C[33m [37m [7C[33m ▐█▌[37m[0m
[33m▐▄▄██▀[37m[7C[33m [37m [33m [37m [8C[33m [37m [4C[33m ▓█▄▄▌[37m[0m
[33m▀▀[37m[9C[33m [37m [11C[33m [37m [35mELIXIR Pi [4C[33m [37m [9C[33m [37m[3C[33m▀▀Mayor info sobre los códigos de terminal acá:
Para mayor información sobre la configuración de los banners podemos leer la documentación de DietPi al respecto.
Para configurarlo simplemente debemos editar el archivo /etc/issue.
Aunque no se verá muy bien debido a las limitaciones de caracteres de la terminal tradicional.
# vim /etc/issueSi queremos ver como queda solo necesitamos aplicar el comando cat:
# cat /etc/issueSi nos conectamos por SSH también podemos poner un banner de bienvenida.
Podemos ir a la línea 331 de /boot/dietpi/func/dietpi-banner
y agregar lo siguiente:
# Elixir Header
cat /etc/issue....
#/////////////////////////////////////////////////////////////////////////////////////
# Main Loop
#/////////////////////////////////////////////////////////////////////////////////////
# Elixir Header
cat /etc/issue
if (( $INPUT == 0 ))
then
Print_Header
Print_Local_Ip
....Si ejecutamos
# dietpi-bannerpodremos configurar otras opciones del banner.
Adicionalmente si editamos el archivo /boot/dietpi/.dietpi-banner
podremos configurar los colores.
# vim /boot/dietpi/.dietpi-bannerModificando el Color 0 que es de las líneas por un hermoso magenta elixir:
aCOLOUR[0]='\e[35m'Ahora también podremos editar el mensaje que aparece al inicio
modificando el archivo /etc/motd y eliminando el mensaje sobre Debian que aparece.
Avahi nos permite conectarnos a través del servicio Bonjour.
Si tienes un dispositivo con MacOS podrás ingresar simplemente usando raspberrypi.local en ves de la ip
del dispositivo.
Para configurar este dominio especial debemos ejecutar:
# apt-get install avahi-daemonTambién si se desea cambiar raspberrypi por otra cosa, se debe cambiar /etc/hostname
en este caso lo llamamos elixir. Puedes reiniciar el dispositivo después de configurar esto.
Si se cambia el hostname, se debe asegurar de que esté dentro del loopback dentro del archivo
/etc/hosts. Para evitar que salga el error sudo: unable to resolve host.
Verificar que el contenido sea similar al siguiente:
127.0.0.1 localhost
127.0.1.1 elixir
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allroutersC es un lenguaje impresindible para la creación de herramientas y otras utilidades. Podemos instalar todas las dependencias necesarias con:
# apt -y install gcc g++ make automakePara tener acceso a los puertos GPIO se debe instalar algunas bibliotecas adicionales. Los puertos GPIO son útiles por ejemplo, para usar un pequeño parlante para emitir sonidos desde los pines de GPIO. Se puede ver el Proyecto Raspberry PI RTTTL para más detalles.
Hay algunos proyectos para interactuar desde C a los puertos GPIO:
Se debería añadir el usuario al grupo gpio.
$ sudo usermod -aG gpio elixirSi se prefiere usar python se puede instalar las dependencias:
$ sudo apt install python3-rpi.gpioPara tener un sistema más seguro es necesario evitar logins con los usuarios root o dietpi,
para esto crearemos un nuevo usuario llamado elixir con privilegios de super usuario.
# useradd -mk /etc/skel -s /bin/bash elixir
# passwd elixir
# usermod -aG sudo elixirEvitamos logins con dietpi
# usermod -L dietpiEs recomendable mantener la capacidad de hacer login con root
si tenemos acceso local, para cualquier eventualidad. Asi que solamente debemos desactivar el acceso de root por ssh.
De forma predeterminada el servidor de ssh de dietpi es Dropbear. Si usas eliminamos el acceso a root por ssh[OpenSSH puedes ver ésta guía.
Ahora realizaremos toda la configuración restante utilizando el usuario elixir.
$ ssh elixir@elixir.localPrimero instalamos zsh y la convertimos en la terminal predeterminada.
$ sudo apt install zsh
$ chsh -s $(which zsh)Luego instalamos Ohmyz.sh
$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"Ahora editamos .zshrc para añadir los comandos de Dietpi.
export PATH=$HOME/bin:/usr/local/bin:/usr/bin:/boot/dietpi:/boot/dietpi/func:/bin:/usr/sbin:/sbin:$PATH
# Añadir al final del archivo
/boot/dietpi/dietpi-loginexa es una mejora al comando ls, le agrega color y otras funcionalidades modernas.
# apt-get install exaPara poder ejecutarlo podemos utilizar exa -lag --header y aplicar un alias para reemplazar ls.
Modificar .bashrc o .zshrc según corresponda para cada usuario en su $HOME.
alias ls='exa -lag --header --icons'Para fish se deberían configurar las abreviaciones.
Es un command prompt muy bueno y es compatible con bash, zsh y fish. para instalarlo solo debemos seguir su guía de instalación.
# curl -sS https://starship.rs/install.sh | shbash
Añadir al final de ~/.bashrc:
eval "$(starship init bash)"zsh
Añadir al final de ~/.zshrc:
eval "$(starship init zsh)"fish
Añadir al final de ~/.config/fish/config.fish:
starship init fish | sourceasdf es un gestor de versiones útil para instalar elixir y nodejs, entre otros.
$ sudo apt install curl
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2Añadimos las configuraciones al final de .zshrc
# asdf
. $HOME/.asdf/asdf.sh
fpath=(${ASDF_DIR}/completions $fpath)
autoload -Uz compinit && compinitLo primero que debemos hacer es instalar las dependencias para Erlang y Elixir.
$ sudo apt-get -y install build-essential autoconf m4 libncurses5-dev libwxgtk3.0-gtk3-dev libwxgtk-webview3.0-gtk3-dev libgl1-mesa-dev libglu1-mesa-dev libpng-dev libssh-dev unixodbc-dev xsltproc fop libxml2-utils libncurses-dev openjdk-11-jdkAgregamos Erlang:
$ asdf plugin add erlang https://github.com/asdf-vm/asdf-erlang.git
$ asdf list all erlangBuscamos la versión que queremos y la instalamos.
En este caso sería la 25.0.4
$ asdf install erlang 25.0.4Agregamos Elixir:
$ asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
$ asdf list all elixirBuscamos la versión y la instalamos.
En este caso sería la 1.13.4-otp-25
Tenemos que tener la otp correspondiente a la versión de erlang que instalamos.
$ asdf install elixir 1.13.4-otp-25Ahora definimos la versión global
$ asdf global erlang 25.0.4
$ asdf global elixir 1.13.4-otp-25Ahora si ejecutamos elixir -v
nos debería arrojar algo similar a:
Erlang/OTP 25 [erts-13.0.4] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]
Elixir 1.13.4 (compiled with Erlang/OTP 25)Phoenix es el framework de desarrollo web por excelencia de Elixir. Para instalarlo podemos seguir su guía.
$ sudo apt-get install inotify-tools
$ mix local.hex
$ mix local.rebar --force
$ mix archive.install hex phx_newPostgreSQL es la base de datos recomendada para proyectos con Phoenix. En este caso se ha instalado la versión 13.
$ sudo apt install postgresql postgresql-contribLe añadimos la contraseña postgres al usuario postgres:
$ sudo passwd postgres
$ sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'postgres';"
$ sudo /etc/init.d/postgresql restartPara saber el estado del servidor de PostgreSQL:
$ sudo systemctl status postgresqlPara iniciar el servidor o detener de PostgreSQL:
$ sudo systemctl start postgresql
$ sudo systemctl stop postgresql
$ sudo /etc/init.d/postgresql restartPara más opciones de configuración se puede ver la documentación:
-
Archivos de configuración:
/etc/postgresql/[version]/[cluster]/ -
Binarios:
/usr/lib/postgresql/[version] -
Archivos de datos:
/var/lib/postgresql/[version]/[cluster]
NodeJS es utilizado para compilar los assets de Phoenix. Por lo que necesitamos instalarlo también
utilizando asdf. Usaremos tanto la version lts como latest.
$ sudo apt -y install gnupg
$ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
$ asdf list all nodejs
$ asdf install nodejs lts
$ asdf install nodejs latest
$ asdf global nodejs latestVerificamos que funcione con:
$ node -v
v18.7.0Para probar que esta correctamente ejecutándose crearemos un nuevo proyecto de Phoenix.
$ mix phx.new prueba
$ cd prueba
$ mix ecto.createVeríamos un mensaje similar a:
The database for Prueba.Repo has been createdAhora ejecutamos los assets
$ mix assets.deployY mostraría un mensaje como:
Check your digested files at "priv/static"Ahora debemos modificar el archivo config/dev.exs para permitir
acceso a otras ips usando [ip: {0, 0, 0, 0}, port: 4000].
config :prueba, PruebaWeb.Endpoint,
# Binding to loopback ipv4 address prevents access from other machines.
# Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
http: [ip: {0, 0, 0, 0}, port: 4000],Finalmente podemos probar ejecutar el servidor con:
mix phx.serverAhora podremos ver el resultado dentro del navegador.
Rust es un lenguaje de programación de bajo nivel muy popular y muchas herramientas están escritas con este lenguaje. Además es un gran amigo de Elixir para crear bibliotecas que requieran acceso de bajo nivel.
Como solamente lo necesitaremos para compilar algunas herramientas,
podemos usar asdf. Pero si se requiere algo más personalizado
se puede usar https://rustup.rs/.
$ asdf plugin add rust https://github.com/asdf-community/asdf-rust.git
$ asdf install rust 1.63.0
$ asdf global rust 1.63.0Verificamos que esté instalado:
$ cargo --version
cargo 1.63.0 (fd9c4297c 2022-07-01)
$ rustc --version
rustc 1.63.0 (4b91a6ea7 2022-08-08)Ahora incluimos los binarios al $PATH
$ vim ~./zshrcEn la última línea:
export PATH=/home/elixir/.cargo/bin:$PATHRecargamos el archivo
$ source ~/.zshrcZelliJ es un multiplexor de terminal, similar a Tmux. Pero escrito en Rust. Nos da la posibilidad de separar la terminal en múltiples pestañas, para mayor comodidad.
$ cargo install --locked zellijUna vez compilado, configuramos:
$ mkdir ~/.config/zellij
$ zellij setup --dump-config > ~/.config/zellij/config.yamlPodemos configurar varias opciones, pero solamente seleccionaremos un tema:
# Choose the theme that is specified in the themes section.
# For some examples, see: https://github.com/zellij-org/zellij/tree/main/example/themes
# Default: default
theme: tokyo-nightLo guardamos en
$ mkdir ~/.config/zellij/themes
$ vim ~/.config/zellij/themes/tokyo-night.yaml# TokyoNight Theme
# https://github.com/zellij-org/zellij/blob/main/example/themes/tokyo-night.yaml
# Originally by https://github.com/enkia/tokyo-night-vscode-theme
themes:
tokyo-night:
fg: [169,177,214] #A9B1D6
bg: [26,27,38] #1A1B26
black: [56,62,90] #383E5A
red: [249,51,87] #F9334D
green: [158,206,106] #9ECE6A
yellow: [224,175,104] #E0AF68
blue: [122,162,247] #7AA2F7
magenta: [187,154,247] #BB9AF7
cyan: [42,195,222] #2AC3DE
white: [192,202,245] #C0CAF5
orange: [255,158,100] #FF9E64GitUI es una aplicación de terminal que permite manejar más simplemente los repositorios git.
Para instalarla simplemente usamos el comando:
$ cargo install gituiTambién podemos configurar sus colores creando un archivo llamado
~/.config/gitui/theme.ron
El problema de Neovim que instalamos previamente es que utiliza una versión antigüa de Neovim (0.4), la cual no funciona bien con algunos plugins de elixir que usaremos. Necesitamos una versión 0.5 o superior.
Compilaremos la última versión de Neovim desde la rama master. Es necesario debido a que las versiones stable y nightly están precompiladas y no son compatibles con la Raspberry Pi.
Primero instalamos las dependencias.
$ sudo apt-get install -y \
autoconf \
automake \
cmake \
g++ \
gettext \
libncurses5-dev \
libtool \
libtool-bin \
libunibilium-dev \
libunibilium4 \
ninja-build \
pkg-config \
python3-pip \
software-properties-common \
unzipSegundo habilitamos los plugins de python para neovim
$ pip3 install setuptools && pip3 install --upgrade pynvimTercero agregamos el plugin de neovim para asdf.
$ asdf plugin add neovim
$ asdf install neovim ref:masterUna vez compilado verificamos que este disponible el binario
$ asdf which nvim
/home/elixir/.asdf/installs/neovim/ref-master/bin/nvim
$ nvim --version
NVIM v0.8.0-dev-109-g7e7a1fa
Build type: RelWithDebInfoFinalmente crearemos un alias para usarlo y actualizarlo más facilmente.
Editamos el archivo ~/.zshrc.
$ nvim ~/.zshrcAñadimos al final.
alias vim=nvim
alias update-nvim-master='asdf uninstall neovim ref:master && asdf install neovim ref:master'
export EDITOR=nvimY actualizamos
$ source ~/.zshrcDocker es la herramienta principal para trabajar con contenedores y Dev Containers.
Para poder instalarlo vamos a realizar lo siguiente:
Instalamos las dependencias de Docker:
$ sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -yIncluimos las llaves GPG de Docker:
$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgAñadimos los repositorios de Docker:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/nullInstalamos Docker:
$ sudo apt update && sudo apt -y install docker-ce docker-ce-cli containerd.ioVerificamos que este instalado y ejecutándose:
$ sudo docker version && sudo systemctl status dockerSi por alguna razón no está ejecutándose, se puede usar:
$ sudo systemctl start dockerAgregamos al usuario elixir al grupo docker, para no necesitar sudo:
$ sudo usermod -aG docker elixirReiniciamos la sesión (log off y luego log in) para que se implementen los permisos.
Verificamos que todo esté en orden con:
$ docker run hello-world



