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

Exécuter votre image Rust en tant que conteneur

Prérequis

Vous avez terminé Construire votre image Rust et vous avez construit une image.

Aperçu

Un conteneur est un processus normal du système d'exploitation, à la différence près que Docker isole ce processus de manière à ce qu'il dispose de son propre système de fichiers, de son propre réseau et de son propre arbre de processus isolé, distinct de l'hôte.

Pour exécuter une image à l'intérieur d'un conteneur, vous utilisez la commande docker run. La commande docker run nécessite un paramètre, qui est le nom de l'image.

Exécuter une image

Utilisez docker run pour exécuter l'image que vous avez construite dans Construire votre image Rust.

$ docker run docker-rust-image

Après avoir exécuté cette commande, vous remarquerez que vous n'êtes pas revenu à l'invite de commande. C'est parce que votre application est un serveur qui s'exécute en boucle en attendant les requêtes entrantes sans rendre le contrôle au système d'exploitation jusqu'à ce que vous arrêtiez le conteneur.

Ouvrez un nouveau terminal puis faites une requête au serveur en utilisant la commande curl.

$ curl http://localhost:8000

Vous devriez voir une sortie comme celle-ci.

curl: (7) Échec de la connexion à localhost port 8000 après 2236 ms: Impossible de se connecter au serveur

Comme vous pouvez le voir, votre commande curl a échoué. Cela signifie que vous n'avez pas pu vous connecter à localhost sur le port 8000. C'est normal car votre conteneur s'exécute de manière isolée, ce qui inclut le réseau. Arrêtez le conteneur et redémarrez-le avec le port 8000 publié sur votre réseau local.

Pour arrêter le conteneur, appuyez sur ctrl-c. Cela vous ramènera à l'invite du terminal.

Pour publier un port pour votre conteneur, vous utiliserez le drapeau --publish (ou -p en abrégé) sur la commande docker run. Le format de la commande --publish est [port de l'hôte]:[port du conteneur]. Ainsi, si vous vouliez exposer le port 8000 à l'intérieur du conteneur au port 3001 à l'extérieur du conteneur, vous passeriez 3001:8000 au drapeau --publish.

Vous n'avez pas spécifié de port lors de l'exécution de l'application dans le conteneur et la valeur par défaut est 8000. Si vous voulez que votre requête précédente allant au port 8000 fonctionne, vous pouvez mapper le port 3001 de l'hôte au port 8000 du conteneur :

$ docker run --publish 3001:8000 docker-rust-image

Maintenant, réexécutez la commande curl. N'oubliez pas d'ouvrir un nouveau terminal.

$ curl http://localhost:3001

Vous devriez voir une sortie comme celle-ci.

Hello, Docker!

Succès ! Vous avez pu vous connecter à l'application s'exécutant à l'intérieur de votre conteneur sur le port 8000. Retournez au terminal où votre conteneur s'exécute et arrêtez-le.

Appuyez sur ctrl-c pour arrêter le conteneur.

Exécuter en mode détaché

C'est très bien jusqu'à présent, mais votre application d'exemple est un serveur web et vous n'avez pas besoin d'être connecté au conteneur. Docker peut exécuter votre conteneur en mode détaché ou en arrière-plan. Pour ce faire, vous pouvez utiliser le --detach ou -d en abrégé. Docker démarre votre conteneur de la même manière qu'auparavant, mais cette fois-ci, il se "détache" du conteneur et vous ramène à l'invite du terminal.

$ docker run -d -p 3001:8000 docker-rust-image
ce02b3179f0f10085db9edfccd731101868f58631bdf918ca490ff6fd223a93b

Docker a démarré votre conteneur en arrière-plan et a imprimé l'ID du conteneur sur le terminal.

Encore une fois, assurez-vous que votre conteneur s'exécute correctement. Exécutez à nouveau la commande curl.

$ curl http://localhost:3001

Vous devriez voir une sortie comme celle-ci.

Hello, Docker!

Lister les conteneurs

Puisque vous avez exécuté votre conteneur en arrière-plan, comment savez-vous si votre conteneur est en cours d'exécution ou quels autres conteneurs sont en cours d'exécution sur votre machine ? Eh bien, pour voir une liste des conteneurs en cours d'exécution sur votre machine, exécutez docker ps. C'est similaire à la façon dont vous utilisez la commande ps sous Linux pour voir une liste de processus.

Vous devriez voir une sortie comme celle-ci.

CONTAINER ID   IMAGE                   COMMAND         CREATED         STATUS         PORTS                    NAMES
3074745e412c   docker-rust-image       "/bin/server"   8 seconds ago   Up 7 seconds   0.0.0.0:3001->8000/tcp   wonderful_kalam

La commande docker ps fournit un tas d'informations sur vos conteneurs en cours d'exécution. Vous pouvez voir l'ID du conteneur, l'image s'exécutant à l'intérieur du conteneur, la commande qui a été utilisée pour démarrer le conteneur, quand il a été créé, l'état, les ports qui ont été exposés et le nom du conteneur.

Vous vous demandez probablement d'où vient le nom de votre conteneur. Comme vous n'avez pas fourni de nom pour le conteneur lorsque vous l'avez démarré, Docker a généré un nom aléatoire. Vous allez corriger cela dans une minute, mais vous devez d'abord arrêter le conteneur. Pour arrêter le conteneur, exécutez la commande docker stop qui fait exactement cela, arrête le conteneur. Vous devez passer le nom du conteneur ou vous pouvez utiliser l'ID du conteneur.

$ docker stop wonderful_kalam
wonderful_kalam

Maintenant, réexécutez la commande docker ps pour voir une liste des conteneurs en cours d'exécution.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Arrêter, démarrer et nommer les conteneurs

Vous pouvez démarrer, arrêter et redémarrer les conteneurs Docker. Lorsque vous arrêtez un conteneur, il n'est pas supprimé, mais son état passe à arrêté et le processus à l'intérieur du conteneur est arrêté. Lorsque vous avez exécuté la commande docker ps dans le module précédent, la sortie par défaut n'affiche que les conteneurs en cours d'exécution. Lorsque vous passez le --all ou -a en abrégé, vous voyez tous les conteneurs de votre machine, quel que soit leur état de démarrage ou d'arrêt.

$ docker ps -a
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS                      PORTS
     NAMES
3074745e412c   docker-rust-image       "/bin/server"            3 minutes ago    Exited (0) 6 seconds ago
     wonderful_kalam
6cfa26e2e3c9   docker-rust-image       "/bin/server"            14 minutes ago   Exited (0) 5 minutes ago
     friendly_montalcini
4cbe94b2ea0e   docker-rust-image       "/bin/server"            15 minutes ago   Exited (0) 14 minutes ago
     tender_bose

Vous devriez maintenant voir plusieurs conteneurs listés. Ce sont des conteneurs que vous avez démarrés et arrêtés mais que vous n'avez pas supprimés.

Redémarrez le conteneur que vous venez d'arrêter. Localisez le nom du conteneur que vous venez d'arrêter et remplacez le nom du conteneur dans la commande de redémarrage suivante.

$ docker restart wonderful_kalam

Maintenant, listez à nouveau tous les conteneurs à l'aide de la commande docker ps.

$ docker ps --all
CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS                      PORTS
     NAMES
3074745e412c   docker-rust-image       "/bin/server"            6 minutes ago    Up 4 seconds                0.0.0.0:3001->8000/tcp           wonderful_kalam
6cfa26e2e3c9   docker-rust-image       "/bin/server"            16 minutes ago   Exited (0) 7 minutes ago
     friendly_montalcini
4cbe94b2ea0e   docker-rust-image       "/bin/server"            18 minutes ago   Exited (0) 17 minutes ago
     tender_bose

Notez que le conteneur que vous venez de redémarrer a été démarré en mode détaché. Observez également que l'état du conteneur est "Up X seconds". Lorsque vous redémarrez un conteneur, il démarre avec les mêmes drapeaux ou commandes avec lesquels il a été démarré à l'origine.

Maintenant, arrêtez et supprimez tous vos conteneurs et jetez un œil à la résolution du problème de nommage aléatoire. Arrêtez le conteneur que vous venez de démarrer. Trouvez le nom de votre conteneur en cours d'exécution et remplacez le nom dans la commande suivante par le nom du conteneur sur votre système.

$ docker stop wonderful_kalam
wonderful_kalam

Maintenant que vous avez arrêté tous vos conteneurs, supprimez-les. Lorsque vous supprimez un conteneur, il n'est plus en cours d'exécution, ni à l'état arrêté, mais le processus à l'intérieur du conteneur a été arrêté et les métadonnées du conteneur ont été supprimées.

Pour supprimer un conteneur, exécutez la commande docker rm avec le nom du conteneur. Vous pouvez passer plusieurs noms de conteneurs à la commande en une seule commande. Encore une fois, remplacez les noms de conteneurs dans la commande suivante par les noms de conteneurs de votre système.

$ docker rm wonderful_kalam friendly_montalcini tender_bose
wonderful_kalam
friendly_montalcini
tender_bose

Exécutez à nouveau la commande docker ps --all pour voir que Docker a supprimé tous les conteneurs.

Maintenant, il est temps de s'attaquer au problème de nommage aléatoire. La pratique standard consiste à nommer vos conteneurs pour la simple raison qu'il est plus facile d'identifier ce qui s'exécute dans le conteneur et à quelle application ou service il est associé.

Pour nommer un conteneur, il vous suffit de passer le drapeau --name à la commande docker run.

$ docker run -d -p 3001:8000 --name docker-rust-container docker-rust-image
1aa5d46418a68705c81782a58456a4ccdb56a309cb5e6bd399478d01eaa5cdda
$ docker ps
CONTAINER ID   IMAGE                   COMMAND         CREATED         STATUS         PORTS                    NAMES
c68fa18de1f6   docker-rust-image       "/bin/server"   7 seconds ago   Up 6 seconds   0.0.0.0:3001->8000/tcp   docker-rust-container

C'est mieux ! Vous pouvez maintenant facilement identifier votre conteneur en fonction de son nom.

Résumé

Dans cette section, vous avez examiné l'exécution de conteneurs. Vous avez également examiné la gestion des conteneurs en les démarrant, en les arrêtant et en les redémarrant. Et enfin, vous avez examiné le nommage de vos conteneurs afin qu'ils soient plus facilement identifiables.

Informations connexes :

Prochaines étapes

Dans la section suivante, vous apprendrez à exécuter une base de données dans un conteneur et à la connecter à une application Rust.