Comment modifier la configuration des conteneurs Docker en cours d’exécution
Les conteneurs Docker sont généralement traités comme immuables une fois qu’ils ont commencé à s’exécuter. Vous pouvez cependant mettre à jour dynamiquement certains paramètres de configuration, tels que le nom du conteneur et ses limites de ressources matérielles.
Dans ce guide, nous allons vous montrer comment utiliser les commandes Docker intégrées pour modifier les paramètres sélectionnés des conteneurs en cours d’exécution. Nous examinerons également ce que vous ne devriez pas changer et une solution de contournement que vous pouvez utiliser si vous pensez que vous devez le faire.
Sommaire
Renommer un conteneur
La modification la plus simple consiste à renommer un conteneur créé. Les noms sont attribués via le --name
drapeau pour docker run
. Lorsqu’aucun nom n’est fourni, le démon Docker en attribue un au hasard. Vous pouvez utiliser des noms pour référencer des conteneurs dans les commandes Docker CLI ; choisir un souvenir approprié évite de courir docker ps
pour trouver le nom ou l’ID attribué automatiquement à un conteneur.
le docker rename
La commande est utilisée pour changer les noms de conteneur après la création. Il faut deux arguments, l’ID ou le nom actuel du conteneur cible, et le nouveau nom à attribuer :
# docker rename <target ID or name> <new name>
docker rename old_name new_name
Modification de la politique de redémarrage
Les politiques de redémarrage déterminent si les conteneurs doivent démarrer automatiquement après le redémarrage de votre hôte ou le lancement du démon Docker. Les quatre stratégies disponibles vous permettent de forcer le démarrage du conteneur, de le maintenir à l’arrêt ou de démarrer de manière conditionnelle en fonction du code de sortie ou de l’état d’exécution précédent du conteneur.
Docker prend en charge la modification des politiques de redémarrage à la volée. Ceci est utile si vous prévoyez de redémarrer votre hôte ou le démon Docker et souhaitez qu’un certain conteneur reste arrêté – ou démarre automatiquement – après l’événement spécifique.
docker update --restart unless-stopped demo_container
L’exemple ci-dessus modifie la politique de redémarrage de demo_container
à unless-stopped
. Cette règle fait démarrer le conteneur avec le démon, à moins qu’il n’ait été arrêté manuellement avant la dernière sortie du démon.
Modification des limites de ressources matérielles
le docker update
La commande peut également être utilisée pour modifier les limites de ressources appliquées aux conteneurs. Vous devez transmettre un ou plusieurs identifiants ou noms de conteneurs, ainsi qu’une liste d’indicateurs définissant les limites à définir sur ces conteneurs.
Des indicateurs sont disponibles pour toutes les limites de ressources prises en charge par docker run
. Voici une liste condensée des options que vous pouvez utiliser :
--blkio-weight
– Modifiez le poids relatif Block IO du conteneur.--cpus
– Définissez le nombre de CPU disponibles pour le conteneur.--cpu-shares
– Définissez le poids relatif du partage CPU.--memory
– Modifier la limite de mémoire du conteneur (par ex.1024M
).--memory-swap
– Configurez la quantité de mémoire que le conteneur peut échanger sur le disque ; utilisez une taille telle que1024M
pour fixer une limite spécifique, ou-1
pour un échange illimité.--kernel-memory
– Modifiez la limite de mémoire du noyau du conteneur. Les conteneurs privés de mémoire du noyau peuvent avoir un impact négatif sur d’autres charges de travail sur la machine hôte.--pids-limit
– Configurez le nombre maximal d’ID de processus autorisés à l’intérieur du conteneur, en limitant le nombre de processus pouvant être démarrés.
Voici un exemple d’utilisation docker update
pour modifier la limite de mémoire et le nombre de processeurs pour deux de vos conteneurs :
docker update --cpus 4 --memory 1024M first_container second_container
Tous les drapeaux disponibles sauf --kernel-memory
peut être utilisé avec des conteneurs Linux en cours d’exécution. Pour modifier la limite de mémoire du noyau, vous devez arrêter le conteneur avec docker stop
première.
Attention, aucun de ces indicateurs n’est actuellement pris en charge pour les conteneurs Windows. Ils fonctionneront cependant avec des conteneurs Linux exécutés sur une machine hôte Windows.
Quand ne pas utiliser ces commandes ?
le docker update
et docker rename
les commandes doivent être utilisées avec des conteneurs que vous avez créés manuellement via docker run
. Méfiez-vous de les utiliser avec des conteneurs provenant d’autres outils tels que docker-compose
.
Changer le nom d’un conteneur pourrait le laisser indétectable par l’outil source, endommageant potentiellement d’autres composants de votre pile. De plus, si vous définissez de manière déclarative des limites de ressources dans un docker-compose.yml
fichier, en exécutant le docker-compose up
La commande réappliquera à nouveau ces limites d’origine à votre conteneur.
Par conséquent, vous devez vous en tenir à votre solution de gestion de conteneurs existante si vous en utilisez une. Pour Compose, cela signifie changer les noms de conteneurs et les limites de ressources dans votre docker-compose.yml
fichier, puis en cours d’exécution docker-compose up -d
pour appliquer automatiquement le changement. Cela garantit que vous ne rendrez pas involontairement des conteneurs orphelins ou que vous ne provoquerez pas d’effets secondaires involontaires.
Qu’en est-il des autres propriétés (image/ports/volumes) ?
Les limites matérielles, les politiques de ressources et les noms de conteneurs sont les seuls paramètres de configuration que Docker CLI vous permet de modifier. Vous ne pouvez pas modifier l’image d’un conteneur en cours d’exécution ; vous ne pouvez pas non plus modifier facilement d’autres options telles que les liaisons de port et les volumes.
Vous devez créer un autre conteneur si ces valeurs deviennent obsolètes. Détruisez votre instance actuelle et utilisez docker run
pour commencer un remplacement avec votre nouvelle image et les paramètres corrigés.
Les conteneurs étant censés être apatrides et éphémères, vous devriez pouvoir les remplacer à tout moment. Utilisez des volumes pour stocker des données de conteneur persistantes ; ce mécanisme vous permet de rattacher des fichiers avec état au nouveau conteneur en répétant la -v
drapeaux passés à l’original docker run
commander:
docker run -v config-volume:/usr/lib/config --name demo example-image:v1
docker rm demo
# Existing data in /usr/lib/config retained
docker run -v config-volume:/usr/lib/config --name demo2 example-image:v2
Zone de danger : modification d’autres propriétés du conteneur
Bien que vous devriez viser à remplacer les conteneurs dans la mesure du possible, il est possible de modifier les propriétés des conteneurs existants en éditant directement les fichiers de configuration de Docker. Faites attention lorsque vous utilisez cette méthode : elle n’est pas du tout prise en charge et une modification mal placée pourrait casser votre conteneur.
Bien que cette option offre un moyen de modifier arbitrairement les conteneurs existants, elle ne fonctionnera pas pendant leur exécution. Utilisez le docker stop my-container
pour arrêter le conteneur que vous souhaitez modifier, puis continuez à apporter vos modifications.
Les fichiers de configuration de conteneur ont le chemin suivant sur votre hôte :
/var/lib/docker/containers/<container id>/config.v2.json
Vous devez connaître l’ID complet du conteneur, pas la version tronquée affichée par docker ps
. Vous pouvez utiliser le docker inspect
commande pour obtenir ceci :
docker inspect <short id or name> | jq | grep Id
Une fois arrivé à un conteneur config.v2.json
, vous pouvez l’ouvrir dans un éditeur de texte pour apporter les modifications nécessaires. Le JSON stocke la configuration du conteneur créée lors de l’exécution docker run
. Vous pouvez modifier le contenu pour modifier les propriétés telles que les liaisons de port, les variables d’environnement, les volumes, ainsi que le point d’entrée et la commande du conteneur.
Pour ajouter une liaison de port, recherchez le PortBindings
saisissez le fichier, puis insérez un nouvel élément dans l’objet :
{
"PortBindings": {
"80/tcp": {
"HostIp": "",
"HostPort": "8080"
}
}
}
Ici, le port 80 dans le conteneur est lié au port 8080 sur l’hôte. Il est tout aussi simple d’ajouter des variables d’environnement – trouvez le Env
key, puis insérez de nouveaux éléments dans le tableau :
{
"Env": [
"FOO=bar",
"CUSTOM_VARIABLE=example"
]
}
Une fois les modifications terminées, redémarrez le service Docker et votre conteneur :
sudo service docker restart
docker start my-container
Le conteneur s’exécutera maintenant avec sa configuration mise à jour.
Conclusion
Les conteneurs Docker sont censés être des unités éphémères que vous remplacez lorsque leur configuration devient obsolète. Malgré cette intention, il existe des scénarios où il est nécessaire de modifier un conteneur existant. Docker gère les cas d’utilisation les plus courants – changements de nom et ajustements de limite de ressources en temps réel – via des commandes CLI intégrées telles que docker update
.
Lorsque vous souhaitez modifier une autre propriété, essayez toujours de remplacer le conteneur comme premier plan d’action. Cela minimise le risque de casser des objets et est conforme au modèle d’immuabilité de Docker. Si vous vous retrouvez dans une situation où un conteneur existant doit être modifié, vous pouvez modifier manuellement les fichiers de configuration internes de Docker comme indiqué ci-dessus.
Enfin, n’oubliez pas que les conteneurs gérés par d’autres outils de l’écosystème comme Docker Compose doivent être modifiés à l’aide de ces mécanismes. Sinon, vous pourriez constater que les conteneurs sont orphelins ou écrasés de manière inattendue si l’outil n’est pas au courant des modifications que vous avez apportées.