# 1. Docker

### **¿Qué es Docker?** <a href="#undefined" id="undefined"></a>

Docker es una plataforma abierta diseñada para desarrollar, enviar y ejecutar aplicaciones dentro de contenedores. Los contenedores de Docker encapsulan una aplicación junto con todas sus dependencias, asegurando que se ejecute de manera consistente en cualquier entorno, ya sea en desarrollo, pruebas o producción.

> “Docker permite separar tus aplicaciones de la infraestructura, facilitando la entrega rápida y consistente de software.”

### **Ventajas y Características Principales** <a href="#undefined" id="undefined"></a>

* **Portabilidad**: Los contenedores Docker pueden ejecutarse en cualquier sistema que soporte Docker, ya sea un portátil, un servidor físico o en la nube.
* **Ligereza**: A diferencia de las máquinas virtuales, los contenedores comparten el kernel del sistema operativo, lo que reduce el consumo de recursos y acelera el despliegue.
* **Aislamiento**: Cada contenedor funciona en su propio entorno aislado, lo que mejora la seguridad y evita conflictos entre aplicaciones.
* **Escalabilidad**: Docker facilita la gestión y el escalado dinámico de aplicaciones, permitiendo aumentar o reducir servicios según la demanda.
* **Productividad**: Automatiza flujos de trabajo de CI/CD, pruebas y despliegues, acelerando el ciclo de desarrollo.

### **Arquitectura de Docker** <a href="#undefined" id="undefined"></a>

| Componente      | Descripción                                                                        |
| --------------- | ---------------------------------------------------------------------------------- |
| Docker Daemon   | Servicio en segundo plano que gestiona imágenes, contenedores y redes (`dockerd`). |
| Docker Client   | Interfaz de línea de comandos (`docker`) para interactuar con el daemon.           |
| Docker Registry | Almacén de imágenes (por defecto, Docker Hub).                                     |
| Docker Compose  | Herramienta para definir y gestionar aplicaciones multicontenedor.                 |

**Funcionamiento básico:**\
El cliente envía comandos al daemon, que se encarga de construir, ejecutar y gestionar los contenedores. Las imágenes se almacenan y descargan desde registros públicos o privados.

### **Conceptos Clave** <a href="#undefined" id="undefined"></a>

* **Imagen**: Plantilla inmutable que contiene el sistema de archivos y las dependencias necesarias para ejecutar una aplicación.
* **Contenedor**: Instancia en ejecución de una imagen, aislada del resto del sistema.
* **Dockerfile**: Archivo de texto con instrucciones para construir una imagen personalizada.
* **Volumen**: Permite persistir y compartir datos entre contenedores.
* **Redes**: Docker crea redes virtuales para que los contenedores se comuniquen de forma segura.

### **Casos de Uso Comunes** <a href="#undefined" id="undefined"></a>

* **Microservicios**: Facilita la transición de arquitecturas monolíticas a microservicios, permitiendo desplegar cada servicio en su propio contenedor.
* **DevOps y CI/CD**: Automatiza pruebas, integraciones y despliegues, mejorando la colaboración entre equipos.
* **Multi-tenancy**: Permite aislar datos y aplicaciones para diferentes clientes en entornos SaaS.
* **Desarrollo local y pruebas**: Garantiza que los entornos de desarrollo sean idénticos a los de producción, evitando el clásico “en mi máquina funciona”.

### **Primeros Pasos: Comandos Básicos** <a href="#undefined" id="undefined"></a>

{% code title="bash" overflow="wrap" %}

```bash
# Descargar una imagen
docker pull nginx

# Ejecutar un contenedor
docker run -d -p 80:80 nginx

# Listar contenedores en ejecución
docker ps

# Detener un contenedor
docker stop <container_id>

# Eliminar un contenedor
docker rm <container_id>

```

{% endcode %}

### **Docker Compose: Orquestación Sencilla** <a href="#undefined" id="undefined"></a>

Docker Compose permite definir y ejecutar aplicaciones multicontenedor mediante un archivo `docker-compose.yml`. Ejemplo básico:

{% code title="text" overflow="wrap" %}

```
version: "3.9"
services:
  web:
    image: nginx
    ports:
      - "80:80"
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: ejemplo

```

{% endcode %}

### **Recursos para Aprender Más** <a href="#undefined" id="undefined"></a>

* **Tutorial oficial de Docker 101:** <https://docs.docker.com/get-started/>
* **Documentación oficial de Docker:** <https://docs.docker.com/>
* **Docker Hub (registro oficial de imágenes):** <https://hub.docker.com/>
* **Guía completa de Docker en español (Recetas Docker):** <http://recetas-docker.readthedocs.io/es/latest/>
* **Guía para principiantes (freeCodeCamp):** <https://www.freecodecamp.org/espanol/news/guia-de-docker-para-principiantes-como-crear-tu-primera-aplicacion-docker/>
* **Guía completa sobre Docker (Kinsta):** <https://kinsta.com/es/base-de-conocimiento/que-es-docker/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darioaplicano.gitbook.io/influxdb2.x/instalacion-y-configuracion-inicial/1.-docker.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
