Mario Rodríguez - Photo

Mario Rodríguez

Temas y Tips sobre Programación y Tecnología


Cómo crear y subir imágenes Docker a Docker Hub

5 minutos

Introducción

Después de entender qué es Docker Hub, el siguiente paso es completar el recorrido: crear una aplicación pequeña, empaquetarla en una imagen y dejarla disponible para descargarla desde otra máquina.

Si algunos conceptos todavía te resultan nuevos, antes escribí sobre

Docker Hub: Repositorios Públicos y Privados (abre en una pestaña nueva)

y los comandos básicos de Docker (abre en una pestaña nueva) .

Acá voy a recorrer el proceso completo con una API sencilla en Node.js y TypeScript. La aplicación solo tendrá un endpoint, porque lo importante es ver cómo pasa del código a Docker Hub.


1. Crear una aplicación con Node.js y TypeScript

Antes de subir una imagen a Docker Hub, necesitamos una aplicación que podamos empaquetar en un contenedor.
Crearemos una API básica con Node.js y TypeScript que exponga un endpoint /hello .

1. Inicializá el proyecto

mkdir hello-docker-ts
cd hello-docker-ts
npm init -y
      

2. Instalá las dependencias

npm install express
npm install typescript @types/node @types/express ts-node-dev --save-dev
      

3. Configurá TypeScript

Ejecutá el siguiente comando para generar un archivo tsconfig.json :

npx tsc --init
      

Después, dejá el tsconfig.json con esta configuración:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "CommonJS",
    "rootDir": "./src",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}
      

4. Creá la estructura del proyecto

La estructura debería quedar así:

hello-docker-ts/
├── src/
│   └── server.ts    # Código fuente principal
├── dist/            # Generado automáticamente al compilar
├── package.json
├── tsconfig.json
└── node_modules/
      

5. Implementá el servidor

Creá un archivo src/server.ts con este contenido:

import express, { Request, Response } from 'express';

const app = express();

app.get('/hello', (req: Request, res: Response) => {
  res.json({ message: 'Hello, Docker!' });
});

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});
      

6. Configurá el script de inicio

En el archivo package.json , agregá estos scripts:

"scripts": {
  "build": "npx tsc",
  "start": "npm run build && node dist/server.js"
}
      

7. Probá el servidor

Ejecutá:

npm start
      

8. Revisá el código completo

Podés encontrar el proyecto completo en GitHub: hello-docker-ts (abre en una pestaña nueva) .

Si todo salió bien, al visitar http://localhost:3000/hello vas a ver algo como esto:

{
  "message": "Hello, Docker!"
}
      

2. Crear una imagen Docker para la aplicación

1. Creá el Dockerfile

En el directorio del proyecto, creá un archivo llamado Dockerfile con este contenido:

# Imagen base para Node.js
FROM node:18-slim

# Establecemos el directorio de trabajo
WORKDIR /app

# Copiamos los archivos necesarios
COPY package*.json ./
RUN npm install

# Copiamos el resto del código
COPY . ./

# Compilamos el código TypeScript
RUN npm run build

# Exponemos el puerto
EXPOSE 3000

# Comando para ejecutar la aplicación
CMD ["node", "dist/server.js"]
      

2. Construí la imagen

Ejecutá:

docker build -f Dockerfile -t hello-docker-ts .
      

3. Probá la imagen localmente

docker run -p 3000:3000 hello-docker-ts
      

Entrá a http://localhost:3000/hello y comprobá que el contenedor responda.


3. Subir la imagen a Docker Hub

1. Iniciá sesión en Docker Hub

docker login
      

2. Etiquetá la imagen

docker tag hello-docker-ts usuario/hello-docker-ts:1.0
      

3. Subí la imagen

docker push usuario/hello-docker-ts:1.0
      

4. Verificá la imagen en Docker Hub

Entrá a tu cuenta y comprobá que la etiqueta aparezca en el repositorio.


4. Compartir la imagen

1. Repositorios públicos

Si el repositorio es público, cualquier persona puede descargar la imagen con:

docker pull mrodrigueztech/hello-docker-ts:1.0
      

2. Repositorios privados

Si es privado, necesitás conceder acceso desde Docker Hub y la otra persona tendrá que iniciar sesión antes de descargar la imagen.


Conclusión

El ejemplo es pequeño, pero recorre todas las piezas que al principio tenía separadas en mi cabeza: escribir la aplicación, construir una imagen, probar el contenedor, etiquetarlo y subirlo.

Cuando entendés ese recorrido, Docker Hub deja de sentirse como otra herramienta aislada. Es simplemente el lugar desde el que podés distribuir la misma imagen que ya probaste localmente.

Comentarios