01 Docker

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 31

Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

Docker
Resumen

En el presente documento se define un lineamiento para aprender varios conceptos alrededor


de Docker. El objetivo es usar este documento como una guía (+ un tutor) que acompañará al
estudiante en su viaje para aprender Docker desde 0 hasta orquestación de servicios en
Docker.

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

2. Conceptos generales de Docker 6

3. El comando docker y sus sub-comandos 8


3.1. hello-world 8
3.2. Docker pull 9
3.3. Docker images 10
3.4. Docker run 11
3.5. Docker ps 13
3.6. Docker container rm 14
3.7. Docker image rm 15
3.8. Docker container stop 16
3.9. Docker container start 17
3.10. Docker container attach 18
3.11. Un sitio web estático 20
3.12. Creando su propio sitio web 21

4. Creación de imágenes en Docker vía Dockerfile 22

5. Otros temas de interés 25

6. Notas de curso sobre Docker 27


6.1. Docker networks: concepts 28
6.2. DNS 29
6.3. Docker images 30

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.1. Via script


En página web oficial de Docker1 se indica que para instalar Docker basta con ejecutar los
siguientes comandos:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh ./get-docker.sh

1.2. Aprovisionando máquina virtual via Vagrant


Vagrant ofrece un comando el cual permite la instalación de una máquina virtual y con Docker
listo para ser ejecutado. Visitar este enlace2.

Vagrantfile que aprovisiona una máquina virtual con Docker:


Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/xenial64"
config.vm.provider :virtualbox do |vb|
vb.customize [ 'modifyvm', :id, '--name', 'dockerlocal']
end
config.vm.provision "docker"
end

1.3. Instalando Docker manualmente3


1.
sudo apt-get update
2.

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

sudo apt-get install \


curl \
ca-certificates \
lsb-release \
gnupg
3.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor
-o /usr/share/keyrings/docker-archive-keyring.gpg
4.
echo \
"deb [arch=$(dpkg --print-architecture)
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list
> /dev/null

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.

Hágalo usted mismo


Teniendo como base el enlace anterior cree un Vagrantfile que le servirá de base para próximos
despliegues de Docker en este documento.
Tenga en cuenta lo siguiente para su Vagrantfile:
1. Docker solo funciona sobre sistemas operativos Linux de 64 bits ¿Qué debe hacer para
crear una máquina virtual con un sistema Linux de 64 bits?
2. Cuando aprovisione la máquina virtual asegúrese de que la máquina virtual tenga un
hostname similar al nombre que tiene la máquina virtual en el dashboard de VirtualBox.
Hint: Inicialize la variable config.vm.hostname4

Docker para Windows


Para Windows se recomienda:
● Docker toolbox para usuarios de Windows 7,8 o 10 Home Edition - No soporta
contenedores de Windows

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

2. Conceptos generales de Docker


Presentación aquí6 y lista de vídeos de reproducción sobre Docker. (Nueva versión de
presentación de Docker 2022)
Vale la pena mencionar que Docker tiene, además de los conceptos ya mencionados en la
presentación, una serie de objetos los cuales permiten la creación de entornos de computación
profesional que apoyan el desarrollo de aplicaciones distribuidas. Los objetos a considerar son:
● Image → AMIs
● Container → VM
● Network → VPC (Virtual Private Connectivity)
● Volume → S3 EBS
A continuación se mostrará una especie de cheat sheet relacionada con los objetos imágenes
de contenedor y contenedor7.

● Cómo se gestionan las imágenes en Docker:


○ Listar → docker images, docker image ls
○ Traer imágenes al sistema → docker pull <image-name>, docker run
<image-name>
○ Borramos → docker rmi <image-name>
○ Crear imágenes
■ A partir de contenedores → docker commit <container-id>
<new-image-name>
■ A partir de Dockerfile → docker build -t <image-name> .
FROM ubuntu
RUN apt update
RUN apt install htop


● 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. El comando docker y sus sub-comandos


Requerimientos
Para llevar a cabo la ejecución de los próximos comandos se asume que usted tiene acceso a
una máquina con Docker instalado. [link]

¿De qué se trata esta sección?


En esta sección se hará un recorrido por los comandos más comúnmente usados en Docker.

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:

docker container run hello-world

8/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.2. Docker pull


docker9 pull es un comando que permite la descarga desde un registry de una imagen de
Docker.
Algunas imágenes populares de Docker son:
● Ubuntu - https://hub.docker.com/_/ubuntu/
● Busybox - https://hub.docker.com/_/busybox/
Para descargar imágenes se debe ejecutar:

docker image pull ubuntu

docker image pull busybox

Estas imágenes quedan almacenadas localmente en el computador desde donde se emitió el


comando pull.
El sitio para buscar repositorios es https://hub.docker.com10.

Hágalo usted mismo


Visite https://hub.docker.com, busque alguna aplicación Open Source que le interese (base de
datos, servidor web, etc.) y valide si existe una imagen de Docker para esta aplicación. De ser
así, descárguela.

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

3.3. Docker images


Recordemos que una imagen en Docker es un archivo inmutable que es fundamentalmente
una “fotografía” de un contenedor. Las imágenes de Docker son la base para la ejecución de
contenedores. Es similar a la analogía que una aplicación es un archivo en un dispositivo de
almacenamiento pero que una vez este se ejecuta se convierte en un proceso.

El subcomando image ls es usado para listar las imágenes de Docker que están disponibles de
forma local.

docker image ls

Hágalo usted mismo


Cree un alias en Bash que le permita contar cuantas imágenes de Docker tiene en su
computador.

10/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.4. Docker run


docker run es el comando que permite llevar a cabo la ejecución de contenedores. Se
asume que usted ha descargado la imagen ubuntu para Docker. Para llevar a cabo la ejecución
de un contenedor de ubuntu ejecute:
docker container run busybox11

Cuando usted corrió este comando, esto fue lo que sucedió


1. Docker buscó una imagen llamada busybox
2. Cargo esa imagen y creó un contenedor
3. Finalmente, se ejecutó el contenedor
Sin embargo, no tenía nada que ejecutar.
docker container run busybox echo “hello world”

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

En esta oportunidad se lanza la ejecución de un contenedor basado en busybox y ejecuta el


shell ‘sh’.
docker container run alpine ls -l

11
https://hub.docker.com/_/busybox
11/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

Hágalo usted mismo


Visite el contenedor, observe por ejemplo:
● ¿Qué archivos + directorios tiene este contenedor?
● ¿Qué usuario es usted en ese momento?
● ¿Qué sucede si ejecuta el comando ‘rm -rf /bin/*’? ¿Qué comandos ya no puede
ejecutar?
● Abra otra terminal y vuelva a correr el comando ‘docker run -it busybox sh’. El directorio
‘/bin’ tiene archivos?
● ¿Qué significa ese comando?
docker container run -it ubuntu /bin/bash

● 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.

¿Qué salida muestra este comando?

docker ps -a

Este comando muestra la lista de todos los contenedores que están corriendo o han corrido en
el sistema.

Preste atención: Se sugiere usar el comando docker container ls y docker container ls


-a.

Hágalo usted mismo


Defina un alias en Bash en el cual se lista los identificadores de contenedores que están en
ejecución. Revisar la página de docker ps.

13/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.6. Docker container rm


Este comando permite borrar un contenedor. Para llevar a cabo esta tarea se hace necesario
que ese contenedor ya no esté en ejecución. Para ejecutar este comando se le indica al
comando el identificador del contenedor que se desea borrar.

Hágalo usted mismo


Hace un momento usted fue capaz de listar los identificadores de aquellos contenedores que
estaban corriendo. Construya, en una sola línea de ejecución, un comando que borre todos
aquellos contenedores que han terminado su ejecución.

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

3.7. Docker image rm


Este comando permite llevar a cabo el borrado de la imagen en Docker. Recuerde que a partir
de una imagen es que se genera la ejecución de contenedores. Una vez borrada una imagen
esta queda inaccesible de forma local pero puede ser descargada desde Internet si esta se
encuentra disponible. El argumento que debe recibir este comando es el id de la imagen que se
desea borrar.

15/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.8. Docker container stop


docker stop es un comando que permite detener la ejecución de un contenedor.

docker container stop <container-id>

Truco: otra forma de salirse o detener de la ejecución de un contenedor es, estando


dentro del contenedor, ejecutar el comando exit.
Truco: es posible salirse del contenedor sin detener su ejecución a través del
comando ctrl-p ctrl-q

Hágalo usted mismo


1. Abra una terminal y ejecute un shell en un contenedor
2. Abra otra terminal y ejecute el comando docker stop sobre el contenedor que acabó de
ejecutar

16/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.9. Docker container start


El comando docker start permite retomar la ejecución de un contenedor que se ha
detenido (docker container stop) anteriormente. Para validar que contenedores han sido
ejecutados con anterioridad y que en este momento no se encuentran en ejecución, se debe
ejecutar el comando
docker container ls -a

Tome el identificador de alguna de esas imágenes y ejecute el comando


docker container start <container-id>

En este momento el contenedor ha sido reactivado.

Hágalo usted mismo


En el ejercicio anterior usted detuvo la ejecución de un contenedor que ejecutaba el shell Bash.
Reanude la ejecución de dicho contenedor

17/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.10. Docker container attach


Este comando permite conectarse a un contenedor o que está en ejecución o que fue
reactivado con el comando docker start.
Validar el identificador de un contenedor que esté en ejecución. Ahora, ejecutar el comando

docker container attach <running-container-id>

Bonus
Para salir de un contenedor se pueden ejecutar la secuencia de teclas ctrl-p + ctrl-q

Hágalo usted mismo


1. Lance la ejecución de un contenedor
2. Estando al interior del contenedor ejecute la instalación del comando htop
3. Ejecute el comando htop
4. Desconéctese del contenedor haciendo uso de la secuencia ctrl-p + ctrl-q
5. Detenga la ejecución del contenedor
6. Reinicie la ejecución del contenedor
7. Reconéctese al contenedor y valide si el comando htop continúa en ejecución

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

3.11. Un sitio web estático


En esta sección vamos a ejecutar una imagen de Docker que contiene un sitio web estático. A
través de este ejemplo se podrá comprender:
● El uso de imágenes de Docker de terceros
● El mapeo de puertos

Accediendo a una imagen de un tercero


1. Descargue la imagen de Docker localizada en prakhar1989/static-site.
2. Valide que la imagen fue descargada.
3. Ejecute dicha imagen. Asegúrese que una vez termine la ejecución ese contenedor será
removido por el cliente de Docker

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.

Intente con esta nueva ejecución

docker run --rm -d -P --name static-site prakhar1989/static-site

¿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.

Hágalo usted mismo

● Con la información obtenida, acceda al sitio estático desde su navegador.


● Detenga la ejecución del servidor web.

Hágalo usted mismo


● Busque en Google la imagen de Docker del aplicativo R
● Descárguelo y ejecute esta imagen. Valide que puede hacer tareas propias del lenguaje
R. En este enlace podrá encontrar algunos comandos que se pueden ejecutar en R.

20/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

3.12. Creando su propio sitio web


Usted va a crear un contenedor que corra el servidor nginx y despliegue una página HTML
personalizada.

Hágalo usted mismo


● Cree un nuevo directorio llamado linux_tweet_app
● Ingrese a ese directorio y cree un archivo llamado Dockerfile con la siguiente
información
FROM nginx:latest

COPY index.html /usr/share/nginx/html

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

● Cree también un archivo llamado index.html que contiene la siguiente información.


Cambie el XXX por su nombre
<html>
<body>
<h1> Saludos, XXX </h1>
</body>
</html>

● 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 .

● Pruebe que su contenedor está bien accediendo a este desde su navegador

Hágalo usted mismo


● Publique su contenedor en docker hub
● Comparta su URL en este formulario. Hoja de cálculo del formulario aquí

21/31
Laboratorio de Redes y Sistemas Distribuidos - Universidad del Valle

4. Creación de imágenes en Docker vía Dockerfile13


El Dockerfile es un insumo que se le pasa al comando docker build para construir imágenes
de contenedor.
“The docker build command builds an image from a Dockerfile and a context”
¿Qué es un contexto?
“The build’s context is the set of files at a specified location PATH or URL”
Ejemplo
Dockerfile
FROM ubuntu
RUN apt update
RUN apt install -y htop

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.

El formato de las instrucciones en un Dockerfile es:


INSTRUCTION arguments

Se tiene por costumbre escribir INSTRUCTION en mayúsculas.


FROM
Un Dockerfile debe comenzar siempre con la instrucción FROM. Esta instrucción indica la
nueva imagen a partir de qué imagen pre-existente se va a construir.
RUN
Esta instrucción lleva a cabo la ejecución de un comando. Ese comando se escribe de la
misma manera como se escribe un comando desde la línea de comandos.
RUN apt update

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.

Nota: De la instrucción CMD solo puede haber una por Dockerfile.


EXPOSE
Esta instrucción le indica a Docker que el contenedor estará escuchando en un puerto
determinado en tiempo de ejecución.
Esta instrucción no publica el puerto sino que más bien sirve de documentación a quien usa la
imagen que puerto debe ser publicado.
Para publicar el puerto es necesario pasar como argumento -p o -P al comando docker run.
ADD
Esta instrucción permite copiar archivos o del sistema de fichero local o de archivos remotos en
un URL. Este comando permite cambiar los permisos de los archivos a ser copiados.
ADD --chown=<user>:<group> <src> <dest>

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

5. Otros temas de interés


● Diferencia entre ENTRYPOINT y CMD
● Como borrar recursos no usados en Docker
● AUFS
● Secure Docker Registry - https://training.play-with-docker.com/linux-registry-part2/
● Más tutoriales - https://training.play-with-docker.com/alacart/

Old - Tabla de contenido y enlaces originales


Aprovisionamiento via Vagrant - https://www.vagrantup.com/docs/provisioning/docker.html
Temas a abordar
● Conceptos generales
● El comando “docker” y sus subcomandos
○ Pull
○ Images
○ Run
○ Ps [-a]
○ Stop
○ Start
○ Attach
○ Rm
○ Rmi
○ Build
● Recursos que se pueden gestionar desde docker,
○ Container
○ Volume
○ Network
○ Image

● Primer Alpine Linux Containers - https://training.play-with-docker.com/ops-s1-hello/ [X]
● (*) Volumenes en Docker
○ https://training.play-with-docker.com/docker-volumes/ [X]
○ https://docs.docker.com/storage/volumes/
● (*) Red en Docker - https://training.play-with-docker.com/docker-networking-hol/ [ ]
● Docker Registry - https://training.play-with-docker.com/linux-registry-part1/ [X]
● Haciendo mas con imagenes de Docker -
https://training.play-with-docker.com/ops-s1-images/ [X]
● Ejercicio integrador - https://training.play-with-docker.com/beginner-linux/ [ ]
● Introducción a swarm - https://training.play-with-docker.com/swarm-mode-intro/
● Orquestación en Docker - https://training.play-with-docker.com/orchestration-hol/ [X]
● Tutorial de docker - https://docker-curriculum.com/

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

6. Notas de curso sobre Docker


● Hay un nuevo formato a la hora de ejecutar el comando ‘docker’. Este formato es
‘docker <managemente-command> <sub-command>’
● docker version y docker info
● Docker container run:
○ ‘docker container run --publish 80:80 nginx’ → el contenedor queda en
foreground.
○ ‘docker container run --publish 80:80 --detach nginx’ → el contenedor queda en
background.
○ ‘docker container run --publish 80:80 --detach --name webhost nginx’ →
contenedor en background y ahora se llama webhost.
● ‘docker container ls’, ‘docker container ls -a’
● ‘docker container stop <id>’
● ‘docker container logs <id>’
● ‘docker container top <id>’ → permite ver los procesos que corren dentro de un
contenedor
● ‘docker container rm <id>’ → para borrar un contenedor en particular. Puede pasarse
también una lista de ids.
● Qué ocurre cuando se invoca ‘docker container run’

● 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

○ ‘docker container exec -it’ → ejecuta un comando adicional


● Validar que comando ejecutó un contenedor una vez se lanzó su ejecución
○ Lanzar la ejecución sin argumentos después del nombre de la imagen
docker container run --interactive --tty --name web --rm nginx

○ Lanzar la ejecución con argumentos después del nombre de la imagen


docker container run --interactive --tty --name web --rm nginx bash

○ Luego ejecutar ‘docker container ls’ y observar la columna ‘COMMAND’.


● Relanzar la ejecución de un contenedor ejecutado previamente → ‘docker container
start --attach --interactive <id>’

6.1. Docker networks: concepts


● Docker provee 5 tipos de redes (drivers):
○ Bridge: es la red usada por los contenedores cuando se crean por defecto.
○ Host: este driver permite que el contenedor sea accedido a través de la misma
interfaz de red del equipo anfitrión donde se ejecuta el contenedor.
○ None: este driver deshabilita la red en los contenedores. Una vez un contenedor
se ejecuta/inicia en una red none ya este no se puede conectar a otra red.
○ Overlay: este driver permite la conexión de múltiples contenedores sobre
diferentes nodos anfitriones.
○ Macvlan: este driver permite que se le asigne una dirección MAC a los
contenedores y que funcionen estos como cualquier otro dispositivo en la red.
● Por defecto los contenedores se ejecutan con el driver bridge.
○ Veamos la red bridge que viene por defecto ‘docker network inspect bridge’.
Identifique el segmento de red de esta red.
○ Ejecute ahora el contenedor de nginx en modo detach y observe cuál es el IP
asignado al contenedor.
● Una buena práctica es permitir que contenedores que necesitan interactuar estén
desplegados sobre una misma red. Por ejemplo, una aplicación en PHP que requiere
una base de datos, deberían estar sobre el mismo segmento de red. Las razones para
esto son:

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

● Identificar el IP de este contenedor


docker container inspect --format "{{ .NetworkSettings.IPAddress }}" webhost

● El IP del contenedor no está en el mismo segmento de red del anfitrión.


● Listar las redes disponibles ‘docker network ls‘. La red llamada bridge es la red a la que
se conectan por defecto los contenedores.
● Es posible inspeccionar la red bridge a través del comando ‘docker network inspect
bridge’
● Para crear una red se usa el comando ‘docker network create my_app_net. El driver por
defecto es bridge.
● Para conectar un nuevo contenedor a esa red se ejecuta el comando ‘docker container
run -d --name newwebhost --network my_app_net nginx’.
● Es posible conectar un contenedor a una red ya existente. ‘docker network connect
<net_id> <container_id>’. En este caso ‘docker network connect my_app_net webhost’.
Validar con el comando ‘docker network inspect my_app_net’ que webhost ahora está
conectado a ese segmento de red.
● Para desconectar ‘docker network disconnect <net_id> <container_id>’ → ‘docker
disconnect my_app_net 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’.

6.3. Docker images


● Image → (app binaries + dependencies) + (metadata about image data, how to run the
image)
● ¿Cómo diferenciar imágenes oficiales, buenas y malas?
○ Imágenes oficiales
■ Las imágenes oficiales no tienen un prefijo en el nombre de la imagen
■ Las imágenes oficiales fueron construidas con buenas prácticas
■ Las imágenes oficiales son las adecuadas para a partir de ellas, crear
nuevas imágenes
■ Tienen una muy buena documentación
■ Ofrecen diferentes “versiones”
○ “Buenas” imágenes
■ El número de “pulls” y “stars” que ellas tienen
○ Bonus → https://github.com/docker-library/official-images
● La importancia de los tags.
○ Es importante que en los procesos de desarrollo y distribución de software
siempre se especifique el tag que corresponde a la imagen que se quiere usar
● Crear una cuenta en hub.docker.com.
● Image & layers
○ docker image history nginx

○ Esto ↑ es la historia de cada una de las capas de la imagen de nginx. Toda


imagen en sus comienzos arranca con un capa llamada scratch. Cada capa
revela acciones que se han realizado sobre la imagen. Algunos cambios
adicionan tamaño en la imagen, otros no.
○ Cada capa de una imagen tiene un identificador, SHA. Ese identificador permite
identificar de manera única cada capa de una imagen. Cuando se construye una
nueva imagen y esta imagen utiliza una capa definida previamente entonces la

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.

Descargue la imagen nginx:latest. Ahora, descargue la imagen cuyo tag es


mainline.

● 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

También podría gustarte