Creación de imágenes de contenedor con Docker#
Cuenta en Docker Hub#
Crea una cuenta en Docker Hub
Note
- Todos los integrantes del equipo deben crear una cuenta en DockerHub
- Anota todos los nombres de usuario (Docker ID) en tu reporte
Página de registro de Docker Hub |
---|
![]() |
Instalación de Docker Desktop#
Instala Docker Desktop en tu computadora personal
- https://www.docker.com/products/docker-desktop/
- https://docs.docker.com/desktop/
- https://www.docker.com/blog/getting-started-with-docker-desktop/
Note
En GNU/Linux opcionalmente puedes instalar el demonio de docker (sin interfaz gráfica) Para esto sigue las instrucciones de Docker Engine para tu distribución de GNU/Linux
Prueba de un contenedor#
Ejecuta el contenedor hello-world
para verificar que Docker está instalado correctamente
usuario@laptop ~ % docker run -it hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
7050e35b49f5: Pull complete
Digest: sha256:80f31da1ac7b312ba29d65080fddf797dd76acfb870e677f390d5acba9741b17
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Descargar una imagen de contenedor#
Descarga una imagen de contenedor del registry docker.io
Note
Normalmente este paso se puede omitir porque la imagen se descarga cuando el contenedor se ejecuta o se construye
usuario@laptop ~ % docker pull nginx:1.22-alpine
1.22-alpine: Pulling from library/nginx
b3c136eddcbf: Already exists
6f08591b28af: Pull complete
db529e11ed4a: Pull complete
538c1c0868e9: Pull complete
8d3b0ed53822: Pull complete
99eb1bbfd865: Pull complete
Digest: sha256:f335d7436887b39393409261603fb248e0c385ec18997d866dd44f7e9b621096
Status: Downloaded newer image for nginx:1.22-alpine
docker.io/library/nginx:1.22-alpine
Ejecutar un contenedor con un servidor web#
Ejecuta la imagen de contenedor que acabas de descargar
- La opción
-it
indica que se muestre en pantalla la salida del proceso que se ejecuta en contenedor - La opción
-p 8080:80
indica que se redireccionará el puerto8080
del equipo físico al puerto80
del contenedor
Note
Usualmente se puede escribir el nombre corto del contenedor (nginx:1.22-alpine
), pero es recomendable escribir la ruta completa de la imagen para evitar ambigüedades entre registries
usuario@laptop ~ % docker run -it -p 8080:80 docker.io/library/nginx:1.22-alpine
Unable to find image 'nginx:1.22-alpine' locally
1.22-alpine: Pulling from library/nginx
b3c136eddcbf: Already exists
6f08591b28af: Already exists
db529e11ed4a: Already exists
538c1c0868e9: Already exists
8d3b0ed53822: Already exists
99eb1bbfd865: Already exists
Digest: sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b
Status: Downloaded newer image for nginx:1.22-alpine
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/06/01 06:01:07 [notice] 1#1: using the "epoll" event method
2022/06/01 06:01:07 [notice] 1#1: nginx/1.22.0
2022/06/01 06:01:07 [notice] 1#1: built by gcc 11.2.1 20220219 (Alpine 11.2.1_git20220219)
2022/06/01 06:01:07 [notice] 1#1: OS: Linux 5.10.104-linuxkit
2022/06/01 06:01:07 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/06/01 06:01:07 [notice] 1#1: start worker processes
2022/06/01 06:01:07 [notice] 1#1: start worker process 33
2022/06/01 06:01:07 [notice] 1#1: start worker process 34
2022/06/01 06:01:07 [notice] 1#1: start worker process 35
2022/06/01 06:01:07 [notice] 1#1: start worker process 36
172.17.0.1 - - [01/Jun/2022:06:01:27 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.79.1" "-"
...
Acceder al contenedor del servidor web#
Abre otra terminal y lista los contenedores que se están ejecutando
- Visualiza la columna
PORTS
y verifica que indique que el puerto8080
del equipo físico se redirige al puerto80
del contenedor0.0.0.0:8080->80/tcp
para las conexiones IPv4:::8080->80/tcp
para las conexiones IPv6
usuario@laptop ~ % docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
da39a3ee5e6b nginx:1.22-alpine "/docker-entrypoint…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp raccoon_city
Accede a la URL del contenedor para verificar que el servidor web responde
usuario@laptop ~ % curl -fsSL http://localhost:8080/ | egrep '</?title>'
<title>Welcome to nginx!</title>
Abre un navegador web y accede a la URL del contenedor
Página web del contenedor nginx |
---|
![]() |
Crear imagenes de contenedor#
Sintaxis de Dockerfile
#
Esta es la sintaxis de un Dockerfile
que utiliza BuildKit y algunas características modernas como heredoc en el comando COPY
Cada acción se explica en un comentario
Warning
- Asegúrate de especificar la primer línea
# syntax=docker/dockerfile:1.4
(con el símbolo#
) para utilizar las características avanzadas de BuildKit - En caso de que tu versión de Docker no soporte BuildKit, utiliza la otra opción en el
Dockerfile
# syntax=docker/dockerfile:1.4
# La primer línea permite utilizar características avanzadas de BuildKit
# Especifica qué contenedor se utilizará como base para la nueva imagen
FROM docker.io/library/nginx:1.22-alpine AS nginx
# Declara una variable de entorno para utilizarla después en algún comando
ENV NGINX_ROOT=/usr/share/nginx/html
# Crea la página de índice para NGINX
# Es necesaria la primer línea (syntax=docker/...) para hacer uso de esta variante de COPY
COPY <<EOF ${NGINX_ROOT}/index.html
<html>
<head>
<title>Hello world!</title>
</head>
<body>
<h1>It works!</h1>
</body>
</html>
EOF
- Revisa el contenido de los siguientes archivos
Dockerfile
- Modificalos haciendo comentarios línea por línea explicando las acciones realizadas
-
Anexa los archivos modificados a tu reporte
files/linux-doc/Dockerfile
yfiles/tareas-redes/Dockerfile
Dockerfile
para el contenedorlinux-doc
Dockerfile
para el contenedortareas-redes
- Modifica las variables de entorno
GIT_PROJECT
,GIT_REPO
yGIT_BRANCH
de tal manera queGITLAB_URL
apunte al repositorio donde tu equipo envía las tareas de la materia
- Modifica las variables de entorno
Construir imagenes de contenedor#
Utiliza docker build
para construir la imagen del contenedor, verifica que el TAG
corresponda a tu nombre de usuario y el contenedor linux-doc
o tareas-redes
según sea el caso
Note
- Se recomienda utilizar la opción
--progress plain
para capturar toda la salida dedocker build
- Guarda esta salida en los archivos
files/linux-doc/build-output.txt
yfiles/tareas-redes/build-output.txt
- Anexa estos archivos a tu reporte
Warning
- Necesitas construir las imagenes de contenedor en un equipo con arquitectura
x86_64
(también conocida comoamd64
) - Las imágenes no podrán ser ejecutadas en el cluster de Kubernetes en Azure si se construyen en una computadora con procesador
ARM
porque la máquina virtual de Azure tiene arquitecturax86_64
usuario@laptop ~ % TAG=tonejito/hello-nginx
usuario@laptop ~ % docker build --progress plain -t "${TAG}" ./
#1 [internal] load build definition from Dockerfile
...
#13 exporting to image
#13 sha256:a1b2c3...d4e5f6
#13 exporting layers 0.0s done
#13 writing image sha256:f6e5d4...c3b2a1 done
#12 naming to docker.io/tonejito/hello-nginx done
#13 DONE 0.0s
Lista las imagenes de contenedor#
usuario@laptop ~ % docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tonejito/tareas-redes latest cf83e1357eef 12 minutes ago 54MB
tonejito/linux-doc latest b8bdf1542850 24 minutes ago 22MB
tonejito/hello-nginx latest d66d8007d620 48 minutes ago 22MB
debian 11 e4050b5715dc 1 days ago 118MB
python 3.10-alpine 83f4a921d36c 3 days ago 46.9MB
nginx 1.22-alpine e9ce47d0d13c 5 days ago 22MB
httpd 2.4-alpine 5d85f2b0ff83 7 days ago 136MB
Enviar las imagenes de contenedor al registry#
Utiliza docker push
para enviar tus imagenes de contenedor linux-doc
y tareas-redes
al registry Docker Hub
Note
- Guarda esta salida en los archivos
files/linux-doc/push-output.txt
yfiles/tareas-redes/push-output.txt
- Anexa estos archivos a tu reporte
usuario@laptop ~ % TAG=tonejito/hello-nginx
usuario@laptop ~ % docker push "${TAG}"
Using default tag: latest
The push refers to repository [docker.io/tonejito/hello-nginx]
38b060a751ac: Pushed
96384cd9327e: Mounted from library/nginx
b1b1e36a21fd: Mounted from library/nginx
b71114be0743: Mounted from library/nginx
4c0cc7bf63f6: Mounted from library/nginx
e1da274edebf: Mounted from library/nginx
e76f65fbd51a: Mounted from tonejito/hello-nginx
latest: digest: sha256:01234...567890 size: 1024
Verifica los cambios realizados#
Revisa que tus imagenes de contenedor linux-doc
y tareas-redes
aparezcan en tu cuenta de usuario en Docker Hub
Imagenes de contenedor en Docker Hub |
---|
![]() |
Warning
- Necesitas construir las imagenes de contenedor en un equipo con arquitectura
x86_64
(también conocida comoamd64
) - Las imágenes no podrán ser ejecutadas en el cluster de Kubernetes en Azure si se construyen en una computadora con procesador
ARM
porque la máquina virtual de Azure tiene arquitecturax86_64
Danger
- Verifica que TODAS las imagenes de contenedor esten presentes antes de continuar con la siguiente sección
Note
- Continúa en la siguiente página cuando hayas terminado de construir las imagenes de contenedor y las hayas subido a Docker Hub
⇦ | ⇧ | ⇨ |
---|---|---|
Página anterior | Arriba | Página siguiente |