1. Vue d'ensemble

Lors du lancement de conteneurs Docker, nous pouvons parfois rencontrer l'erreur"name already in use by container".

Dans ce court tutoriel, nous allons examiner ce problème courant, qui est facile à résoudre.

Nous allons d'abord montrer comment provoquer cette erreur, puis en expliquer la raison. Enfin, nous montrerons comment la corriger.

2. Comment provoquer l'erreur

2.1. Obtenir une image Docker

Choisissons d'abord une image Docker pour notre exemple.

Nous allons utiliser l'image de démonstration gratuite et publique de Nginx. NGINX est un serveur web gratuit et open-source utilisé par de nombreuses entreprises comme Netflix, CloudFare et Airbnb. L'image de démonstration Docker que nous allons utiliser sert une page Web avec quelques propriétés de base telles que le nom d'hôte, l'adresse IP et le port.

2.2. Exécution de plusieurs conteneurs et cause de l'erreur

Afin de provoquer l'erreur, nous devons exécuter deux instances qui utiliseront le même nom, baeldung_nginx.

Il convient de se demander pourquoi nous avons besoin d'un nom pour un conteneur. Les noms peuvent être un moyen pratique d'ajouter un sens à la liste des conteneurs en cours d'exécution. De plus, le nom peut être utilisé comme référence dans le réseau Docker.

Commençons par le premier conteneur :

docker run --name kovsky_nginx -p 80:80 -d nginxdemos/hello:plain-text

Nous exécutons le conteneur en mode détaché, ce qui signifie qu'il fonctionnera en arrière-plan. Nous publions le port 80 du conteneur sur le même port de la machine hôte. Enfin, nous avons spécifié notre nom personnalisé pour le conteneur - kovsky_nginx.

Maintenant, si nous ouvrons http://localhost dans notre navigateur, nous devrions voir quelque chose de similaire à ceci :

docker: Error response from daemon: Conflict. The container name "/kovsky_nginx" is already in use by container "76da8f6d3accc9b6d41c8a98fd492d4b8622804220ee628a438264b8cf4ae3d4". 
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

3. Expliquer la cause profonde de l'erreur

Chaque conteneur Docker a un nom unique qui lui est attribué. Si nous n'utilisons pas l'argument facultatif name dans la commande docker run, Docker attribue un nom aléatoire.

Dans notre cas, nous voulions attribuer le même nom, kovsky_nginx, à deux conteneurs différents. Nous devons noter que même si nous utilisons la même image Docker, chaque commande docker run crée un nouveau conteneur.

Comme le deuxième conteneur ne pouvait pas utiliser un nom déjà utilisé, nous avons obtenu l'erreur suivante.

4. Comment le réparer

4.1. Redémarrage du conteneur

Cette solution s'applique au cas où le conteneur Docker nommé kovsky_nginx existe déjà dans le système, et c'est l'état correct. Dans ce cas, nous ne voulons pas avoir deux instances différentes avec le même nom. Au lieu de cela, nous voulons redémarrer le conteneur déjà existant.

Afin de redémarrer le conteneur existant, nous devons utiliser la commandedocker start au lieu de la commandedocker run.

docker run crée un nouveau conteneur d'une image. On peut créer autant de clones de la même image que possible. D'autre part, docker start lance un conteneur précédemment arrêté.

Ainsi, il se peut que nous n'essayions pas de lancer un nouveau conteneur mais plutôt de redémarrer le conteneur existant, auquel cas c'est la solution. Cependant, nous voulons parfois lancer un remplacement du conteneur existant avec une nouvelle image.

4.2. Suppression d'un conteneur existant

Lorsque nous sommes sûrs que nous voulons que notre nouveau conteneur reprenne le nom, et que nous avons arrêté tout autre conteneur portant ce nom, nous pouvons simplement supprimer le précédent conteneur portant ce nom :

docker rm kovsky_nginx

Malheureusement, cette commande ne fonctionne pas toujours. Par exemple, d'autres conteneurs peuvent avoir besoin de notre conteneur pour fonctionner correctement. Si c'est le cas et que nous voulons quand même supprimer notre conteneur, nous pouvons utiliser l'indicateur force dans la commande remove :

docker rm -f kovsky_nginx

Une fois que le conteneur précédent a été retiré, nous sommes libres de lancer un nouveau conteneur avec le nom de notre choix.

4.3. Utiliser des noms différents pour les conteneurs

Que faire si nous voulons exécuter deux instances de la même image ? La solution pour ce cas est simple. Tout ce que nous avons à faire est d'utiliser deux noms différents ainsi que des ports différents :

docker run --name kovsky_nginx_1 -p 80:80 -d nginxdemos/hello:plain-text

docker run --name kovsky_nginx_2 -p 81:80 -d nginxdemos/hello:plain-text

docker ps

Nous devrions voir quelque chose de similaire à ceci :

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                NAMES
f341bb9fe165   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   2 seconds ago    Up 2 seconds    0.0.0.0:81->80/tcp   kovsky_nginx_2
33883c2b31a7   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp   kovsky_nginx_1

5. Conclusion

Dans cet article, nous avons appris comment corriger l'erreur "nom déjà utilisé par le conteneur" dans Docker.

Tout d'abord, nous avons vu comment reproduire l'erreur. Ensuite, nous avons examiné la cause profonde de l'erreur.

Enfin, nous avons vu trois solutions différentes pour résoudre le problème.