Exécuter votre image Go en tant que conteneur
Prérequis
Parcourez les étapes pour conteneuriser une application Go dans Construire votre image Go.
Aperçu
Dans le module précédent, vous avez créé un Dockerfile
pour votre application d'exemple, puis vous avez créé votre image Docker à l'aide de la commande docker build
. Maintenant que vous avez l'image, vous pouvez exécuter cette image et voir si votre application fonctionne correctement.
Un conteneur est un processus de système d'exploitation normal, sauf que ce processus est isolé et possède son propre système de fichiers, son propre réseau et 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
. Elle nécessite un paramètre, qui est le nom de l'image. Démarrez votre image et assurez-vous qu'elle fonctionne correctement. Exécutez la commande suivante dans votre terminal.
$ docker run docker-gs-ping
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.10.2
Framework web Go minimaliste et haute performance
https://echo.labstack.com
____________________________________O/_______
O\
⇨ http server started on [::]:8080
Lorsque vous exécutez cette commande, vous remarquerez que vous n'êtes pas revenu à l'invite de commande. C'est parce que votre application est un serveur REST et qu'elle s'exécutera dans une boucle en attente de requêtes entrantes sans rendre le contrôle au système d'exploitation jusqu'à ce que vous arrêtiez le conteneur.
Effectuez une requête GET sur le serveur à l'aide de la commande curl.
$ curl http://localhost:8080/
curl: (7) Failed to connect to localhost port 8080: Connection refused
Votre commande curl a échoué car la connexion à votre serveur a été refusée. Cela signifie que vous n'avez pas pu vous connecter à localhost sur le port 8080. C'est attendu 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 8080 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 l'indicateur --publish
(ou -p
en abrégé) dans la commande docker run
. Le format de la commande --publish
est [port_hôte]:[port_conteneur]
. Donc, si vous vouliez exposer le port 8080
à l'intérieur du conteneur au port 3000
à l'extérieur du conteneur, vous passeriez 3000:8080
à l'indicateur --publish
.
Démarrez le conteneur et exposez le port 8080
au port 8080
sur l'hôte.
$ docker run --publish 8080:8080 docker-gs-ping
Maintenant, réexécutez la commande curl.
$ curl http://localhost:8080/
Hello, Docker! <3
Succès ! Vous avez pu vous connecter à l'application s'exécutant à l'intérieur de votre conteneur sur le port 8080. Revenez au terminal où votre conteneur s'exécute et vous devriez voir la requête GET
enregistrée dans la console.
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
ne devriez pas avoir à connecter votre terminal au conteneur. Docker peut exécuter
votre conteneur en mode détaché en arrière-plan. Pour ce faire, vous pouvez utiliser le drapeau
--detach
ou -d
en abrégé. Docker démarrera votre conteneur de la même manière qu'auparavant
mais cette fois, il se détachera du conteneur et vous rendra l'invite du terminal.
$ docker run -d -p 8080:8080 docker-gs-ping
d75e61fcad1e0c0eca69a3f767be6ba28a66625ce4dc42201a8a323e8313c14e
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 fonctionne. Exécutez la même commande curl
:
$ curl http://localhost:8080/
Hello, Docker! <3
Lister les conteneurs
Puisque vous avez exécuté votre conteneur en arrière-plan, comment savez-vous si votre conteneur fonctionne ou quels autres conteneurs s'exécutent 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 la commande ps est utilisée pour voir une liste de processus sur une machine Linux.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d75e61fcad1e docker-gs-ping "/docker-gs-ping" 41 seconds ago Up 40 seconds 0.0.0.0:8080->8080/tcp inspiring_ishizaka
La commande ps
vous donne 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 sont exposés et les noms 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 corrigerez cela dans une minute, mais vous devez d'abord arrêter le conteneur. Pour arrêter le conteneur, exécutez la commande docker stop
, en passant le nom ou l'ID du conteneur.
$ docker stop inspiring_ishizaka
inspiring_ishizaka
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
Les conteneurs Docker peuvent être démarrés, arrêtés et redémarrés. Lorsque vous arrêtez un conteneur, il n'est pas supprimé mais l'état passe à arrêté et le processus à l'intérieur du conteneur est arrêté. Lorsque vous avez exécuté la commande docker ps
, la sortie par défaut consiste à n'afficher que les conteneurs en cours d'exécution. Si vous passez le drapeau --all
ou -a
en abrégé, vous verrez tous les conteneurs sur votre système, y compris les conteneurs arrêtés et en cours d'exécution.
$ docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d75e61fcad1e docker-gs-ping "/docker-gs-ping" About a minute ago Exited (2) 23 seconds ago inspiring_ishizaka
f65dbbb9a548 docker-gs-ping "/docker-gs-ping" 3 minutes ago Exited (2) 2 minutes ago wizardly_joliot
aade1bf3d330 docker-gs-ping "/docker-gs-ping" 3 minutes ago Exited (2) 3 minutes ago magical_carson
52d5ce3c15f0 docker-gs-ping "/docker-gs-ping" 9 minutes ago Exited (2) 3 minutes ago gifted_mestorf
Si vous avez suivi, vous devriez 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 encore supprimés.
Redémarrez le conteneur que vous venez d'arrêter. Localisez le nom du conteneur et remplacez le nom du conteneur dans la commande restart
suivante :
$ docker restart inspiring_ishizaka
Maintenant, listez à nouveau tous les conteneurs à l'aide de la commande ps
:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d75e61fcad1e docker-gs-ping "/docker-gs-ping" 2 minutes ago Up 5 seconds 0.0.0.0:8080->8080/tcp inspiring_ishizaka
f65dbbb9a548 docker-gs-ping "/docker-gs-ping" 4 minutes ago Exited (2) 2 minutes ago wizardly_joliot
aade1bf3d330 docker-gs-ping "/docker-gs-ping" 4 minutes ago Exited (2) 4 minutes ago magical_carson
52d5ce3c15f0 docker-gs-ping "/docker-gs-ping" 10 minutes ago Exited (2) 4 minutes ago gifted_mestorf
Notez que le conteneur que vous venez de redémarrer a été démarré en mode détaché et expose le port 8080
. Notez également que l'état du conteneur est Up X seconds
. Lorsque vous redémarrez un conteneur, il sera démarré avec les mêmes indicateurs ou commandes que ceux avec lesquels il a été démarré à l'origine.
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 inspiring_ishizaka
inspiring_ishizaka
Maintenant que tous vos conteneurs sont arrêtés, supprimez-les. Lorsqu'un conteneur est supprimé, il n'est plus en cours d'exécution ni à l'état arrêté. Au lieu de cela, le processus à l'intérieur du conteneur est terminé et les métadonnées du conteneur sont supprimées.
Pour supprimer un conteneur, exécutez la commande docker rm
en passant le nom du conteneur. Vous pouvez passer plusieurs noms de conteneurs à la commande en une seule commande.
Encore une fois, assurez-vous de remplacer les noms des conteneurs dans la commande suivante par les noms des conteneurs de votre système :
$ docker rm inspiring_ishizaka wizardly_joliot magical_carson gifted_mestorf
inspiring_ishizaka
wizardly_joliot
magical_carson
gifted_mestorf
Exécutez à nouveau la commande docker ps --all
pour vérifier que tous les conteneurs ont disparu.
Maintenant, attaquons-nous au problème embêtant du nom 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é. Tout comme de bonnes conventions de nommage pour les variables dans votre code le rendent plus simple à lire. Il en va de même pour le nommage de vos conteneurs.
Pour nommer un conteneur, vous devez passer l'indicateur --name
à la commande run
:
$ docker run -d -p 8080:8080 --name rest-server docker-gs-ping
3bbc6a3102ea368c8b966e1878a5ea9b1fc61187afaac1276c41db22e4b7f48f
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3bbc6a3102ea docker-gs-ping "/docker-gs-ping" 25 seconds ago Up 24 seconds 0.0.0.0:8080->8080/tcp rest-server
Maintenant, vous pouvez facilement identifier votre conteneur en fonction de son nom.
Prochaines étapes
Dans ce module, vous avez appris à exécuter des conteneurs et à publier des ports. Vous avez également appris à gérer le cycle de vie des conteneurs. Vous avez ensuite appris l'importance de nommer vos conteneurs afin qu'ils soient plus facilement identifiables. Dans le prochain module, vous apprendrez à exécuter une base de données dans un conteneur et à la connecter à votre application.