2017-09-07 4 views
0

J'ai appris de docker documentation que je ne peux pas utiliser docker DNS pour trouver des conteneurs en utilisant leurs noms d'hôte sans utiliser le pont réseau défini par l'utilisateur. J'ai créé un en utilisant la commande:ne peut pas utiliser le pont défini par l'utilisateur dans swarm composer le fichier yaml

docker network create --driver=overlay --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_overlay 

et essayé de déployer un conteneur qui l'utilise. composer fichier ressemble à:

version: "3.0" 
    services: 
     web1: 
     image: "test" 
     ports: 
      - "12023:22" 
     hostname: "mytest-web1" 
     networks: 
      - test 
     web2: 
     image: "test" 
     ports: 
      - "12024:22" 
     hostname: "mytest-web2" 
     networks: 
      - test 
    networks: 
     test: 
     external: 
      name: user_defined_overlay 

ma version docker est: Docker version 17.06.2-ce, build cec0b72 et j'ai eu l'erreur suivante lorsque j'ai essayé de déployer la pile:

network "user_defined_bridge" is declared as external, but it is not in the right scope: "local" instead of "swarm" 

j'ai pu créer un réseau de recouvrement et définir dans le fichier de composition. Cela a bien fonctionné, mais pas pour le pont. résultat de réseau docker ls:

NETWORK ID   NAME      DRIVER    SCOPE 
cd6c1e05fca1  bridge      bridge    local 
f0df22fb157a  docker_gwbridge   bridge    local 
786416ba8d7f  host      host    local 
cuhjxyi98x15  ingress     overlay    swarm 
531b858419ba  none      null    local 
15f7e38081eb  user_defined_overlay  overlay    swarm 

UPDATE

I a essayé de créer deux récipients fonctionnant sur deux noeuds d'essaims différents (premier récipient fonctionne sur gestionnaire tandis que le second fonctionne sur le noeud de travail) et I spécifié à l'utilisateur réseau de superposition défini comme indiqué dans la pile ci-dessus. J'ai essayé d'envoyer un ping au conteneur mytest-web2 à partir du conteneur mytest-web1 en utilisant le nom d'hôte mais j'ai obtenu unknown host mytest-web2

+0

Si vous utilisez la pile docker, le réseau doit être superposé. alors quel est le problème avec ce –

+0

Je ne peux pas spécifier le réseau de pont dans la pile? seulement superposer? – tkyass

Répondre

1

À partir de 17.06, vous pouvez créer des réseaux locaux de nœuds avec une étendue d'essaim. Faites-avec l'option --scope=swarm, .: par exemple

docker network create --scope=swarm --driver=bridge \ 
    --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_bridge 

Vous pouvez ensuite utiliser ce réseau avec des services et des piles définies en mode essaim. Pour plus de détails, vous pouvez voir PR #32981.


Éditer: vous semblez avoir considérablement compliqué votre problème. Tant que tout est fait dans un seul fichier de composition, il n'est pas nécessaire de définir le réseau comme externe. Il est nécessaire d'utiliser un réseau de superposition si vous souhaitez communiquer conteneur à conteneur. La découverte DNS est incluse sur les réseaux de pont et de superposition, à l'exception du réseau "pont" par défaut créé par docker. Avec un fichier de composition, vous n'utiliserez jamais ce réseau sans le configurer explicitement comme un réseau externe portant ce nom. Donc, pour obtenir récipient pour la mise en réseau de conteneurs au travail, vous pouvez laisser docker-compose ou docker stack deploy créer le réseau pour votre projet/Empilement automatique avec:

version: "3.0" 
    services: 
    web1: 
     image: "test" 
     ports: 
     - "12023:22" 
    web2: 
     image: "test" 
     ports: 
     - "12024:22" 

Notez que j'ai supprimé le paramètre « nom d'hôte ». Ce n'est pas nécessaire pour la résolution DNS. Vous pouvez communiquer directement avec un service VIP avec le nom "web1" ou "web2" depuis l'un de ces conteneurs.

Avec docker-compose, il créera un réseau de pont par défaut. Le mode Essaim va créer un réseau de superposition. Ces valeurs par défaut sont idéales pour permettre la découverte DNS et la communication de conteneur à conteneur dans chacun des scénarios.

+0

merci @BMitch la commande que vous avez fournie s'est déroulée sans erreur .. mais je ne peux toujours pas envoyer un ping à un conteneur à partir d'un autre conteneur en utilisant le nom d'hôte. J'ai créé 2 conteneurs un en cours d'exécution dans le gestionnaire et le 2ème en cours d'exécution dans le travail que je peux ping l'un l'autre en utilisant leur alias mais je ne peux pas utiliser leur nom d'hôte. Je pensais que si je spécifie réseau de pont défini va résoudre mon problème. mon hypothèse est-elle incorrecte? – tkyass

+0

Les réseaux locaux de nœuds comme le réseau de pont ne fonctionnent pas entre plusieurs nœuds de l'essaim. Pour cela, vous auriez besoin d'un réseau de superposition. Seuls les conteneurs s'exécutant sur le même noeud pourront parler de conteneur à conteneur. Tout ce qui est en dehors de cela aurait besoin d'accéder via les ports publiés sur l'hôte. – BMitch

+0

merci encore @BMitch pour votre réponse. mais je pense que ma question n'est pas assez claire. Tout ce que je veux faire est de pouvoir communiquer entre les conteneurs créés à partir d'une seule pile en utilisant leur nom d'hôte sans utiliser de fichiers hôte. Je pensais docker a un support DNS pour un tel cas si je déploie la pile avec un réseau défini par l'utilisateur. J'ai fait des modifications dans ma question ci-dessus pour refléter au mieux ma demande. – tkyass