Corregir error ‘permission denied’ en linux al intentar ejecutar Docker sin sudo

Para este post se asume que ya has instalado Docker satisfactoriamente

Al instalar Docker Community Edition o Docker-CE, te darás cuenta que al intentar ejecutar el comando docker en tu terminal te aparece un error parecido este:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.38/containers/json: dial unix /var/run/docker.sock: connect: permission denied

Como puedes leer esto se debe a que tu usuario, el usuario con el cual estas intentando ejecutar el comando, no posee los permisos para hacerlo.

Solución

1.- Crea un grupo de nombre docker

$ sudo groupadd docker

2.- Agrega a tu usuario al grupo anteriormente creado

$ sudo usermod -aG docker $USER

3.- Cierra sesión con tu usuario y vuelve a iniciarla para que el nuevo grupo puede ser cargado en la información de tu usuario

  • Si estás en una maquina virtual puede que sea necesario que la reinicies
  • Si estás en un escritorio gráfico tipo x-windows es probable que necesites salir y volver a entrar para que los cambios tomen efecto

4.- Comprueba que puedas usar docker sin sudo

$ docker run hello-world

El comando anterior descarga una imagen de prueba y corre un contenedor a partir de ella. Al correr este contenedor muestra una serie de mensajes informativos y luego termina.

Si ya habías usado sudo anteriormente

Si habías ejecutado el comando docker con sudo antes de agregar tu usuario al grupo docker como fue indicado arriba, podrías ver el siguiente error:

WARNING: Error loading config file: /home/user/.docker/config.json - stat /home/user/.docker/config.json: permission denied

el cual indica que el directorio ~/.docker/ fue creado con permisos equivocados por el uso de sudo.

Para solucionar esto tienes dos alternativas:

  1. Puedes remover todo el directorio ~/.docker/. La próxima oportunidad que ejecutes el domando docker creará el directorio automáticamente con una configuración por defecto, esto evidentemente eliminará las configuraciones anteriormente almacenadas.
  2. Puedes cambiar el propietario y permisos del directorio~/.docker/ con los siguientes comandos:
$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "/home/$USER/.docker" -R

 

Fuente: docs.docker.com

Una historia sin final

Toda historia tiene una comienzo
pero a veces este no permite
tan fácilmente ser hallado,
se esconde entre recuerdos
que fueron en otro tiempo
como más relevantes priorizados,
pero, ¿qué culpa habríamos de achacarnos?
lo imprevisible, no hay manera de que sea anticipado.

Aun en la actualidad
habiéndolo vivido
no resulta sencillo
dar fe de lo ocurrido.

La normalidad y la cotidianidad se transforman
en una densa nube de virtudes
donde incluso los colores
ven reforzadas sus aptitudes.

Una sonrisa despierta mi aletargada conciencia
y como la tenue luz del sol de la mañana
se cuela por las persianas de la inapetencia
sus ojos como estrellas en una noche oscura
a las cuales puedes encomendar tu camino
y como el reflejo de la luna
que desvanece las sombras
donde esta esparce su brillo.

Haces lo maravilloso cotidiano,
habitas en lo extraordinario y éste te rinde homenaje,
lo sublime no es capaz de contenerte,
junto a ti lo imposible parece una mera expresión del lenguaje
manifestando su propia incapacidad para describirte.

Tan solo desearte parece demasiado egoísta
sería como esconder un hermoso regalo
que el mismo cielo ha permitido
a quienes han sabido apreciarlo.

No, tu mereces libertad
para seguir bendiciendo
a quienes sepan encontrarte,
me gusta dejar volar mi imaginación
pensar en el transcurrir del tiempo a tu lado
soñar es también una forma de vivir
y la más poética que he encontrado.

Todo cambia y a la vez todo sigue siendo igual

Todo cambia, se mueve, se transforma, gana cualidades o las pierde, viene o deja de ser… todo cambia… incluso yo; aunque para ser sincero, siento mayor fascinación por aquellas cosas que incumplen la reglas, las excepciones les dicen.

En mi primer semestre en la universidad, en una de esas materias que imparten para que los estudiantes se adapten al ritmo de la vida universitaria, nos pidieron que buscáramos y recortáramos, de entre un montón de revistas que nos facilitó la profesora, una imagen con la cual nos identificáramos y reflejara nuestras metas a futuro. Me costó bastante conseguir una imagen que cumpliera con los requisitos establecidos, cuando casi todos estaban terminando su trabajo yo seguía buscando, al final encontré esta (creo que estaba en un anuncio publicitario, no lo recuerdo).

NASA-Apollo8-Dec24-Earthrise

Por más que intenté explicar por qué no había escogido algo parecido a mis compañeros o por qué esta imagen para mi era especial, me fue inútil.

Rescato esta historia no para hacerme ver como el joven genio incomprendido, sino porque me resulta agradable darme cuenta que más 10 años después aun me sigue maravillando igual o más que entonces.

Encontrar algo que te guste, te apasione, con lo que te sientas identificado y te permita sentirte cómodo contigo mismo, es al final lo que importa, así otros no puedan entenderlo.

 

Publicación original: en mi cuenta de facebook

Entornos virtuales, ¿qué son? y ¿para que sirven?

A todos nos ha pasado que viendo/leyendo un tutorial de alguna herramienta o framework hemos escuchado/leído al tutor decir, “este archivo sirve para configurar los entornos de la aplicación” o “estas son dependencias para el entorno de desarrollo”, así que lo primero que cabe preguntarse acá es, ¿qué es un entorno?.

Entorno (Enviroment)

Un entorno, dentro del desarrollo software, es el contexto en el cual este se ejecuta, se refiere a sistema operativo, versión del lenguaje de programación, librerías, complementos, permisos de usuario, etc, es decir, todo aquello que requiera la aplicación para su correcto funcionamiento.

Diferentes entornos

Además de lo antes mencionado, las diferentes etapas de la vida del software hacen que no siempre se requiera que este se comporte igual, es decir, si está en desarrollo se querrá que brinde más información sobre los errores que puedan ocurrir (porque en teoría es donde con mayor probabilidad deberían hacerse presentes) que cuando se lo mostremos al cliente (producción).

¿Por qué es una buena practica el uso de manejadores de entornos virtuales?

Bien sea que estés desarrollando en un equipo personal, en un servidor desarrollo dedicado o desplegando la aplicación en un servidor de producción, es probable que te veas con la necesidad de trabajar en varios proyectos. Proyectos que puedan tener requerimientos similares y por ello entrar en conflicto entre si.

Los manejadores de entornos como Virtualenv en Python, NVM de Nodejs, RVM en Ruby, entre otros, permiten aislar la aplicación de la configuración global del lenguaje de programación, y su correspondiente manejador de paquetes (pip, npm, gem), que exista en el sistema operativo. Así puedes tener una versión de una librería para un proyecto, y la misma librería en otro proyecto con otra versión. Y no solo con librerías y paquetes es útil, puedes tener una versión del lenguaje de programación diferente en cada entorno. En fin puedes definir el contexto de tu aplicación con precisión usando estas herramientas.

Entornos virtuales + manejadores de dependencias = Portabilidad

Todo lo antes mencionado se complementa con la capacidad de poder trasportar este entorno de un computador a otro sin mucho o ningún sufrimiento, todos los lenguajes modernos te permiten definir en un archivo las dependencias de tu proyecto.

No confundir los manejadores de dependencias con entornos virtuales, unos pueden usarse sin los otros pues son proyectos independientes. Es una recomendación personal usarlos en conjunto, pero al final dependerá de la naturaleza de tu proyecto.

Solo por mencionar algunos ejemplos:

  • Bundler + RubyGems (Ruby)
  • PIP + Virtualenv (Python)
  • NPM + NVM (Nodejs)

¿Qué otras combinaciones conoces tu? ¿Cuales me recomendarías probar?

Cómo instalar node.js con NVM

NVM o Node Version Manager es como nombre lo indica un manejador de versiones de node, igual que RVM lo es para Ruby o Virtualenv en Python. La idea es poder use poder ejecutar diferentes versiones de node y npm cada uno en un contenedor diferente sin afectar a las otras, asi tener un entorno con paquetes específicos para cada uno de nuestros proyectos.

Instalando

NVM no esta disponible para windows, puedes revisar en el repositorio del proyecto algunas herramientas alternativas

Debes asegurarte tener una versión de c++ en tu computador, para las distribuciones de Linux basadas en Debian funciona si ya tienes instalado el paquete build-essential.

Como indica su repositorio en github podemos instalarlo tenemos 3 alternativas:

1.- cURL, para ello debemos instalarlo con el manejador de paquetes de nuestra sistema operativo.

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash

2.- wget, viene instalado por defecto en las distribuciones mas populares de GNU/Linux

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash

3.- git, clonando el repositorio, para ello debes instalar git en tu computador

git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`

Cómo usar NVM

Para descargar, compilar y instalar

nvm install <version>

donde <version> es el numero de la versión que quieren instalar, así:

nvm install 5.0

NVM permite instalar tantas versiones de node como necesites

Usar node

como ya dije es posible instalar varias versiones de node.js, por lo tanto es necesario especificarle a NVM cual versión queremos usar:

nvm use 5.0

¿Dónde se instala?

Para saber donde se encuentra nuestra instalación de node usamos el comando which:

nvm which <version>

Otros comandos

Listar versiones disponibles para instalar:

nvm ls-remote

Asignar una versión de node por defecto

nvm alias default node

podemos, si queremos, solo correr una versión especifica

nvm run 5.0 --version <script>

donde <script> es algún script que queramos correr con la versión especificada, así:

nvm run 5.0 --versión app.js

también podemos correr un comando especifico de una versión especifica de node, así:

nvm exec 5.0 node app.js

Más que node.js

Con NVM si así lo queremos podemos instalar io.js

nvm install io.js 3.3.1

Como notas es la misma nomenclatura que usamos para instalar node.js con un parámetro adicional “io.js”, de igual forma ocurre con todos los comandos descritos hasta acá.

 

 

Fuente: https://github.com/creationix/nvm

¿Qué es composer?

Ya en un articulo anterior explique cómo instalar composer? pero ¿qué es y para qué sirve?

Como su propia web lo describe, composer es un manejador de dependencias, es decir, todas aquellas clases PHP que hace uso nuestro proyecto y pero no desarrollamos nosotros.

En palabras sencillas

composer-esquema

composer.phar: precompilado ejecutable con el cual interactuamos para instalar, remover y actualizar paquetes.

packagist.org: sitio web y repositorio (sitio desde el cual se descargan los paquetes) principal de composer, nos permite buscar y examinar información de paquetes para usar en nuestro proyecto.

composer.json: archivo de configuración de composer para nuestro proyecto, es donde se especifican los paquetes que necesitamos, se coloca uno por cada proyecto.

Directorio vendor: los paquetes que especificamos en composer.json se descargan en una carpeta de nombre vendor que se coloca al mismo nivel que el archivo composer.json.

vendor/package: cuando intentas instalar un paquetes notarás que su nombre se compone de la estructura palabra1/palabra2, palabra1 es el identificador del autor o también conocido como vendor y palabra2 es el nombre del paquete, ejemplo:

intervention/image

donde intervention es el vendor y image el nombre del paquete. si un autor tiene varios paquetes la primera palabra permanece mientras que la segunda cambiará para cada paquete.

De esta misma forma se descargáramos un paquete por medio del composer, por ejemplo con:

php composer.phar require intervention/image

al terminal el proceso encontraríamos dentro de nuestra carpeta vendor un directorio de nombre intervention y dentro de este otro con el nombre image.

 

Para mayor información sobre las opciones del cli composer.phar recomiendo leer este articulo.

Cómo instalar git en Ubuntu 15.10

Git es la herramienta para versionado de proyectos de software más popular de la actualidad y como es de esperar se encuentra en los repositorios de Ubuntu así como de la mayoría de las distribuciones GNU/Linux.

Instalación

Instalarlo es tan siemple como ir a una terminal y a traves del gestor de paquetes instalar git-core:

~$ sudo aptitude install git-core

para comprobar que se ha instalado correctamente llamamos al comango git con alguna de sus opciones como por ejemplo –version, si reconoce a git como un comando con esta opción nos dirá la versión del mismo:

~$ git --version
git version 2.5.0