docker inspect nombre del contenedor -> inspecciona
docker inspect -f especifico
docker rename NombreContenedor hola-mundo -> rename docker
docker run --name hola-mundo hello-world -> name docker
docker run -> crea un contenedor
docker logs NombreContenedor -> muestra el output del contenedor si esta andando
docker rm NombreContenedor -> borra un contenedor
docker ps -aq -> output id's containers
docker rm $(docker ps -aq) -> elimina todos los contenedores
docker run -it ubuntu -> crea el contenedor y ingresa al shel para poder navegar en el
docker run ubuntu tail -f /dev/null -> este comando espera que hallan cosas nuevas y las muestra cada
que se actuliza
tail -> escupe el contenido
-f -> cada cosa nueva la muestra
docker exec -it NombreContenedor bash -> para entrar a un contenedor
ps -> pocesos de mi seccion
ps -fea -> tabla de procesos
pip1 al comando que correo con el contenedor,
docker kill NombreContenedor-> mata el proceso
docker rm -f NombreContenedor -> no me importa si esta corriendo, eliminalo
docker run --detach -> poga el contenedor a correr no me importa lo que tenga dentro
docker run -d --name server -p 8080:80 nginx -> cree un contenedor con detach cambie el nombre
corraolo por el puerto 8080(Izquierda) de mi maquina y por el puerto 80(derecha) de docker
docker run --name db -d -v /home/admc/Documents/Docker/mongodata:/data/db mongo
// creo un contenedor cambio el nombre y le digo que en que carpeta voy a utilizar o montar el Docker
para que los datos de la DB persistan.
docker volume ls -> mirar los volumenes creados
docker volume prun -> elimina todos los volumenes
docker volume crate NombreVolumen -> crear volumen en Docker
docker run -d --name db --mount src-dbdata,dist=/data/db mongo
--mount -> montar volumen
src-dbdata,dst=/data/db mongo -> la direccion donde mongo guarda los datos
docker pull redis -> trae varias cosas es de lo que esta hecho una imagen es un conjunto de capas o
leyers esta construida siempre con una capa base y capas que se van montando, cuando yo me traigo
una imagen me trae todo en paralelo, cada capa es inmutable
las capas montan una diferencia a la anterior igual que los commits en git hub
docker image ls -> lista las imagenes
nombre de la imagen es conocido como repositorio
tag -> es el nombre que se le pone a una version
size -> tamaño que ocupa en el disco
docker pull ubuntu:18.04 -> pide ubuntu con la version especificada
touch Dockerfile -> crear un archivo para empezar a crear nuestras imagenes
cuando se hace build docker toma todo lo que hay ahi pero si hay algo fuera no puede acceder a mis
archivos de sistema
sudo docker build -t ubuntu:platzi . -> el punto es importante este comando es para hacer build a la
imagen
layers en docker -> buscar creo que son contenedores
docker run -it ubuntu:platzi -> arranca la imagen en este caso el nombre del contenedor es ubuntu:platzi
docker tag ubuntu:platzi admc09/ubuntu:platzi -> envio la imagen a mi ususario de Docker
docker push admc09/ubuntu:platzi -> push a mi repositorio en Docker
//
Vamos a crear nuestras propias imágenes, necesitamos un archivo llamado DockerFile que es la
““receta”” que utiliza Docker para crear imágenes.
**Es importante que el DockerFile siempre empiece con un ““FROM”” sino, no va a funcionar. **
El flujo para construir en Docker siempre es así:
Dockerfile – **build **–> Imágen – run --> Contenedor
//
docker login -> ingreso a mi cuenta de docker y despues de eso si puedo pushear
docker history ubuntu:platzi -> historia de las capas
docker history --no-trunc ubuntu:platzi -> no me trunques el output de este comando, pero es mejor
utilizar la herramienta open souerce
dive ubuntu:platzi -> nos muestra las capas de la imagen de una manera más organizada que el
comando anterior
todo lo que se haga en un layer constituye ese leyer
docker run --rm -p 3000:3000 platziapp
corre en contenedor y eliminamelo
using cache -> ya lo hice antes entonces no tengo que hacerlo de nuevo en el layer(contenedor)
ahorra tiempo en el docker field por que las cosas cambian poco en el constexto de build
para evitar que se demore arto en al hacer build del contenedor se copia el COPY [se copian los
archivos que afecten o que sean usados por el comando] ->
actualizar el contenido de un contenedor sin tener que hacer build de el cada ves que realizo un cambio
El WORKDIR no es un simple cd en el que nos vamos a parar en ese directorio, sí hace eso pero va
más allá; con el WORKDIR se establece el directorio de trabajo en el cual será el directorio base de la
aplicación y en dónde se van a ejecutar los comando que se especifiquen durante el Dockerfile.
Como Construir una imagen
- docker build -t ubuntu:platzi
Docker para desarrollar aplicaciones
# Empesamos desde una imagen de node.
FROM node:8
# Copia del contexto de build
COPY[".", "/usr/src/"]
# Es como un cd
WORKDIR/usr/src
# Instalar dependencias node
RUNnpm install
# Espone el puerto 3000
EXPOSE3000
# Comando de arranque de la imagen
CMD["node", "[Link]"]
Entendiendo el sistema de capas
Tres Alternativas para ver el contenido de una imagen de docker:
usar commando docker history
contra: poco legible
encontrar el dockerfile en dockerhub
contra: vemos lo que contiene, mas no lo que se modifico con respecto a la anterior
usar dive
Construyendo nuestras propias imagenes
Crear el archivo Dockerfile (receta)
El dockerfile siempre debe empezar con el FROM le indicamos cual va a ser nuestra imagen
base para empezar
RUN para correr un comando
Creamos un archivo touch /usr/src/hola-mundo
Construimos el dockerfile
docker build -t <imagen>:<tag de la imagen> <path de donde vamos a obtener el contexto
build, para este caso .>
-t es el nombre del tag de la imagen
Ej:
FROM ubuntu
RUNtouch /usr/src/hola-mundo
docker build -t ubuntu:platzi .
Hacer push a un contenedor
docker push <tag contenedor>
Ej: docker push <user>/ubuntu:platzi
Cambiar el tag de un contenedor
docker tag <tag contenedor> <nuevo tag contenedor>
Ej: docker tag ubuntu:platzi <user>/ubuntu:platzi
Conceptos fundamentales de Docker:imagenes
Ver imágenes descargadas en el host
docker image ls
Descargar imágenes en el host imágenes descargadas en el host
docker pull <nombre de la imagen>
Ej: docker pull redis
Ej: docker pull ubuntu:18.04 descargando una version en particular
Eliminar imágenes descargadas en el host
docker image ls // para obtener el id de la imagen
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 8 days ago 86.2MB
docker rmi -f 93fd78260bd1
-f => forzar
Ej: docker rmi -f 93fd78260bd1
Datos con Docker:Volumes
Crear volúmenes en el host (Mejorado)
docker volume create <nombre del volumen>
docker run -d --name <nombre del contenedor> —mount src=<nombre del volumen>,dst=
<carpeta datos contenedor> <nombre de la imagen>
Ej:docker volume create dbdata
Ej:docker run -d --name mongo-db --mount src=dbdata,dst=/data/db mongo
Ciclo de vida de un contenedor
Para ejecutar un proceso o un comando en un contenedor ya existente
docker exec it nombre_contenedor bash
docker kill nombre_contenedor = mata el proceso completo
docker rm -f nombre_contenedor = forzar la eliminación del contenedor
docker pause command suspends all processes in the specified containers.
docker stop command. The main process inside the container will receive SIGTERM, and after
a grace period, SIGKILL.
FROM
que imagen base vamos a utilizar
COPY
va a copiar lo que yo le pida del contexto de build a un contexto en la imagen nueva en la que
estamos creando, cuando ponemos punto (.) es copiame todo lo que esta en el contexto de build
WORKDIR
cd de linea de comandos para te aqui, po que voy a correr cosas y quiero que estes hay, para
poder correr npm install tengo que estar hay
RUN
corre el comando npm install
EXPOSE
un contenedor expone un puerto
primero tenemos que mirar que puerto esta utilizando el contenedor y tenemos que atarle un
puerto a ese puerto del contenedor, un puerto de nuestra maquina a un puerto del contenedor
CMD
cual es el comando por defecto que va a correr un contenedor creado desde una imagen
DONDE ESTA LA DEFINICION DE LAS DEPENDENCIAS EN DJANGO ?
(.) es el contexto de build(contruir)
al cambiar un archivo el contexto de build se copia de nuevo todo, para evitar esto cambiamos el COPY
COPY
utilizamos los archivos que son afectados por el comando build en esta caso serian los que estan en el
primer COPY con esto al hacer build nuevamente Docker sabe que ya los tenemos instalados y no los
volvera a correr, despues de esto utiliza el cache y no me correo todo desde 0
Actualizar el contenido de un contenedor sin tener que construirlo o hacer build
Ejecutar una imagen de un contenedor
docker run –rm -p 3000:3000 -v ‘pwd’ :/usr/src ubuntu_platzi(NombreImagen)
‘pwd’ → extiende mi ruta actual con las comillas
Docker networking: colaboración entre contenedores
docker network ls → lista las redes que tenemos en docker que se instalan por defecto
bridge → por defecto se pueden conectar contenedores con un kwar que se llama link
host → es la forma que tiene docker de represtentar la red de mi maquina – casi nunca deberia
utilizarse
none → si corremos un contenedor con este network estara aislado del networking lo utilizamos
por si no queremos que alguna libreria de terceros nos filtre datos
docker network create(comando para crear una red) -attachable(permite que otros contenedores en el
futuro se conecten a esta red) platzinet(nombre de la red)
docker network create –attachable platzinet
1 → Creamos el contenedor de la db con el comando
docker run -d –name db mongo
2 → conectar contenedor a la red
docker network connect platzinet db
3 → verificamos que el contenedor este conectado
docker network inspect platzinet
4 → correr el contenedor de la aplicacion
para que no valla a localhost y valla a otro lado ponemos este comando el db es por que el contenedor
se llama db, lo contenedores pueden verse entre si por que utilizan la direccion de la computadora
corre esta app en el puerto 3000:3000 con esta variable de entorno en mogo url esta imagen
docker run -d –name app -p 3000:3000 –env MONGO_URL=mongodb://db:27017/test
platziapp
5 → conectarla a la red
si todo esta bien debe correr y tendremos 2 contenedores conectados
docker network connect platzinet app
Docker-compose : La herramienta todo en uno
revisar que todos los contenedores esten apagados si no estan apagados los apagamos
todos con
docker rm -f $(docker ps -aq)
despues eliminamos la red con
docker network rm platzinet
viene integrada con windows y mack, pero no con linux para quienes usan linux
[Link]
nos permite describir de forma declarativa la arquitectura de nuestra aplicacion
por ejemplo un docker file es una descripcion imperativa yo paso a paso le digo que quiero
que haga y paso a paso la va haceindo
docker compose utiliza compose file yamel sintaxis utiliza para describir como queremos
nuestra aplicacion idealmente utilizar la ultima
un servicio puede contener más de un contenedor, en la imagen podemos ver app y db vas a
usar la imagen mongo es algo asi como decir “los contenedores de este servicio van a ser
inicializados con la imagen mongo”
enviroment: agrega esa variable de entorno a los contenedores
depends_on: los contenedores de este servicio dependen de otro servicio en este caso db →
con esto le sujiero a docker compose que este servicio lo inicialice antes que el de platziapp
por que si no lo tiene inicializado no me funciona esto garantiza que esto este creado antes
que lo otro
ports:
mandame el 3000:3000 del port a el contenedor
para utlizarlo usamos el comando
docker-compose up
lo primero que hace es crear una network luego crea db y luego platzi app y corre el resto
y al final nos muestra el output de nuestra aplicacion
TRABAJANDO CON DOCKER-COMPOSE
ctrl + c para el docker
docker-compose up -d → corre el contenedor pero no me muestra nada
docker-compose ps → estado del compose
docker-compose logs app → me muestra los logs de app solamente(los servicios)
docker-compose exect app bash → para meternos a un contenedor en este caso (app)
docker-compose down → para eliminar todos los servicios los contenedores y las conexiones
todo queda limpio
si queremos actualizar un servicio y notamos algo raro podemos utilizar up y down esto
regenera todo desde 0
DOCKER-COMPOSE COMO HERRAMIENTA
DE DESARROLLO
Vamos a trabajar con una imagen no preestablezida docker encuentra un dockerfile en la
carpeta raiz y va a utilizar eso
vamos a build’dear con [Link]
comando → docker-compose build
no le tengo que poner el pat ni nada por que ya le dije como buildear
lo primero que vemos es que docker-compose usa una imagen que tiene puesto image
asi que no buildea
despues buildea el servicio APP y aqui no reutilizo el cache
por que para que en docker reutilice el mismo cache necesitamos que exista en el mismo
layer y que este en un mismo repositorio y aqui el nombre de la imagen es docker_app:latest
tiene el mismo conteinido pero como el repositorio es otro no puede utilizar el cache de antes
docker-compose lo utilizamos para agilizar nuestro uso de docker no más
si utilizamos docker-compose sin buildear la imagen docker se va a dar cuenta de eso y la va
a buildear
para ver los logs
docker-compose logs -f app
volumes: → en el archivo [Link] agregamos dentro de servicios algo más
que en este momento es volumes: → es una lista de basicamente descripciones de como
queremos utilizar los volumenes dentro de nuestro servicio de docker
vamos a utilizar el mas tradicional para dejar el directorio de aqui con el contenedor
buind mont
se agrega una instruccion mas para que no sobrescriba lo escribimos en la line 14
sin apagar nada podemos hacer docker compose up -d
docker verifica si realizamos cambios y si lo hicimos el nos responde hey hiciste cambios en
esta parte asi que tengo que recrear o reconfigurar este servicio o los contenedores de ese
servicio y te dice que contenedor va a recrear o reconfigurar
toda la misma funcionalidad con docker-compose up funciona igual que la anterior que
hicimos paso a paso
docker-compose un servicio es uno o mas contenedores, docker-compose nos permite
escalar un servicio
docker-compose scale app=4 → escala el servicio en 4 contenedores pero se debe
configurar el archivo docker-compose para decirle que utilice los puertos desde el
3000-3010:3000 y docker utiliza esos puertos
CONCEPTOS PARA IMAGENES PRODUCTIVAS
Vamos en esta clase a ver uno de los secretos mejor guardados de docker. Vamos a ver como
manejar un contenedor desde otro contenedor. Es una manera muy interesante para
aprovechar la potencia de docker y todas las ventajas que ofrece
docker in docker
docker run -it –rm v /var/run/[Link]:/var/run/[Link] docker:18.06.1ce