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.