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
sudo apt update
sudo apt upgrade -yPaso 2: Instalar Docker desde los repositorios de Ubuntu
sudo apt install docker.ioPaso 3: Habilitar e iniciar el servicio Docker
# 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 dockerPaso 4: Configurar permisos de usuario
Verificar si el grupo docker existe
sudo grep docker /etc/groupAgregar tu usuario al grupo docker
sudo usermod -aG docker $USERAplicar los cambios de grupo inmediatamente
newgrp dockerPaso 5: Verificar la instalación
# Verificar versión de Docker
docker --version
# Probar Docker con un contenedor de prueba
docker run hello-worldComprobació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óndocker ps es como el "Administrador de tareas" de Docker - te permite monitorear y gestionar el estado de todos tus contenedores.# Estos comandos deberían funcionar SIN sudo
docker ps
docker images
docker --version3. Ver contenedores detenidos (para debugging)
docker ps -a
# Muestra todos, incluso los que fallaron
docker ps -a # Muestra todos, incluso los que fallaron
Si ves esto, ¡todo está correcto!
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!
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
Comandos útiles para gestionar Docker
Gestionar contenedores
# 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
# 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
# Ver estado del servicio
sudo systemctl status docker
# Reiniciar Docker
sudo systemctl restart docker
# Detener Docker
sudo systemctl stop dockerMétodo con el paquete de Ubuntu
sudo apt install docker-composeVerificar instalación
docker-compose --versionSolución de problemas
Si newgrp no funciona:
Cierra la sesión completamente y vuelve a entrar
O abre una nueva terminal
Si aún pide contraseña:
# 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 $USERVer logs de Docker si hay problemas:
sudo journalctl -u docker.serviceVentajas 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
dockeresté 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
// CLASE (define estructura/comportamiento)
public class MiAplicacion {
private String version = "1.0";
public void start() {
System.out.println("Aplicación iniciada");
}
}# IMAGEN (define estructura/comportamiento)
FROM node:18
WORKDIR /app
COPY package.json .
RUN npm install
CMD ["npm", "start"]OBJETO ↔ CONTENEDOR
// OBJETO (instancia de la clase)
MiAplicacion app1 = new MiAplicacion();
MiAplicacion app2 = new MiAplicacion();
MiAplicacion app3 = new MiAplicacion();# 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 POO | Equivalente Docker | Ejemplo |
|---|---|---|
| Clase | Imagen | class MiApp {} ↔ Dockerfile |
| Objeto/Instancia | Contenedor | new MiApp() ↔ docker run |
| Constructor | docker run | new MiApp() ↔ docker run imagen |
| Herencia | FROM | extends ↔ FROM base-image |
| Múltiples instancias | Múltiples contenedores | app1, app2, app3 ↔ contenedor-1, contenedor-2 |
🔧 Ejemplo técnico
# CLASE (Image)
FROM python:3.9
COPY app.py .
CMD ["python", "app.py"]# 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
# 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
# Descargar imagen desde Docker Hub docker pull nginx:latest docker pull python:3.9-alpine docker pull mysql:8.0
Eliminar imágenes
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
ejemplo para usar nano y crear una página web más simple. Aquí está el flujo completo:
# 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:
<!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:
# 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
nano y crear una página web más simple. Aquí está el flujo completo:# 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
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Sitio Simple</title> </head> <body> <h1>Hola</h1> </body> </html>
Presiona Ctrl + O (Guardar)
Presiona Enter para confirmar el nombre del archivo
Presiona Ctrl + X para salir
# 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):
<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,
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
<h1>Hola</h1>
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
Alternativa: Crear un Dockerfile personalizado
Te ayudo a crear el mismo ejemplo pero usando un Dockerfile. Aquí está el flujo completo:
# 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:
<!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:
nano DockerfileContenido del 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:
docker build -t mi-sitio-web-personalizado .
6. Verificar que la imagen se creó:
docker images7. Ejecutar el contenedor:
docker run -d -p 8080:80 --name mi-sitio-container mi-sitio-web-personalizado
8. Verificar que está corriendo:
docker ps
9. Probar el acceso:
curl http://localhost:808010. Ver logs:
docker logs mi-sitio-container11. Verificar el contenido dentro del contenedor:
docker exec -it mi-sitio-container cat /usr/share/nginx/html/index.html
12. Abrir en navegador:
# 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:
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:
Edita el index.html con nano
Reconstruye la imagen: docker build -t mi-sitio-web-personalizado .
Elimina el contenedor viejo y crea uno nuevo
# 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
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <title>Mi Sitio Simple</title> </head> <body> <h1>Hola</h1> </body> </html>
Ctrl + O → Enter → Ctrl + Xnano 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
Ctrl + O → Enter → Ctrl + Xdocker build -t mi-sitio-web-personalizado .
docker imagesdocker run -d -p 8080:80 --name mi-sitio-container mi-sitio-web-personalizado
docker ps
curl http://localhost:8080docker logs mi-sitio-containerdocker exec -it mi-sitio-container cat /usr/share/nginx/html/index.html
# En Linux: xdg-open http://localhost:8080 # En Mac: open http://localhost:8080 # En Windows: start http://localhost:8080
docker stop mi-sitio-container docker rm mi-sitio-container # Opcional: eliminar la imagen también docker rmi mi-sitio-web-personalizado
✅ La imagen incluye tu contenido personalizado
✅ No necesitas montar volúmenes
✅ Más portable y fácil de distribuir
✅ Versionable con Git
Edita el index.html con nano
Reconstruye la imagen: docker build -t mi-sitio-web-personalizado .
Elimina el contenedor viejo y crea uno nuevo
Comandos útiles adicionales
# 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
# 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
Flujo completo: MySQL
# 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
# 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
Publicar un comentario