⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Construire, marquer et publier une image

Explication

Dans ce guide, vous apprendrez ce qui suit :

  • Construire des images - le processus de construction d'une image basé sur un Dockerfile
  • Marquer des images - le processus de donner un nom à une image, qui détermine également où l'image peut être distribuée
  • Publier des images - le processus de distribution ou de partage de l'image nouvellement créée à l'aide d'un registre de conteneurs

Construire des images

Le plus souvent, les images sont construites à l'aide d'un Dockerfile. La commande docker build la plus basique pourrait ressembler à ce qui suit :

docker build .

Le . final de la commande fournit le chemin ou l'URL du contexte de construction. À cet emplacement, le constructeur trouvera le Dockerfile et d'autres fichiers référencés.

Lorsque vous exécutez une construction, le constructeur extrait l'image de base, si nécessaire, puis exécute les instructions spécifiées dans le Dockerfile.

Avec la commande précédente, l'image n'aura pas de nom, mais la sortie fournira l'ID de l'image. Par exemple, la commande précédente pourrait produire la sortie suivante :

$ 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

Avec la sortie précédente, vous pourriez démarrer un conteneur en utilisant l'image référencée :

docker run sha256:9924dfd9350407b3df01d1a0e1033b1e543523ce7d5d5e2c83a724480ebe8f00

Ce nom n'est certainement pas mémorable, c'est là que le marquage devient utile.

Marquer des images

Le marquage des images est la méthode pour donner à une image un nom mémorable. Cependant, il y a une structure au nom d'une image. Un nom d'image complet a la structure suivante :

[HÔTE[:NUMÉRO_PORT]/]CHEMIN[:MARQUE]
  • HÔTE : Le nom d'hôte de registre facultatif où l'image est située. Si aucun hôte n'est spécifié, le registre public de Docker à docker.io est utilisé par défaut.
  • NUMÉRO_PORT : Le numéro de port du registre si un nom d'hôte est fourni
  • CHEMIN : Le chemin de l'image, composé de composants séparés par des barres obliques. Pour Docker Hub, le format suit [ESPACE_DE_NOMS/]DÉPÔT, où l'espace de noms est soit le nom d'un utilisateur, soit celui d'une organisation. Si aucun espace de noms n'est spécifié, library est utilisé, qui est l'espace de noms pour les images officielles Docker.
  • MARQUE : Un identifiant personnalisé et lisible par l'homme qui est généralement utilisé pour identifier différentes versions ou variantes d'une image. Si aucune marque n'est spécifiée, latest est utilisé par défaut.

Voici quelques exemples de noms d'images :

  • nginx, équivalent à docker.io/library/nginx:latest : cela extrait une image du registre docker.io, de l'espace de noms library, du dépôt d'images nginx et de la marque latest.
  • docker/welcome-to-docker, équivalent à docker.io/docker/welcome-to-docker:latest : cela extrait une image du registre docker.io, de l'espace de noms docker, du dépôt d'images welcome-to-docker et de la marque latest
  • ghcr.io/dockersamples/example-voting-app-vote:pr-311 : cela extrait une image du registre de conteneurs GitHub, de l'espace de noms dockersamples, du dépôt d'images example-voting-app-vote et de la marque pr-311

Pour marquer une image lors d'une construction, ajoutez l'indicateur -t ou --tag :

docker build -t mon-nom-d-utilisateur/mon-image .

Si vous avez déjà construit une image, vous pouvez ajouter une autre marque à l'image en utilisant la commande docker image tag :

docker image tag mon-nom-d-utilisateur/mon-image autre-nom-d-utilisateur/autre-image:v1

Publier des images

Une fois que vous avez une image construite et marquée, vous êtes prêt à la pousser vers un registre. Pour ce faire, utilisez la commande docker push :

docker push mon-nom-d-utilisateur/mon-image

En quelques secondes, toutes les couches de votre image seront poussées vers le registre.

Authentification requise

Avant de pouvoir pousser une image vers un dépôt, vous devrez être authentifié. Pour ce faire, utilisez simplement la commande docker login.

Essayez-le

Dans ce guide pratique, vous allez construire une image simple à l'aide d'un Dockerfile fourni et la pousser vers Docker Hub.

Configuration

  1. Obtenez l'application exemple.

    Si vous avez Git, vous pouvez cloner le dépôt de l'application exemple. Sinon, vous pouvez télécharger l'application exemple. Choisissez l'une des options suivantes.

    Utilisez la commande suivante dans un terminal pour cloner le dépôt de l'application exemple.
    
    ```console
    $ git clone https://github.com/docker/getting-started-todo-app
    ```
    
    Téléchargez la source et extrayez-la.
    
    
    <div class="button not-prose">
      <a href="https://github.com/docker/getting-started-todo-app/raw/cd61f824da7a614a8298db503eed6630eeee33a3/app.zip">Télécharger la source</a>
    </div>
    
  2. Téléchargez et installez Docker Desktop.

  3. Si vous n'avez pas encore de compte Docker, créez-en un maintenant. Une fois que vous avez fait cela, connectez-vous à Docker Desktop en utilisant ce compte.

Construire une image

Maintenant que vous avez un dépôt sur Docker Hub, il est temps pour vous de construire une image et de la pousser vers le dépôt.

  1. En utilisant un terminal à la racine du dépôt de l'application exemple, exécutez la commande suivante. Remplacez VOTRE_NOM_D_UTILISATEUR_DOCKER par votre nom d'utilisateur Docker Hub :

    $ docker build -t <VOTRE_NOM_D_UTILISATEUR_DOCKER>/concepts-build-image-demo .
    

    Par exemple, si votre nom d'utilisateur est mobywhale, vous exécuteriez la commande :

    $ docker build -t mobywhale/concepts-build-image-demo .
    
  2. Une fois la construction terminée, vous pouvez afficher l'image en utilisant la commande suivante :

    $ docker image ls
    

    La commande produira une sortie similaire à la suivante :

    REPOSITORY                             TAG       IMAGE ID       CREATED          SIZE
    mobywhale/concepts-build-image-demo    latest    746c7e06537f   24 seconds ago   354MB
  3. Vous pouvez réellement afficher l'historique (ou comment l'image a été créée) en utilisant la commande docker image history :

    $ docker image history mobywhale/concepts-build-image-demo
    

    Vous verrez alors une sortie similaire à la suivante :

    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.42MB

    Cette sortie montre les couches de l'image, en mettant en évidence les couches que vous avez ajoutées et celles qui ont été héritées de votre image de base.

Pousser l'image

Maintenant que vous avez une image construite, il est temps de pousser l'image vers un registre.

  1. Poussez l'image en utilisant la commande docker push :

    $ docker push <VOTRE_NOM_D_UTILISATEUR_DOCKER>/concepts-build-image-demo
    

    Si vous recevez un accès refusé à la ressource demandée, assurez-vous d'être à la fois connecté et que votre nom d'utilisateur Docker est correct dans l'étiquette de l'image.

    Après quelques instants, votre image devrait être poussée vers Docker Hub.

Ressources supplémentaires

Pour en savoir plus sur la construction, le marquage et la publication d'images, visitez les ressources suivantes :

Étapes suivantes

Maintenant que vous avez appris à construire et à publier des images, il est temps d'apprendre à accélérer le processus de construction en utilisant le cache de construction Docker.