web-dev-qa-db-fra.com

Est-il possible de partager de la mémoire entre des conteneurs Docker?

Je travaille sur une application avec différents processus et on me demande de contenir ces processus pour obtenir plus d'isolement.

Le problème est que les processus partagent la mémoire avec un seul processus "hyperviseur" afin d'échanger des données (ils utilisent des tampons partagés classiques). Cette solution a été implémentée pour des exigences de performances et parce qu'elle s'exécute dans l'espace utilisateur, il n'y a donc pas de changement de contenu entre l'espace utilisateur et l'espace noyau.

Si je ne me trompe pas, il n'est pas possible d'exécuter plus d'un conteneur Docker dans un seul espace de noms IPC, mais je ne sais pas s'il est possible qu'un seul conteneur Docker appartienne à different = IPC espaces de noms, cela pourrait résoudre mon problème.

D'autres solutions sont les bienvenues, n'oubliez pas que la performance est une exigence, merci d'avance.

31
Manuel Durando

Le --ipc=Host et --ipc=container:id des options ont depuis été ajoutées au Docker create et run commandes à partager IPC ressources.

--ipc=""  : Set the IPC mode for the container,
             'container:<name|id>': reuses another container's IPC namespace
             'Host': use the Host's IPC namespace inside the container

IPC avec l'hôte

docker run --ipc=Host <image>

IPC avec un autre conteneur

docker run --ipc=container:<id> <image>
26
Matt

Techniquement, vous pouvez partager le même espace de noms IPC entre les conteneurs, mais Docker ne le prend pas (encore) en charge).

Si vous pouvez utiliser mmap() au lieu de IPC, vous pouvez alors partager un volume entre les deux conteneurs et mapper un fichier sur ce volume; ce sera le même fichier, et donc être partagé correctement.

Si vous avez vraiment besoin de partager l'espace de noms IPC (car vous ne pouvez pas modifier le code existant), alors il est temps d'écrire du code Go et de le contribuer à Docker :-)

Le chemin le plus simple serait probablement d'ajouter un indicateur à la liaison libcontainer, afin de pouvoir démarrer un conteneur en réutilisant l'espace de noms IPC de l'hôte (ou d'un autre conteneur). Vérifiez la mise en œuvre de la --net flag, car il atteint exactement cela, mais pour l'espace de noms du réseau.

14
jpetazzo

Comme suggéré par @ jpetazzo J'ai regardé la source de Docker et aussi avec l'aide de développeurs sur # docker-dev J'ai réussi Docker recompilé afin de supprimer l'espace de noms IPC.

Pour ce faire, il est nécessaire de commenter la ligne "NEWIPC": true, dans le fichier default_template.go situé dans le dossier docker/daemon/execdriver/native/template du code source de Docker.

L'ancien code fonctionne désormais parfaitement.

8
Manuel Durando