Conceptos básicos de Docker
Tags: docker, beginners, linux
Published: 2021-11-18 20:44:10

Docker te permite construir, distribuir y ejecutar cualquier app en cualquier lugar, mediante contenedores.
Para poder usarlo debes ingresar a https://www.docker.com/ y descargar 'Docker desktop' y crear una cuenta en DockerHub.

### Conceptos importantes
- Contenedores: Dónde va a correr la app, sirve para poder compartir las imágenes con otros servidores, computadoras, etc. Es una agrupación de procesos aislados del sistema, es decir, como si se estuviera corriendo una máquina virtual en tu computadora, pero mucho mejor.
- Imágenes: Es la encapsulación del contenedor a compartir, lo que tú creas para que otros usuarios lo usen.
- Volúmenes de datos: Archivos del sistema, pueden ser archivos, carpetas, imágenes, etc. 
- Redes: Permiten la comunicación entre servidores, son conexiones básicamente.

### Comandos importantes
+ **docker login** Inicia sesión en DockerHub para poder usar el código que ya está escrito y compartir tu código.
+ **docker run `<contenedor>`** Ejecuta el contenedor.
  * `--name <nombre>` Le asigna un nombre al contenedor.
  * `--mount src=<nombre_volumen>,dst=<ruta_contenedor>` Asigna un volumen al contenedor, como `-v`.
  * `-i` Abre el modo interactivo.
  * `-t` Ejecuta su terminal.
  * `-d` Lo ejecuta en segundo plano.
  * `-p <puerto_local>:<puerto_contenedor>` Expone un puerto del contenedor para acceder en la máquina local.
  * `-v <ruta_local>:<ruta_contenedor>` Copia todos la data de la ruta del contenedor en la ruta local especificada. Crea un volumen.
  * `--rm` Cuando se cierra el contenedor, se elimina.
  * `--env <nombre_variable>=<valor>` Define una variable de entorno.
  * `--scale <nombre_contenedor>=<número>` Crea 'n' instancias del contenedor
  * `--memory <cantidad_memoria>` Limita el uso de memoria.
+ **docker ps** Lista los contenedores activos y su información.
  * `-a` Muestra también los contenedores inactivos.
  * `-q` Muestra solo los ID de los contenedores.
  * `-l` Muestra solo la información del último proceso.
+ **docker inspect `<id_contenedor | nombre_contenedor>`** Muestra información más completa sobre el contenedor dado su ID o nombre.
  * `--format '{{<atributo>.<propiedad>}}'` Retorna solo la información solicitada.
+ **docker rename `<actual> <nuevo>`** Cambia el nombre de un contenedor.
+ **docker rm `<id_contenedor | nombre_contenedor>`** Elimina el contenedor seleccionado.
  * `-f` Fuerza el borrado.
+ **docker container prune** Elimina todos los contenedores.
+ **docker exec `<nombre_contenedor>`** Conectar con un contenedor que ya está corriendo.
+ **docker stop `<nombre_contenedor>`** Mata un proceso.
+ **docker logs** Muestra los logs.
  * `-f` Se queda esperando a que lleguen más logs.
  * `--tail <número>` Muestra los últimos 'n' logs.
+ **docker tag `<nombre_contenedor> <nuevo_nombre_contenedor>`** Renombra la etiqueta del contenedor.
+ **docker history `<nombre_contenedor>`** Muestra los cambios hechos al contenedor.
+ **docker system prune** Borra todo lo que este inactivo.
+ **docker stats** Ver los recursos que está consumiendo el contenedor.

+ **docker volume ls** Lista los volúmenes activos.
+ **docker volume create `<nombre_volumen>`** Crea un volumen.
+ **docker volume prune** Borra los volúmenes inactivos.


+ **docker cp `<archivo> <nombre_contenedor>:<ruta_local>`** Copia un archivo del contenedor a la ruta local asignada
+ **docker cp `<nombre_contenedor>:/<directorio> <ruta_local>`** Copia un directorio desde el contenedor.

+ **docker image ls** Lista las imágenes.
+ **docker pull <nombre_contenedor>:<versión?>** Trae la imagen desde DockerHub.
+ **docker build `<nombre_contenedor>` .** Construye una imagen.
  * `-t` Agrega una etiqueta a la imagen.
+ **docker push `<nombre_contenedor>`** Publica el contenedor en DockerHub.

+ **docker network ls** Muestra las redes existentes.
+ **docker network create `<nombre_red>`** Crea una red.
  * `--attachable` Permite que cualquiera se conecte a la red.
+ **docker network inspect `<nombre_red>`** Muestra información de esa red.
+ **docker network connect `<nombre_red> <nombre_contenedor>`** Conecta un contenedor a una red.
+ **docker network prune** Elimina todas las redes que no estén siendo usadas.

+ **docker-compose up** Corre todo lo que definimos en el archivo docker-compose.yml (redes, servicios, contenedores, etc).
  * `-d` Lo corre en segundo plano.
+ **docker-compose ps** Muestra los contenedores activos.
+ **docker-componse logs** Muestra los logs de los servicios/contenedores.
  * `-f` Muestra los logs conforme llegan.
  * `<nombre_contenedor>` Muestra los logs de solo ese servicio.
+ **docker-compose down** Apaga los contenedores y elimina todo lo que tenga que ver con ellos.
+ **docker-compose build `<nombre_contenedor>`** Construye una imagen a partir de los archivos que tiene en disco, basandose en el archivo docker-compose.yml.

### Dockerfile
Es un archivo de texto plano con instrucciones necesarias para crear una imagen.
Una estructura básica puede ser:
```
FROM node:12 //En qué se basa
COPY [".", "/usr/src/"] //Copia archivos
WORKDIR /usr/src/ //Cambia de directorio (como cd)
RUN npm install //Corre este comando
EXPOSE 3000 //Expone el puerto para usarlo en local
CMD ["node", "index.js"] //Comando a ejecutar cuando se corra el contenedor
```
### Docker Compose
Permite escribir en un archivo lo que queremos que Docker realice sin usar los comandos. El archivo es docker-compose.yml. Es parecido a un archivo JSON, aquí importa el tabulado, es decir que si no pones el espaciado correcto, la aplicación no funcionará.
Ejemplo:
```
version: "3.8" //Versión de DockerCompose
services: //Componentes a ejecutarse
  app: //Servicio
    image: ubuntu //Imagen en la que se va a basar el contenedor
    environment: //Define las variables de entorno
      MONGO_URL: "mongodb://db:27017/test"
    depends_on: //Servicios que deben existir para que funcione
      - db
    ports: //Puertos a exponer y en que puerto
      -"3000:3000"
      -"2000-20003:2000" //Expone un rango de puertos
    volumes: //Define un volumen
      -.:/usr/src/ //De dónde toma los datos y en dónde los guarda
    build: . // Dónde va a construir la app
  db:
    image: mongo
  command: npx nodemon index.js //Qué comando se ejecutará
```

### Docker Compose Override
Este archivo es como docker-compose.yml pero para cuando queremos trabajar en nuestro local sin hacer cambios que puedan afectar al resto del equipo.
No podemos dejar vacío este archivo, ya que puede generar errores.
Podríamos poner solo `version: "3.8"` para que funcione, ya que 'hereda' los datos de docker-compose.yml, si hay líneas repetidas, el archivo docker-componse.override.yml lo sobrescribe.
Es aconsejable no sobrescribir los puertos, sino dejarlos solo en un archivo, esto para evitar errores.

### Docker Ignore
Aquí definimos los archivos que no serán tomados en cuenta para realizar el build. El archivo se llama: .dockerignore.
Su sintaxis es:
```
*.log
.dockerignore
.git
Dockerfile
```