# Docker

# ¿Qué es docker?

<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="//www.youtube.com/embed/hQgvt-s-AHQ" width="560"></iframe>

##### ¿Qué es docker?

La idea detrás de Docker es crear contenedores ligeros y portables para que las aplicaciones de software puedan ejecutarse en cualquier máquina con Docker instalado, independientemente del sistema operativo que la máquina tenga por debajo.

[https://www.javiergarzas.com/2015/07/que-es-docker-sencillo.html](https://www.javiergarzas.com/2015/07/que-es-docker-sencillo.html)

# Instalar Docker

##### Linux - Ubuntu, Linux Mint, . . .

```shell
sudo apt install docker.io
```

##### Mac OS

[https://hub.docker.com/editions/community/docker-ce-desktop-mac](https://hub.docker.com/editions/community/docker-ce-desktop-mac)

##### Windows

[https://hub.docker.com/editions/community/docker-ce-desktop-windows](https://hub.docker.com/editions/community/docker-ce-desktop-windows)

#### Docker compose

[https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)

# Instalar redis-docker

```shell
docker run --name redis -p 6379:6379 -d redis

# dentro del contenedor configurar password

#para entrar al contenedor
docker exec -ti redis /bin/bash

# luego
redis-cli
CONFIG SET requirepass "yourpassword"
AUTH yourpassword
```

# Docker - Comandos básicos

```shell
# Para crear imagen a partir del Dockerfile del directorio actual
docker build -t nombre_imagen .

# Este comando creará un contenedor a partir de la imagen pasada por parámetro
# -p para especificar por cual puerto será accesible desde localhost, -p [puerto_localhost]:[puerto_contendor]
docker run -p 9080:9080 --name nombre_contenedor -d nombre_imagen 

# Lista los contenedores activos
docker ps 

# Lista los contenedores activos e inactivos
docker ps -a 

# Iniciar contenedor
docker start [nombre_contenedor | id_contenedor]

# Reiniciar contenedor
docker restart [nombre_contenedor | id_contenedor]

# Detener contenedor
docker stop [nombre_contenedor | id_contenedor]

# Remover contenedor
docker rm [nombre_contenedor | id_contenedor]

# Exportar imagen docker a un .tar
docker save imagen > imagen.tar 

# Para iniciar todos los contendores y configuraciones especificadas en el docker-compose.yml
docker-compose up -d 

# Entrar a la linea de comando de un contenedor especifico
docker exec -ti container_id /bin/bash 

docker run -i -t --rm image bash

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest

docker commit upbeat_panini testredis:example

#reiniciar todos los contenedores
docker restart $(docker ps -a -q)

#--- Docker compose

docker-compose down --rmi all

# --no-deps - Don't start linked services. --build - Build images before starting containers.
docker-compose up -d --no-deps --build <service_name>

# to remove all the images which are not used by existing containers
docker system prune -a --volumes

```

# Docker - Instalar MariaDB y phpmyadmin

```shell
# Crear network (red), para poder conectar ambos contenedores
docker network create mysql-network

# Correr mariadb
docker run -p 3306:3306 --name mysql --net=mysql-network -e MYSQL_ROOT_PASSWORD=secret -d mariadb
docker run -p 3306:3306 --name mysql --net=mysql-network -e MYSQL_ROOT_PASSWORD=secret -d mysql:5.7

# Correr phpmyadmin
docker run --name phpmyadmin \
           --net=mysql-network \
           -e MYSQL_ROOT_PASSWORD=secret \
           -e PMA_HOST="mysql" \
           -e PMA_PORT=3306 \
           -p 8080:80 \
           -d phpmyadmin/phpmyadmin
```

Después de haber corrido los comandos anteriores, la base de datos MariaDB estará disponible en el puerto 3306 del localhost, y phpmyadmin estará corriendo en el puerto 8080 del localhost

# Usar docker sin sudo en linux

```shell
# Crear grupo docker
sudo groupadd docker

# Agregar usuario actual al grupo docker
sudo usermod -aG docker $USER

# Activar nuevos cambios
newgrp docker

# Ya puedes usar docker sin sudo!
```

# Ejemplos de Dockerfile

##### Para deploy de node.js app

```shell
FROM node:10

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm install
# If you are building your code for production
# RUN npm ci --only=production

# Bundle app source
COPY . .

EXPOSE 8080

CMD [ "npm", "start" ]
```

Para deploy de django app, las dependencias deben estar en el Pipfile

```shell
# Pull base image
FROM python:3.7-slim

# Set environment varibles
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory
WORKDIR /code

# Install dependencies
RUN pip install pipenv
COPY Pipfile Pipfile.lock /code/
RUN pipenv install --system

# Copy project
COPY . /code/

CMD ["python", "manage.py", "runserver" ,"0.0.0.0:8000"]
```

# docker-machine docker-swarm

```shell
#mac os install
brew install docker-machine

docker-machine ls

docker-machine create --driver digitalocean --digitalocean-access-token 5a07a17... docker-app-machine

eval $(docker-machine env docker-app-machine)

#connect by ssh to host
docker-machine ssh swarm-node

docker swarm init
docker swarm join
docker swarm leave
```

# Traefik - v2

examples - tutorial: [https://github.com/DoTheEvo/Traefik-v2-examples](https://github.com/DoTheEvo/Traefik-v2-examples)