Si estás buscando información sobre cómo instalar Docker en Ubuntu, estás en el lugar correcto. No solo eso, sino que como bonificación, este tutorial también te enseñará cómo ejecutar los comandos básicos de Docker para ejecutar y gestionar contenedores.
Utilizando las prácticas funciones de Visual Studio (VS) Code, también aprenderás cómo potenciar tus habilidades de SSH. ¡Empecemos!
Relacionado: Un usuario de Windows en un mundo Linux: VS Code y SSH remoto
Prerrequisitos
Si deseas seguir paso a paso, asegúrate de tener lo siguiente:
- A fresh install of Ubuntu Server LTS with SSH Enabled (This guide will be using Ubuntu Server LTS 20.04.1)
- A Windows Machine with VSCode installed (This guide will be using Visual Studio Code 1.52.1)
- La extensión oficial de SSH de VSCode instalada y conectada a tu instalación de Ubuntu Server LTS
Instalación de Docker en Ubuntu
Comencemos instalando Docker en Ubuntu. En este punto, el tutorial asume que estás en tu computadora local con Windows con VS Code abierto conectado a tu servidor Ubuntu mediante SSH. Aprende cómo configurar este útil entorno en el último artículo sobre cómo usar VS Code y SSH.
En el siguiente ejemplo, VSCode está conectado de forma remota a Ubuntu con la carpeta home (en este caso, /home/homelab) abierta como espacio de trabajo:

El proceso real para instalar Docker en Ubuntu Server está a solo dos comandos de distancia. Ubuntu facilita la disponibilidad de Docker como opción de instalación en el administrador de paquetes predeterminado que se incluye con Ubuntu, conocido como \texttt{apt}[\emph{apt}](https://help.ubuntu.com/community/AptGet/Howto).
En la ventana del terminal SSH de VS Code, ejecuta los siguientes dos comandos para instalar Docker:
Durante la instalación de Ubuntu Server, es posible que se te haya ofrecido la opción de instalar Docker como un \textit{snap}. Si lo has hecho, elimina primero el paquete \textit{snap} ejecutando \texttt{sudo snap remove docker}
Puedes observar la instalación de Docker en la siguiente animación:

Ubuntu es lo suficientemente amable como para habilitar automáticamente el servicio y configurarlo para que se inicie automáticamente al arrancar, ¡así que estás listo para empezar a usar Docker!
Creación y ejecución de un contenedor Docker en Ubuntu
Ahora que tienes Docker instalado, ¿qué puedes hacer con él? Comencemos creando un contenedor Docker. Este tutorial establecerá un servidor web estático como un buen ejemplo de un contenedor Docker. En esta sección, harás lo siguiente:
- Configurar un nuevo contenedor desde el Repositorio de Imágenes del \textit{Docker Hub} para ejecutar un servicio HTTP
- Usar el mapeo de puertos para asignar el puerto HTTP dentro del contenedor a tu host de Ubuntu
- Configurar \textit{Bind Mounts} para asignar datos importantes desde dentro del contenedor a tu host de Ubuntu.
- Configura la persistencia a través de reinicios para tu contenedor
Si alguno de los pasos anteriores suena confuso, no te preocupes, cubriremos cada paso, uno a la vez para ayudarte a entender el proceso.
Descargando la Imagen Docker
La primera pregunta que tienes que hacer es, ¿de dónde vendrá este contenedor? Echemos un vistazo al Docker Hub.
A large part of Docker is understanding image repositories. Rather than being distributed like packages, services in Docker get distributed as Docker Images.
A Docker Image is a snapshot of the software that the publisher wants to distribute and the entire filing system! This is analogous to creating .wim image of Windows.
Esta captura del sistema de archivos hace que Docker sea tan popular: el software se captura junto con todo el entorno operativo. Hacer esto elimina los problemas introducidos por las diferencias entre los entornos de los servidores.
Uno de los repositorios más populares (y el predeterminado) para imágenes es el Docker Hub, también conocido como el repositorio oficial de Docker. El repositorio de imágenes es donde puedes descargar miles de imágenes Docker pre-creadas para ejecutar como contenedores.
Dado que este tutorial está configurando un servidor web estático, necesitas descargar una imagen de servidor web. Los dos servidores web más populares son Apache httpd y Nginx, pero para cambiar un poco las cosas y potencialmente presentarte a un nuevo servidor web, usemos uno llamado Caddy.
Caddy es un servidor web conocido por su simplicidad. Muchas configuraciones de servidores válidas pueden ser desplegadas usando una sola línea en un archivo. Simple es bueno y también hace un buen ejemplo base.
- Primero, necesitarás encontrar la imagen de Docker. En tu máquina con Windows, navega a https://hub.docker.com.
- Realiza una búsqueda de caddy en la esquina superior izquierda de la página. Deberías ver una página similar a la siguiente:

A benefit (and downside) of Docker Hub is that anyone, even you, can create and upload Docker Images to the site.
Debes tener cuidado para asegurarte de que la imagen que elijas provenga de una fuente confiable. Cualquiera puede colocar malware en una imagen si así lo elige y cargar su versión en Docker Hub.
3. Toma nota del nombre de la imagen. En la captura de pantalla anterior, el nombre es caddy exactamente. Necesitarás este nombre para especificar el nombre de la imagen en los próximos pasos.
Ejecutando un Contenedor con Docker en Ubuntu
Una vez que sepas el nombre de la imagen que te gustaría descargar, es hora de descargarla y crear un contenedor a partir de ella.
Iniciar un contenedor desde una imagen requiere un único comando. En tu terminal SSH conectada a tu servidor Ubuntu, ejecuta el siguiente comando docker run
.
El comando a continuación verifica la existencia de la imagen caddy en la máquina local. Si no existe, descarga la imagen desde Docker Hub, crea un contenedor y lo inicia. El comando a continuación está utilizando el interruptor -p
para mapear el puerto de escucha 80 del servidor Ubuntu al puerto 80 del contenedor. Esta característica se llama mapeo de puertos.
La mayoría de las imágenes de Docker Hub siguen una convención de nomenclatura de <usuario>/<nombre de imagen>. Sin embargo, las imágenes marcadas como “oficiales” por Docker no tienen un <usuario> delante de ellas (como caddy arriba).
Ejecutando el comando anterior, se obtiene la siguiente salida, con la información de registro de Caddy mostrada directamente en la terminal:

Es posible que observes que casi todos los comandos de Docker están precedidos por
sudo
, para forzar los comandos a ejecutarse como administrador. Por defecto, el servicio de Docker se ejecuta comoroot
, y todos los cambios que realices en contenedores o imágenes deben hacerse como administrador.
¡Y listo, ya está en marcha! Eso es todo. ¿No te alegra haber instalado Docker en Ubuntu?
Ahora ve a http://<tu-ip> en tu computadora con Windows y deberías ver una página de inicio para Caddy. Puedes verlo a continuación (la IP de esta guía se reemplaza con http://homelab-docker):

El contenedor caddy está en ejecución ahora, pero podrías haber notado un problema. Ejecutar ese comando docker
toma el control de tu línea de comandos. No puedes ejecutar más comandos, y si la sesión termina, el contenedor en ejecución se detiene. Resolvamos ese problema ejecutando el contenedor en segundo plano (también conocido como desconectar el contenedor).
Ejecutar Contenedores Docker en Segundo Plano
Ahora tienes un contenedor en ejecución, pero tu línea de comandos está bloqueada. No puedes hacer nada más. Necesitas una mejor manera de iniciar un contenedor ejecutándolo en segundo plano como un servicio. Para hacerlo:
- Detén el contenedor actual presionando control+c en la línea de comandos. Esto debería devolverte tu línea de comandos.
- Ahora, vuelve a ejecutar el mismo comando que antes solo con el parámetro
-d
esta vez como se muestra a continuación. Verás que Docker devolverá un ID de contenedor y te devolverá la línea de comandos.

Gestión de Contenedores en Segundo Plano con Comandos Docker
Una vez que tengas uno o más Dockers en segundo plano en ejecución, necesitarás gestionarlos de alguna manera. Docker te proporciona algunos comandos diferentes para hacerlo utilizando comandos de docker container
.
sudo docker container list -a
: Lista todos los contenedores (tanto en ejecución como detenidos) y su estadosudo docker container stop <nombre>
: detiene un contenedor de Docker por su nombre (o por su ID)sudo docker container start <nombre>
: inicia un contenedor de Docker por su nombre (o por su ID)sudo docker container prune
: destruye y elimina todos los contenedores detenidos
Puedes ver todos los comandos anteriores utilizados en contexto en la captura de pantalla a continuación:

Existen muchos otros comandos de contenedor de Docker para ver, cambiar, inspeccionar o incluso conectarse de forma remota a contenedores en tu servidor. Puedes verlos todos ejecutando
sudo docker container --help
.
Aunque ahora hayas implementado un servidor web en un contenedor en ejecución en segundo plano, todavía no tienes forma de alojar tu contenido personalizado. Tal como está, Caddy simplemente está sirviendo la página web predeterminada.
Ahora veamos cómo puedes usar imágenes de Docker con un concepto llamado montajes bind para implementar contenedores con datos significativos.
Almacenamiento de Datos del Contenedor con Montajes Bind
Docker trabaja con el concepto de imágenes (y los contenedores que generan) como desechables o transitorios. Si hay una actualización del software Caddy, no actualizas el servicio, desechas todo el contenido y utilizas una imagen completamente nueva desde cero.
Los beneficios de desechar y recrear contenedores de esta manera son significativos. Las inestabilidades en el software se introducen con el tiempo al actualizar continuamente un software (potencialmente) antiguo. Al usar una imagen nueva cada vez, Docker te proporciona una base estable, confiable, (presumiblemente) probada en cada actualización.
Este concepto es equivalente a usar una instalación nueva de Windows cada vez que actualizas tu software de aplicación de Windows. No es una idea divertida en Windows, pero es extremadamente aplicable en Docker.
La metodología desechable tiene un problema claro sin embargo. No deseas que los datos esenciales se eliminen cuando se elimina tu servicio actual. Docker resuelve este problema utilizando un concepto llamado montajes bind.
Ahora veamos cómo crear un montaje bind para un contenedor.
Creación de la Estructura de Carpetas y Limpieza
Antes de poder usar montajes bind, necesitas crear un lugar para que se almacenen estos datos. Este tutorial creará una carpeta en tu directorio de inicio. Para hacerlo en VS Code mientras estás conectado a tu servidor de Ubuntu:
- Haz clic derecho en un área en blanco del panel Explorador de VS Code y elige nueva carpeta.
2. Nombra la nueva carpeta containers/caddy/files.
Los nombres de las carpetas dependen de ti siempre y cuando estén definidos correctamente en el próximo comando de Docker. Al usar una barra diagonal, VS Code interpreta esto como la creación de tres carpetas. La carpeta files es un subdirectorio de caddy, y caddy es un subdirectorio de containers. No es necesario que uses esta estructura de carpetas, pero tiene más sentido cuando tienes varios contenedores en el mismo servidor.
Si no lo has hecho anteriormente, detén y elimina cualquier contenedor que hayas creado previamente con lo siguiente:
Puedes ver este comando en la captura de pantalla a continuación:

Desplegando un Contenedor de Caddy con Montajes de Vínculo
Ahora tienes la estructura de carpetas construida en el Servidor Ubuntu. Es hora de crear un contenedor de Caddy con montajes de vínculo.
- Antes de avanzar demasiado, primero averigua dónde almacena datos persistentes el contenedor con el que estás trabajando. Esa ubicación será diferente dependiendo de quién haya creado la imagen de Docker y para qué propósito sirva.
Tu mejor opción para encontrar dónde se almacenan los datos persistentes es revisar la documentación dentro del Docker Hub para la imagen en cuestión. Para Caddy, puedes encontrar la documentación aquí:

2. Inicia el contenedor utilizando el siguiente comando. El parámetro -v ~/containers/caddy/files:/usr/share/caddy
está mapeando la ruta antes de los dos puntos (~/containers/caddy/files) al directorio dentro del contenedor (/usr/share/caddy). Esto funciona de manera muy similar al comando de mapeo de puertos: excepto que estás mapeando un directorio en lugar de un puerto. Este tipo de comando se llama Bind Mount.
la tilde (
~
) en el código anterior se refiere al directorio de inicio. Para este artículo, eso es equivalente a/home/homelab
.
3. Abre un navegador y vuelve a la dirección http de tu servidor. Notarás que el servidor ahora muestra una página de 404
. Esto es esperado porque actualmente no tienes un archivo index.html en ~/containers/caddy/files.
4. Crea un archivo index.html en ~/containers/caddy/files en el servidor Ubuntu en la ventana del explorador de VS Code que se ve así:
5. Navega a la dirección HTTP de tu servidor y confirma que el contenedor ahora está sirviendo tu nueva página index.html.
Puedes ver todo lo anterior en la siguiente animación:

A diferencia de los comandos de gestión de Docker, los archivos que estás creando (como index.html) no requieren derechos administrativos. Esto se debe a que eres el propietario del contenido que el servidor Caddy está sirviendo, ya que están en tu carpeta de inicio.
Validando el montaje vinculado
¡Excelente! ¡No solo estás utilizando un contenedor Docker completamente nuevo, sino que ese contenedor está sirviendo contenido guardado localmente en tu carpeta de inicio! Puedes comprobar esto ejecutando lo siguiente:
- Detén y elimina el contenedor en ejecución. Este paso elimina completamente todo, incluido ese archivo index.html si no estabas usando montajes vinculados.
2. Crea un contenedor completamente nuevo.
3. Verifica que el nuevo contenedor siga sirviendo el archivo index.html en la dirección http://<tu servidor>
.
Creando Contenedores Docker Persistentes
A container isn’t that useful if it stops when the server reboots. By default, that’s what is going to happen if you don’t make it happen. To prevent this, let’s generate a new caddy container again but this time once that restarts when the Docker host, Ubuntu in this case, restarts.
- Detén y elimina todos los contenedores en ejecución.
2. Reinicia el contenedor de caddy con el parámetro --restart always
, para configurar este nuevo contenedor para que se inicie con el host al reiniciar. Con la bandera --restart always
en su lugar, tu contenedor ahora se comporta como un servicio adecuado: se inicia automáticamente al arrancar.
3. Reinicia el servidor.
4. Ahora verifica que el nuevo contenedor se inicie y siga sirviendo el archivo index.html en la dirección http://<tu servidor>
.
Puedes ver los siguientes comandos aplicados a continuación:

Avanzando
En esta etapa, deberías tener un entorno Docker funcional y una comprensión básica de imágenes y contenedores. Puedes descargar, iniciar, detener y realizar gestiones básicas de tus contenedores. También has creado exitosamente un contenedor de servicio web en ejecución utilizando montajes de enlace y mapeo de puertos.
Todavía hay mucho por cubrir en cuanto a Docker: Mantente atento a este espacio, ya que el próximo artículo abordará la gestión avanzada de Docker utilizando Docker Compose.