01 Docker
01 Docker
01 Docker
Docker
Resumen
Tabla de contenido
1. Preliminares 3
1.1. Via script 3
1.2. Aprovisionando máquina virtual via Vagrant 3
1.3. Instalando Docker manualmente 3
1/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
2/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
1. Preliminares
Durante el desarrollo de varias de las actividades que se llevarán a cabo en este documento se
requerirá del uso de la herramienta Docker. Para llevar las prácticas con la herramienta Docker
se sugiere [fuertemente] que se haga el despliegue de Docker en una máquina virtual.
A continuación se describen algunas de las formas que se pueden utilizar para instalar Docker.
1
https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script
2
Sección Pulling Images
3
https://docs.docker.com/install/linux/docker-ce/ubuntu/
3/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
5.
sudo apt-get update
6.
sudo apt-get install docker-ce docker-ce-cli containerd.io
7. Este último paso para adicionar al $USER grupo docker
sudo usermod -aG docker $USER
8.
4
En esta página encontrará detalles de la inicialización de la variable
4/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Docker Desktop para usuarios de Windows 10 y Windows Server 20165
5
Soporta contenedores de Windows.
5/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
■
● Cómo se gestionan los contenedores
○ Creo contenedores → docker run -it <image-name>
○ Como listar contenedores → docker ps [-a], docker container ls [-a]
○ Como se detienen los contenedores → docker stop <container-id>
○ Como reinicio un contenedor → docker start <container-id>, como me
conecto a un contenedor que está en ejecución docker attach <container-id>
○ Como elimino un contenedor
6
Otra presentación (2018-10-01) https://goo.gl/XMxUiu
7
Las imágenes se pueden considerar como aquellos objetos en Docker desde los cuales se
pueden crear contenedores. De otro lado, los contenedores se pueden entender como una
instancia de una imagen. De forma análoga como un proceso es la instancia de un programa,
un contenedor es una instancia de una imagen. Así como un programa es un archivo
almacenado en disco duro, una imagen está formada por una serie de archivos almacenados
en disco duro y que constituyen las capas de dicha imagen de contenedor.
6/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
■ Comando explícito → docker rm <container-id>
■ Comando implícito (a la hora de lanzar un contenedor) → docker run -it
--rm <image-name>
● Volúmenes en Docker8 → dispositivos de almacenamiento independientes de los
contenedores
○ Donde se almacenan la información en contenedores
○ Vamos a crear volúmenes
■ A la hora de crear una imagen
■ A la hora de ejecutar una imagen
■ Usando el API de Docker
○ Compartir directorios entre el anfitrión y el contenedor
8
El estudio de volúmenes en Docker se toma de este enlace
https://training.play-with-docker.com/docker-volumes/
7/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
3.1. hello-world
Casi todos los programadores están acostumbrados a su primer programa que imprime el
mensaje ‘hello world’. En Docker (que no es un lenguaje de programación) también tiene su
propia versión de ‘hello world’. Para ello ejecute el siguiente comando:
8/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
9
docker es el CLI
10
http://hub.docker.com es el repositorio en Internet de imágenes de Docker. La plataforma de Docker
está constituida por el CLI + Docker hub.
9/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
El subcomando image ls es usado para listar las imágenes de Docker que están disponibles de
forma local.
docker image ls
10/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
En esta oportunidad sí se llevó a cabo la ejecución del comando ‘echo’. Lo que sucedió aquí
fue algo como la ejecución de una máquina virtual y dentro de ella se ejecutó el comando
(‘echo’) y luego esta máquina dejó de existir.
docker container run -it busybox sh
11
https://hub.docker.com/_/busybox
11/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Cree un usuario
● Instale un aplicación y valide que opera normalmente
12/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
3.5. Docker ps
El comando docker ps permite ver que contenedores están en ejecución. Sin cerrar la
ejecución del contenedor del item anterior, abra otra terminal y ejecute el comando
docker ps
¿Qué salida muestra dicho comando? Este comando muestra el identificador de todos los
contenedores que están corriendo en este momento.
docker ps -a
Este comando muestra la lista de todos los contenedores que están corriendo o han corrido en
el sistema.
13/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
Hint:
● Para llevar a cabo este comando usted deberá invocar el comando docker container rm
<argumentos>. A continuación se explicará de donde salen esos <argumentos>
● La lista de <argumentos> es el resultado de ejecutar el comando docker ps teniendo en
cuenta que
○ El comando debe arrojar solo los indicadores (ids) de los contenedores
○ Los indicadores que se deben mostrar es de solo aquellos contenedores que
terminaron su ejecución12
● Una vez identifique el comando que muestra los ids de aquellos contenedores que
terminaron su ejecución encerrar dicha instrucción en la construcción Bash $(comando)
● $(comando) se debe pasar como argumento al comando docker container rm
12
Revisar el comando docker ps el argumento -f.
14/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
15/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
16/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
17/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
Bonus
Para salir de un contenedor se pueden ejecutar la secuencia de teclas ctrl-p + ctrl-q
18/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
Terminología
Docker maneja una serie de nuevos conceptos que vale la pena tener claros. En este enlace
usted encontrará algunos de dichos términos que vale la pena dejar claros.
19/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
El problema con esta ejecución es que no se sabe como se puede acceder a la aplicación. Un
comando que permite validar que puerto ha sido expuesto por un contenedor es el comando
docker port <container-id>.
Valide si hay algún puerto expuesto por este contenedor. Comente lo que encontró.
Detenga la ejecución del contenedor.
¿Qué significan:
● -d?
● -P?
● --name static-site?
Ejecute nuevamente el comando docker port <container-id>. En esta ocasión usted puede
cambiar el <container-id> por static-site.
20/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
EXPOSE 80 443
● En el directorio donde creó estos archivos ejecute el siguiente comando. Antes de dar
ENTER asegúrese de inicializar la variable ${MYDOCKERID} con el login de su usuario en la
plataforma http://hub.docker.com
docker build -t ${MYDOCKERID}/mynginx:0.0.9 .
21/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
Comando
docker build -t <nombre_imagen> .
Nota: Es posible pasar varios tags (-t) a la hora de crear una imagen.
Nota: Docker tiene un caché que permite la rápida ejecución de la construcción de imágenes
de contenedor cada vez que lo pueda hacer.
Ejercicio
Escriba un Dockerfile que genere una imagen de contenedor con apache instalado en ella. Que
la imagen lleve por nombre ‘apacheubuntu’.
CMD
13
Tomado de https://docs.docker.com/engine/reference/builder/
22/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
El propósito de la instrucción CMD es proveer una ejecución por defecto en un contenedor.
Ejercicio
Escriba las siguientes líneas en un Dockerfile.
FROM ubuntu
CMD ["ls", "-l"]
Construya una nueva imagen de contenedor. Esta imagen deberá llamarse ls.
1. Ejecute los siguientes comandos
a. docker run -it ls
b. docker run -it ls bash
2. Describa en sus propias palabras, cuál es la función de la instrucción CMD.
Ejercicio
1. Cree un archivo tgz
2. Construya un Dockerfile que usa la instrucción ADD usando como fuente el archivo
creado en el ítem anterior
3. Construya una imagen a partir del Dockerfile definido en el ítem anterior
4. Ejecuta un contenedor a partir de la imagen creada en el ítem anterior
5. Qué puede observar?
COPY
Esta instrucción es bastante similar a ADD. La diferencia más importante es que <src> no puede
ser un URL.
ARG
Es una instrucción que permite definir variables que se usarán posteriormente durante el
proceso de construcción de la imagen.
FROM ubuntu
ARG var1="hola"
ARG var2
RUN echo "Saludo ${var1} ${var2}" > /demo.txt
23/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
Ejercicio
1. Ejercicio 1
a. Construya una imagen con un Dockerfile conteniendo las líneas descritas en la
caja de texto anterior
b. Ejecute un contenedor a partir de la imagen creada en el ítem anterior. Revise el
contenido del archivo ‘demo.txt’
2. Ejercicio 2
a. Construya una imagen con un Dockerfile conteniendo las líneas descritas en la
caja de texto anterior y con el siguiente comando ‘docker build --build-arg
var2=”mundo”’
b. Ejecute un contenedor a partir de la imagen creada en el ítem anterior. Revise el
contenido del archivo ‘demo.txt’
ENV
Es una instrucción que permite definir variables que se usarán posteriormente durante el
proceso de ejecución de un contenedor.
FROM ubuntu
ENV var1="hola"
ENV var2 mundo
RUN echo "Saludo ${var1} ${var2}"
Ejercicio
1. Construya una imagen con un Dockerfile conteniendo las líneas descritas en la caja de
texto anterior
2. Ejecute un contenedor a partir de la imagen construida en el ítem anterior de la
siguiente manera ‘docker run --rm -it <nombre_imagen> env’
3. Ejecute un contenedor a partir de la imagen construida en el ítem anterior (y de la forma
como se mostró anteriormente) pero adicione los siguientes argumentos al comando ‘-e
“var1=hello” -e “var2=”world”’
ENTRYPOINT
Esta instrucción permite configurar un contenedor para que se corra como una aplicación.
FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
24/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
25/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Buenas prácticas de Dockerfile -
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
● Docker compose
○ Especificación
○
26/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Un contenedor es un proceso
○ ‘docker container run --name mongo --detach mongo’
○ ‘docker container top mongo’
○ ‘ps aux’ → muestra todos los procesos del sistema. Buscar por el proceso
‘mongod’
● Corriendo mysql → ‘docker container run --publish 3306:3306 --env
MYSQL_RANDOM_ROOT_PASSWORD=yes --name mysql --detach --rm mysql && docker container
logs mysql‘
● Correr tres contenedores uno con mysql (puerto 3306), httpd (puerto 8080 del host) y
nginx (puerto 80). Revisar archivos de log.
27/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Para hacer un análisis del estado de un contenedor se pueden usar los siguientes
comandos:
○ ‘docker container log <id>’
○ ‘docker container top <id>’
○ ‘docker container inspect <id>’
○ ‘docker container stats’ → shows live stats of the running containers
● Corriendo un shell dentro de un contenedor
○ ‘docker container run --interactive --tty’ → inicia un nuevo contenedor
docker container run --interactive --tty --name web --rm nginx bash
28/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
○ Bridges definidos por los usuarios proveen resolución automática de DNS entre
contenedores.
○ Bridges definidos por los usuarios brindan mejor aislamiento.
○ Los contenedores se pueden conectar y desconectar de las redes definidas por
los usuarios en tiempo de ejecución.
● Es posible crear redes en Docker a través del comando ‘docker network create
<network_name>’. Cree una red llamada ‘mired’.
● Un contenedor puede estar conectado a ninguna, una o varias redes
● Un contenedor puede estar conectado directamente a la interfaz de red del anfitrión
(host)
● Ejecutar un contenedor de nginx
docker container run --publish 80:80 --name webhost --detach nginx
● Observar ahora los puertos que son accesibles por este contenedor
docker container port webhost
6.2. DNS
● DNS naming → Docker uses container’s name as hostname.
● Create a third container ‘docker container run -d --name my_nginx --network my_net_app
nginx’
● Vamos ahora al contenedor ‘newwebhost’ a instalar el comando ‘ping’. A través de una
terminal ‘docker container exec -it newwebhost bash’ se ejecuta dentro de esta sesión ‘apt
update && apt install iputils-ping’ los pasos para instalar el ‘ping’.
29/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
● Ahora, se ejecuta el ‘ping’ para validar que desde ‘newwebhost’ se puede comunicar con
‘my_nginx’ → ‘docker container exec -it newwebhost ping my_nginx’.
● La red ‘bridge’ por defecto no tiene habilitado el servicio de DNS. Para crear un enlace
es necesario lanzar la ejecución del contenedor con la bandera ‘--link’.
30/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle
nueva imagen hace referencia a esa capa pero no genera una nueva capa de
modo que se ahorra espacio en disco.
○ Cuando se ejecuta un nuevo contenedor, se crea una nueva capa
lectura/escritura sobre las capas de la imagen que se usó para la ejecución. Un
contenedor es entonces una capa de lectura/escritura sobre la imagen de la cual
derivó su ejecución.
○ docker image inspect nginx brinda información relativa a la imagen nginx.
○ Las imágenes están constituidas por un sistema de archivos y metadatos.
○ Comandos importantes history e inspect.
● Tagging images y push
○ Las imágenes no tienen un nombre sino un tag.
○ Una imagen se referencia por tres elementos: usuario, repositorio y el tag.
○ El tag puede ser cualquier cosa, una palabra, una secuencia de números; pero
en general representa un identificador.
Visitar hub.docker.com. Buscar una herramienta de software. Validar que tags
tiene dicha herramienta.
● La forma como puede asignar tags a una imagen es con el comando docker
image tag <imagen-orig> <imagen-tag>.
● El tag latest es el tag por defecto asignado a una imagen cuando esta se crea y
no se le asigna un tag.
● Una buena práctica puede ser siempre asignarle un tag a la imagen creada pero
cuando se considera que está estable, asociar el tag latest a esa imagen con
ese tag.
docker image tag nginx josanabr/nginx
docker login
docker image push josanabr/nginx
docker image tag josanabr/nginx josanabr/nginx:demo
docker image push josanabr/nginx:demo
docker logout
31/31