Instalar Docker en Ubuntu Server usando docker.io

 

Tutorial: Instalar Docker en Ubuntu Server usando docker.io

Tutorial completo con docker.io

Paso 1: Actualizar el sistema

bash
sudo apt update
sudo apt upgrade -y

Paso 2: Instalar Docker desde los repositorios de Ubuntu

bash
sudo apt install docker.io

Paso 3: Habilitar e iniciar el servicio Docker

bash
# Habilitar Docker para que inicie automáticamente
sudo systemctl enable docker

# Iniciar el servicio Docker
sudo systemctl start docker

# Verificar que el servicio está corriendo
sudo systemctl status docker

Paso 4: Configurar permisos de usuario

Verificar si el grupo docker existe

bash
sudo grep docker /etc/group

Agregar tu usuario al grupo docker

bash
sudo usermod -aG docker $USER

Aplicar los cambios de grupo inmediatamente

bash
newgrp docker

Paso 5: Verificar la instalación

bash
# Verificar versión de Docker
docker --version

# Probar Docker con un contenedor de prueba
docker run hello-world

Comprobación final

Verificar que todo funciona sin sudo

docker ps es uno de los comandos más importantes y útiles en Docker. Sirve para listar contenedores y ver su estado.
# Solo muestra contenedores en ejecución
docker ps es como el "Administrador de tareas" de Docker - te permite monitorear y gestionar el estado de todos tus contenedores.
bash
# Estos comandos deberían funcionar SIN sudo
docker ps
docker images
docker --version

3. Ver contenedores detenidos (para debugging)

bash
docker ps -a
# Muestra todos, incluso los que fallaron

Si ves esto, ¡todo está correcto!

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

💡 Puntos clave

  • De una IMAGEN puedes crear múltiples CONTENEDORES

  • La imagen es el blueprint, el contenedor es la instancia viva

  • Si borras un contenedor, la imagen sigue existiendo

  • Si borras la imagen, no puedes crear más contenedores de ella

¿Lo ves así? ¡Es como tener una receta de pizza (imagen) y poder hacer múltiples pizzas (contenedores) from esa misma receta!

Comandos útiles para gestionar Docker

Gestionar contenedores

bash
# Ver contenedores en ejecución
docker ps

# Ver todos los contenedores
docker ps -a

# Detener un contenedor
docker stop <nombre-contenedor>

# Eliminar un contenedor
docker rm <nombre-contenedor>

docker ps -a
docker images

Gestionar imágenes

bash
# Listar imágenes descargadas
docker images

# Descargar una imagen
docker pull ubuntu:20.04

# Eliminar una imagen
docker rmi <nombre-imagen>

Gestionar el servicio Docker

bash
# Ver estado del servicio
sudo systemctl status docker

# Reiniciar Docker
sudo systemctl restart docker

# Detener Docker
sudo systemctl stop docker

Instalar Docker Compose (opcional)

Método con el paquete de Ubuntu

bash
sudo apt install docker-compose

Verificar instalación

bash
docker-compose --version

Solución de problemas

Si newgrp no funciona:

  1. Cierra la sesión completamente y vuelve a entrar

  2. O abre una nueva terminal

Si aún pide contraseña:

bash
# Verificar que estás en el grupo docker
groups $USER

# Si no aparece "docker", repetir el paso de agregar al grupo
sudo usermod -aG docker $USER

Ver logs de Docker si hay problemas:

bash
sudo journalctl -u docker.service

Ventajas de usar docker.io

  • ✅ Más estable: Probado y mantenido por Ubuntu

  • ✅ Más simple: Un solo comando de instalación

  • ✅ Integrado: Funciona perfectamente con el sistema

  • ✅ Seguro: Versiones estables y probadas


¡Listo!

Ahora tienes Docker instalado y funcionando correctamente. Puedes:

  • Crear y ejecutar contenedores

  • Descargar imágenes desde Docker Hub

  • Desarrollar aplicaciones en contenedores

Recuerda: Con docker.io tienes una versión estable y confiable, perfecta para entornos de producción


¿Qué es newgrp docker?

newgrp docker es un comando que:

  • Actualiza los grupos de tu sesión de terminal actual

  • Aplica los cambios de grupo sin necesidad de cerrar sesión

  • Hace que el grupo docker esté disponible inmediatamente

Sin newgrp: Debes cerrar sesión y volver a entrar
Con newgrp: Los cambios se aplican al instante en la terminal actual


IMAGEN = CLASE (en POO)

CONTENEDOR = OBJETO/INSTANCIA (en POO)


👨‍💻 Analogía correcta con POO

CLASE ↔ IMAGEN

java
// CLASE (define estructura/comportamiento)
public class MiAplicacion {
    private String version = "1.0";
    
    public void start() {
        System.out.println("Aplicación iniciada");
    }
}
dockerfile
# IMAGEN (define estructura/comportamiento)
FROM node:18
WORKDIR /app
COPY package.json .
RUN npm install
CMD ["npm", "start"]

OBJETO ↔ CONTENEDOR

java
// OBJETO (instancia de la clase)
MiAplicacion app1 = new MiAplicacion();
MiAplicacion app2 = new MiAplicacion();
MiAplicacion app3 = new MiAplicacion();
bash
# CONTENEDOR (instancia de la imagen)
docker run -d --name app1 mi-imagen-node
docker run -d --name app2 mi-imagen-node  
docker run -d --name app3 mi-imagen-node

📊 Tabla comparativa POO ↔ Docker

Concepto POOEquivalente DockerEjemplo
ClaseImagenclass MiApp {} ↔ Dockerfile
Objeto/InstanciaContenedornew MiApp() ↔ docker run
Constructordocker runnew MiApp() ↔ docker run imagen
HerenciaFROMextends ↔ FROM base-image
Múltiples instanciasMúltiples contenedoresapp1, app2, app3 ↔ contenedor-1, contenedor-2

🔧 Ejemplo técnico

dockerfile
# CLASE (Image)
FROM python:3.9
COPY app.py .
CMD ["python", "app.py"]
bash
# Construir la CLASE (crear imagen)
docker build -t mi-python-app .

# Crear OBJETOS (contenedores) desde la clase
docker run -d --name app-prod-1 mi-python-app
docker run -d --name app-prod-2 mi-python-app
docker run -d --name app-staging-1 mi-python-app

💡 Características que confirman la analogía

La CLASE/IMAGEN:

  • Define el comportamiento (qué hace)

  • Es el molde/plantilla

  • Existe una vez en memoria

  • Es estática

El OBJETO/CONTENEDOR:

  • Es una instancia específica

  • Tiene estado propio (datos, memoria)

  • Puede tener múltiples de la misma clase

  • Es dinámico (puede cambiar estado)

GESTIONAR IMÁGENES

Listar imágenes

bash
# Ver todas las imágenes descargadas
docker images

# Ver imágenes con más detalles
docker image ls

# Ver sólo los IDs de las imágenes
docker images -q

Descargar imágenes

bash
# Descargar imagen desde Docker Hub
docker pull nginx:latest
docker pull python:3.9-alpine
docker pull mysql:8.0

Eliminar imágenes

bash
# Eliminar una imagen específica
docker rmi nginx:latest

# Eliminar por ID
docker rmi a1b2c3d4e5f6

# Eliminar todas las imágenes no usadas
docker image prune

# Eliminar forzadamente (si está en uso)
docker rmi -f nginx:latest

🐳 GESTIONAR CONTENEDORES

Listar contenedores

bash
# Ver contenedores en ejecución
docker ps

# Ver TODOS los contenedores (incluyendo detenidos)
docker ps -a

# Ver los últimos contenedores creados
docker ps -l

# Ver sólo IDs de contenedores
docker ps -q

Crear contenedores desde imágenes

bash
# Crear y ejecutar contenedor básico
docker run nginx:latest

# Crear en segundo plano (detached)
docker run -d nginx:latest

# Crear con nombre personalizado
docker run -d --name mi-nginx nginx:latest

# Crear mapeando puertos
docker run -d -p 8080:80 --name web nginx:latest

# Crear con variables de entorno
docker run -d -e MYSQL_ROOT_PASSWORD=1234 mysql:8.0

Ejecutar comandos en contenedores

bash
# Ejecutar comando en contenedor running
docker exec mi-nginx ls /etc/nginx

# Abrir terminal interactiva
docker exec -it mi-nginx bash
docker exec -it mi-nginx sh

Gestionar estado de contenedores

bash
# Detener contenedor
docker stop mi-nginx

# Iniciar contenedor detenido
docker start mi-nginx

# Reiniciar contenedor
docker restart mi-nginx

# Pausar contenedor
docker pause mi-nginx

# Reanudar contenedor pausado
docker unpause mi-nginx

Eliminar contenedores

bash
# Eliminar contenedor detenido
docker rm mi-nginx

# Eliminar contenedor aunque esté running
docker rm -f mi-nginx

# Eliminar todos los contenedores detenidos
docker container prune

# Eliminar contenedor automáticamente al detenerse
docker run -d --rm --name temporal nginx:latest

🔍 INSPECCIONAR Y MONITOREAR

Ver logs

bash
# Ver logs de contenedor
docker logs mi-nginx

# Seguir logs en tiempo real
docker logs -f mi-nginx

# Ver últimos N líneas
docker logs --tail 50 mi-nginx

Inspeccionar

bash
# Ver información detallada del contenedor
docker inspect mi-nginx

# Ver información de la imagen
docker image inspect nginx:latest

# Ver procesos ejecutándose en el contenedor
docker top mi-nginx

# Ver estadísticas de uso de recursos
docker stats mi-nginx

🎯 EJEMPLOS PRÁCTICOS COMPLETOS

Flujo completo: Nginx

bash
# 1. Descargar imagen
docker pull nginx:latest

# 2. Crear contenedor
docker run -d -p 8080:80 --name mi-sitio-web nginx:latest

# 3. Verificar que está corriendo
docker ps

# 4. Ver logs
docker logs mi-sitio-web

# 5. Acceder al contenedor
docker exec -it mi-sitio-web bash

# 6. Detener contenedor
docker stop mi-sitio-web

# 7. Eliminar contenedor
docker rm mi-sitio-web

Nginx con página personalizada


# Detener contenedor
docker stop mi-nginx

# Iniciar contenedor detenido
docker start mi-nginx

# Reiniciar contenedor
docker restart mi-nginx

# Pausar contenedor
docker pause mi-nginx

# Reanudar contenedor pausado
docker unpause mi-nginx

# Ver estado del servicio
sudo systemctl status docker

# Reiniciar Docker
sudo systemctl restart docker

# Detener Docker
sudo systemctl stop docker
# Ver contenedores en ejecución
docker ps

# Ver todos los contenedores
docker ps -a

# Detener un contenedor
docker stop <nombre-contenedor>

# Eliminar un contenedor
docker rm <nombre-contenedor>

docker images

ejemplo para usar nano y crear una página web más simple. Aquí está el flujo completo:

bash
# 1. Descargar imagen
docker pull nginx:latest

# 2. Crear directorio para nuestro sitio web
mkdir mi-sitio-web
cd mi-sitio-web

# 3. Crear nuestra página index.html personalizada usando nano
nano index.html

Contenido para pegar en nano:

html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Mi Sitio Simple</title>
</head>
<body>
    <h1>Hola</h1>
</body>
</html>

Para guardar en nano:

  • Presiona Ctrl + O (Guardar)

  • Presiona Enter para confirmar el nombre del archivo

  • Presiona Ctrl + X para salir

Continuamos con los comandos:

bash
# 4. Crear contenedor montando nuestro archivo personalizado
docker run -d -p 8080:80 \
  --name mi-sitio-web \
  -v $(pwd)/index.html:/usr/share/nginx/html/index.html \
  nginx:latest
docker run -d -p 8080:80 --name mi-web -v $(pwd)/index.html:/usr/share/nginx/html/index.html nginx:latest
# 5. Verificar que está corriendo docker ps # 6. Ver logs docker logs mi-sitio-web # 7. Probar el acceso curl http://localhost:8080 # 8. Verificar que el archivo está montado correctamente docker exec -it mi-sitio-web cat /usr/share/nginx/html/index.html # 9. Abrir en navegador # En Linux: # xdg-open http://localhost:8080 # En Mac: # open http://localhost:8080 # En Windows: # start http://localhost:8080 # 10. Cuando quieras detener y eliminar docker stop mi-sitio-web docker rm mi-sitio-web

¿Qué hace exactamente?

  • docker exec -it mi-sitio-web: Ejecuta un comando dentro del contenedor llamado "mi-sitio-web"

  • cat /usr/share/nginx/html/index.html: Muestra el contenido del archivo index.html en la terminal


Versión aún más simple del index.html (si quieres):

html
<h1>Hola</h1>

Para verificar que todo funciona:

  • Ve a http://localhost:8080 en tu navegador

  • Deberías ver solo "Hola" en grande (el h1)

  • O ejecuta curl http://localhost:8080 para ver el HTML desde la terminal

La página web ahora es mucho más simple,


Alternativa: Crear un Dockerfile personalizado

Te ayudo a crear el mismo ejemplo pero usando un Dockerfile. Aquí está el flujo completo:

bash
# 1. Descargar imagen (opcional, se bajará automáticamente al construir)
docker pull nginx:latest

# 2. Crear directorio para nuestro proyecto
mkdir mi-sitio-dockerfile
cd mi-sitio-dockerfile

# 3. Crear nuestra página index.html personalizada usando nano
nano index.html

Contenido para pegar en nano:

html
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Mi Sitio Simple</title>
</head>
<body>
    <h1>Hola</h1>
</body>
</html>

Guardar en nano: Ctrl + O → Enter → Ctrl + X

4. Crear el Dockerfile:

bash
nano Dockerfile

Contenido del Dockerfile:

dockerfile
# Usar la imagen oficial de nginx
FROM nginx:latest

# Copiar nuestro archivo index.html personalizado
COPY index.html /usr/share/nginx/html/index.html

# Exponer el puerto 80
EXPOSE 80

Guardar en nano: Ctrl + O → Enter → Ctrl + X

5. Construir la imagen personalizada:

bash
docker build -t mi-sitio-web-personalizado .

6. Verificar que la imagen se creó:

bash
docker images

7. Ejecutar el contenedor:

bash
docker run -d -p 8080:80 --name mi-sitio-container mi-sitio-web-personalizado

8. Verificar que está corriendo:

bash
docker ps

9. Probar el acceso:

bash
curl http://localhost:8080

10. Ver logs:

bash
docker logs mi-sitio-container

11. Verificar el contenido dentro del contenedor:

bash
docker exec -it mi-sitio-container cat /usr/share/nginx/html/index.html

12. Abrir en navegador:

bash
# En Linux:
xdg-open http://localhost:8080

# En Mac:
open http://localhost:8080

# En Windows:
start http://localhost:8080

13. Cuando quieras detener y eliminar:

bash
docker stop mi-sitio-container
docker rm mi-sitio-container

# Opcional: eliminar la imagen también
docker rmi mi-sitio-web-personalizado

Ventajas de usar Dockerfile:

  • ✅ La imagen incluye tu contenido personalizado

  • ✅ No necesitas montar volúmenes

  • ✅ Más portable y fácil de distribuir

  • ✅ Versionable con Git

Para hacer cambios:

  1. Edita el index.html con nano

  2. Reconstruye la imagen: docker build -t mi-sitio-web-personalizado .

  3. Elimina el contenedor viejo y crea uno nuevo

Comandos útiles adicionales

bash
# Ver el contenido del archivo montado en el contenedor
docker exec mi-sitio-web cat /usr/share/nginx/html/index.html

# Ver configuración de nginx
docker exec mi-sitio-web cat /etc/nginx/nginx.conf

# Reiniciar el contenedor
docker restart mi-sitio-web

# Ver uso de recursos
docker stats mi-sitio-web

# Copiar archivos desde el contenedor
docker cp mi-sitio-web:/etc/nginx/nginx.conf ./nginx-backup.conf

Ahora tu sitio web mostrará "¡Hola desde mi sitio web!" con la hora actual actualizándose en tiempo real cuando accedas a http://localhost:8080 


Flujo completo: MySQL

bash
# 1. Crear contenedor MySQL con variables de entorno
docker run -d \
  --name mi-mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -e MYSQL_DATABASE=mi_app \
  -p 3306:3306 \
  mysql:8.0

# 2. Conectarse a MySQL
docker exec -it mi-mysql mysql -u root -p

# 3. Limpiar todo
docker stop mi-mysql && docker rm mi-mysql

💡 TIPS IMPORTANTES

bash
# Ver ayuda de cualquier comando
docker --help
docker run --help
docker ps --help

# Limpiar sistema Docker (elimina contenedores, imágenes, redes no usadas)
docker system prune

# Ver espacio usado por Docker
docker system df

Comentarios

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Tutorial de Carpetas y Directorios en Ubuntu Linux