Compilar, etiquetar y publicar una imagen
Explicación
En esta guía, aprenderás lo siguiente:
- Compilar imágenes: el proceso de compilar una imagen basada en un
Dockerfile - Etiquetar imágenes: el proceso de dar un nombre a una imagen, lo que también determina dónde se puede distribuir la imagen
- Publicar imágenes: el proceso para distribuir o compartir la imagen recién creada utilizando un registro de contenedores
Compilar imágenes
La mayoría de las veces, las imágenes se compilan utilizando un Dockerfile. El comando docker build más básico podría verse así:
docker build .El . final en el comando proporciona la ruta o URL al contexto de compilación. En esta ubicación, el compilador encontrará el Dockerfile y otros archivos de referencia.
Cuando ejecutas una compilación, el compilador descarga la imagen base, si es necesario, y luego ejecuta las instrucciones especificadas en el Dockerfile.
Con el comando anterior, la imagen no tendrá nombre, pero la salida proporcionará el ID de la imagen. Como ejemplo, el comando anterior podría producir la siguiente salida:
$ docker build .
[+] Building 3.5s (11/11) FINISHED docker:desktop-linux
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 308B 0.0s
=> [internal] load metadata for docker.io/library/python:3.12 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/6] FROM docker.io/library/python:3.12 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 123B 0.0s
=> [2/6] WORKDIR /usr/local/app 0.0s
=> [3/6] RUN useradd app 0.1s
=> [4/6] COPY ./requirements.txt ./requirements.txt 0.0s
=> [5/6] RUN pip install --no-cache-dir --upgrade -r requirements.txt 3.2s
=> [6/6] COPY ./app ./app 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00 0.0s
Con la salida anterior, podrías iniciar un contenedor utilizando la imagen de referencia:
docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00
Ese nombre ciertamente no es memorable, que es donde el etiquetado resulta útil.
Etiquetar imágenes
Etiquetar imágenes es el método para proporcionar a una imagen un nombre memorable. Sin embargo, hay una estructura para el nombre de una imagen. Un nombre completo de imagen tiene la siguiente estructura:
[HOST[:PORT_NUMBER]/]PATH[:TAG]HOST: El nombre de host opcional del registro donde se encuentra la imagen. Si no se especifica ningún host, se utiliza de forma predeterminada el registro público de Docker endocker.io.PORT_NUMBER: El número de puerto del registro si se proporciona un nombre de hostPATH: La ruta de la imagen, que consta de componentes separados por barras diagonales. Para Docker Hub, el formato sigue la estructura[NAMESPACE/]REPOSITORY, donde el espacio de nombres (namespace) es el nombre de un usuario o de una organización. Si no se especifica ningún espacio de nombres, se utilizalibrary, que es el espacio de nombres para las Imágenes Oficiales de Docker.TAG: Un identificador personalizado y legible por humanos que se suele utilizar para identificar diferentes versiones o variantes de una imagen. Si no se especifica ninguna etiqueta, se utilizalatestde forma predeterminada.
Algunos ejemplos de nombres de imágenes incluyen:
nginx, equivalente adocker.io/library/nginx:latest: descarga una imagen del registrodocker.io, del espacio de nombreslibrary, del repositorio de imágenesnginxy con la etiquetalatest.docker/welcome-to-docker, equivalente adocker.io/docker/welcome-to-docker:latest: descarga una imagen del registrodocker.io, del espacio de nombresdocker, del repositorio de imágeneswelcome-to-dockery con la etiquetalatest.ghcr.io/dockersamples/example-voting-app-vote:pr-311: descarga una imagen del GitHub Container Registry, del espacio de nombresdockersamples, del repositorio de imágenesexample-voting-app-votey con la etiquetapr-311.
Para etiquetar una imagen durante una compilación, añade la bandera -t o --tag:
docker build -t my-username/my-image .
Si ya has compilado una imagen, puedes añadirle otra etiqueta utilizando el comando docker image tag:
docker image tag my-username/my-image another-username/another-image:v1
Publicar imágenes
Una vez que tengas una imagen compilada y etiquetada, estarás listo para subirla a un registro. Para hacerlo, utiliza el comando docker push:
docker push my-username/my-image
En unos pocos segundos, todas las capas de tu imagen se subirán al registro.
Se requiere autenticación
Antes de poder subir una imagen a un repositorio, deberás estar autenticado. Para hacerlo, simplemente utiliza el comando docker login.
Pruébalo
En esta guía práctica, compilarás una imagen simple utilizando un Dockerfile proporcionado y la subirás a Docker Hub.
Configuración
Obtén la aplicación de muestra.
Si tienes Git, puedes clonar el repositorio de la aplicación de muestra. De lo contrario, puedes descargar la aplicación de muestra. Elige una de las siguientes opciones.
Utiliza el siguiente comando en una terminal para clonar el repositorio de la aplicación de muestra.
$ git clone https://github.com/docker/getting-started-todo-appDescarga el código fuente y extráelo.
Descarga e instala Docker Desktop.
Si aún no tienes una cuenta de Docker, crea una ahora. Una vez hecho esto, inicia sesión en Docker Desktop con esa cuenta.
Compilar una imagen
Ahora que tienes un repositorio en Docker Hub, es hora de que compiles una imagen y la subas al repositorio.
Utilizando una terminal en la raíz del repositorio de la aplicación de muestra, ejecuta el siguiente comando. Reemplaza
YOUR_DOCKER_USERNAMEcon tu nombre de usuario de Docker Hub:$ docker build -t <YOUR_DOCKER_USERNAME>/concepts-build-image-demo .Como ejemplo, si tu nombre de usuario es
mobywhale, ejecutarías el comando:$ docker build -t mobywhale/concepts-build-image-demo .Una vez finalizada la compilación, puedes ver la imagen utilizando el siguiente comando:
$ docker image lsEl comando producirá una salida similar a la siguiente:
REPOSITORY TAG IMAGE ID CREATED SIZE mobywhale/concepts-build-image-demo latest 746c7e06537f 24 seconds ago 354MBPuedes ver el historial (o cómo se creó la imagen) utilizando el comando docker image history:
$ docker image history mobywhale/concepts-build-image-demoA continuación, verás una salida similar a la siguiente:
IMAGE CREATED CREATED BY SIZE COMMENT f279389d5f01 8 seconds ago CMD ["node" "./src/index.js"] 0B buildkit.dockerfile.v0 <missing> 8 seconds ago EXPOSE map[3000/tcp:{}] 0B buildkit.dockerfile.v0 <missing> 8 seconds ago WORKDIR /app 8.19kB buildkit.dockerfile.v0 <missing> 4 days ago /bin/sh -c #(nop) CMD ["node"] 0B <missing> 4 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B <missing> 4 days ago /bin/sh -c #(nop) COPY file:4d192565a7220e13… 20.5kB <missing> 4 days ago /bin/sh -c apk add --no-cache --virtual .bui… 7.92MB <missing> 4 days ago /bin/sh -c #(nop) ENV YARN_VERSION=1.22.19 0B <missing> 4 days ago /bin/sh -c addgroup -g 1000 node && addu… 126MB <missing> 4 days ago /bin/sh -c #(nop) ENV NODE_VERSION=20.12.0 0B <missing> 2 months ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B <missing> 2 months ago /bin/sh -c #(nop) ADD file:d0764a717d1e9d0af… 8.42MBEsta salida muestra las capas de la imagen, destacando las capas que añadiste y las que heredaste de tu imagen base.
Subir la imagen
Ahora que tienes una imagen compilada, es hora de subirla a un registro.
Sube la imagen utilizando el comando docker push:
$ docker push <YOUR_DOCKER_USERNAME>/concepts-build-image-demoSi recibes un error de tipo
requested access to the resource is denied, asegúrate de haber iniciado sesión y de que tu nombre de usuario de Docker sea correcto en la etiqueta de la imagen.Después de un momento, tu imagen debería subirse a Docker Hub.
Recursos adicionales
Para obtener más información sobre cómo compilar, etiquetar y publicar imágenes, visita los siguientes recursos:
- ¿Qué es un contexto de compilación?
- Referencia de docker build
- Referencia de docker image tag
- Referencia de docker push
- ¿Qué es un registro?
Siguientes pasos
Ahora que has aprendido a compilar y publicar imágenes, es hora de aprender cómo acelerar el proceso de compilación utilizando la caché de compilación de Docker.
Utilizar la caché de compilación