web-dev-qa-db-fra.com

Conteneur de départ avec plusieurs interfaces réseau

Avec 1.9, existe-t-il un moyen de démarrer un conteneur directement avec deux interfaces réseau ou plus?

Vous pouvez le faire après le démarrage du conteneur avec "docker network connect", mais cela signifie que le processus est déjà en cours d'exécution et risque de manquer la création du nouveau.

28
Robert

Cette question est top fait une recherche concernant docker et plusieurs interfaces réseau. Bien que ce ne soit pas la version requise dans la question, je laisse ici quelques informations:

Avec Docker 1.12+, il est possible d’ajouter plusieurs interfaces réseau à un conteneur Docker, mais il est nécessaire de créer le conteneur en premier, puis de connecter la deuxième carte réseau (et la sous-séquence) avant de démarrer le conteneur:

$ docker create --network=network1 --name container_name containerimage:latest
$ docker network connect network2 container_name
$ docker start container_name

Il faut d'abord créer les réseaux:

$ docker network create --driver=bridge network1 --subnet=172.19.0.0/24
$ docker network create --driver=bridge network2 --subnet=172.19.1.0/24

De plus, vous pouvez démarrer le conteneur en reliant les interfaces réseau dockerhost à l'aide de l'argument --network = Host dans l'exécution de docker:

$ docker run --net=Host containerimage:latest
37
methadata

Comme @gesellix a répondu, ce n'est actuellement pas possible.

Vous pouvez trouver ce problème sous https://github.com/docker/docker/issues/17750

Certaines améliorations sont en attente dans ce domaine ..__ Comme le montrent les discussions, l’idée actuelle est de créer un conteneur (avec docker create), d’attacher des réseaux (docker network connect) puis de démarrer (docker start).

Vous pouvez vérifier le raisonnement dans les commentaires de https://github.com/docker/docker/pull/17796

UPD: # 17750 est fermé et sera disponible dans 1.10

5
Alex

Non, ce n'est pas possible. Les documents montrent également que l'option de ligne de commande nécessaire --net n'accepte qu'un seul nom de réseau: http://docs.docker.com/engine/reference/run/#network-settings

Gardez également à l'esprit que Docker 1.9 met constamment à jour le fichier /etc/hosts dans vos conteneurs, de sorte qu'un processus en cours d'exécution ne peut pas compter sur l'état initial de ce fichier. La meilleure solution consiste à informer votre processus des mises à jour, soit en lisant manuellement le fichier /etc/hosts, soit en interrogeant un serveur DNS. De cette façon, vous ne rencontrerez aucun problème lorsque le deuxième réseau sera connecté.

1
gesellix

Quelqu'un cherche-t-il toujours la solution à ce problème? Il existe deux solutions à ce problème: Le premier est celui qui est presque complètement détaillé ici, mais il fonctionne avec les versions actuelles de docker - le didacticiel complet est disponible ici forum hub de docker

La solution 2 consiste à tout faire dans la couche inférieure. J’ai inclus la section de commentaire détaillée du lien ci-dessus, que je copie également ici: Puisque docker utilise également les espaces de noms réseau de Linux, vous pouvez également le faire dans la couche inférieure. Malheureusement, Docker essaie de cacher cela à l'utilisateur, mais les espaces de noms existent toujours sous le capot. Pour les faire gérer par ip netns tool, procédez comme suit:

  1. récupérez l'id de processus (pid) de votre conteneur en cours d'exécution:

$ Sudo docker inspect -f '{{.State.Pid}}' <container name>

<container name> n'est pas votre nom label:tag, c'est le nom que docker lui attribue automatiquement une fois qu'un conteneur est activé - récupérez le vôtre via la commande docker ps et recherchez la dernière colonne (NAME).

  1. créez un lien symbolique du système/proc/filesystem vers /var/run/2.1. Tout d’abord, créez un répertoire netns dans /var/run/$ Sudo mkdir -p /var/run/netns

2.2. En utilisant le PID que vous venez d’obtenir, créez le lien symbolique $ Sudo ln -sf /proc/<PID>/ns/net /var/run/netns/<YOUR DESIRED NETNS NAME FOR YOU CONTAINER>

Maintenant, si vous exécutez ip netns list, vous verrez l'espace de noms réseau de votre conteneur.

A partir de maintenant, il n'y a plus d'objets spécifiques à un docker, créez simplement une paire de veth, amenez-les et attachez-en une extrémité au conteneur et vous allez bien: $ Sudo ip link add veth1_container type veth peer name veth1_root

$ Sudo ifconfig veth1_container up

$ Sudo ifconfig veth1_root up

$ Sudo ip link set veth1_container netns <YOUR NETNS NAME>

$ Sudo ip netns exec <YOUR NETNS NAME> ifconfig veth1_container up

La dernière commande est peut-être un peu trop compliquée, mais il semble qu’il n’est pas possible d’afficher cette interface de manière native dans le conteneur à cause du manque d’autorisations :)

Notez que l'adresse MAC peut également être modifiée de la même manière que dans la solution 1, avant de la joindre au conteneur, ou après - cela n'a pas d'importance, il suffit d'utiliser des commandes différentes (rappelez-vous le problème d'autorisation mentionné ci-dessus). ).

J'espère que ça aide.

0
cs.lev