Docker compose, exécute des conteneurs dans net: host

102

Je veux générer 3 services dans le réseau "hôte" en utilisant docker-compose. Voici mon fichier docker-compose.yml:

version: '2'
services:
  mysql:
    image: mysql
    net: "host"
  nginx:
    image: nginx
    net: "host"
  app:
    image: tomcat
    net: "host"

J'ai eu l'erreur suivante:

$ docker-compose up
[31mERROR[0m: Validation failed in file '.\docker-compose.yml', reason(s):
Unsupported config option for services.app: 'net'
Unsupported config option for services.mysql: 'net'
Unsupported config option for services.nginx: 'net'

J'utilise boot2docker sur Windows.

Version Docker et Docker-compose:

$ docker -v
Docker version 1.10.2, build c3959b1
$ docker-compose -version
docker-compose version 1.6.0, build cdb920a

Si j'exécute tous les services manuellement en utilisant docker run --net = "host"tout fonctionne bien.

Dans la documentation, j'ai lu que la commande net est prise en charge dans docker-compose :

net

Mode réseau. Utilisez les mêmes valeurs que le paramètre --net du client docker.

net: "pont"

net: "aucun"

net: "conteneur: [nom ou id]"

net: "hôte"

https://docs.docker.com/v1.6/compose/yml/#net

Qu'est-ce que je fais mal?

Benoit Wickramarachi
la source
Mise à jour basée sur la réponse de @ andy-shinn, le paramètre est appelé network_mode: "host". Comme documenté dans docker compose la version 3 #network_mode .
Paul Rougieux

Réponses:

103

Ces documents sont périmés. Je suppose que le 1.6 dans l'URL est pour Docker 1.6, pas pour Compose 1.6. Vérifiez la syntaxe correcte ici: https://docs.docker.com/compose/compose-file/#network_mode . Vous recherchez network_modelorsque vous utilisez le format v2 YAML.

Andy Shinn
la source
C'est vraiment déroutant ... Je vais tout de suite mettre en signet le lien de la documentation. network_mode fonctionne très bien merci!
Benoit Wickramarachi
Si j'ai bien compris, je devrais utiliser network_mode: "host" en service?
Taras Vaskiv
27
notez que network_mode: hostcela ne fonctionnera pas sur docker pour Mac
arviman
1
@FlavienVolken sur mac, une solution consiste à utiliser l'adresse IP de l'hôte explicitement. Il y a un nom d'hôte spécial que vous pouvez utiliser et qui pointe vers ceci (docker_host_domain ou quelque chose comme ça, j'oublie).
oooyaya
72

Imprimez simplement

network_mode: "host"

Andreï
la source
'network_mode' et 'networks' ne peuvent pas être combinés. Si vous avez déjà des réseaux, cela ne fonctionnera pas.
Alex Efimov le
1
network_mode: hostne fonctionnera pas sur docker pour Mac
Vallie
32

tu peux essayer d'ajouter simplement

network_mode: "host"

exemple :

version: '2'
services:
  feedx:
    build: web
    ports:
    - "127.0.0.1:8000:8000"
    network_mode: "host"

option de liste disponible

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

https://docs.docker.com/compose/compose-file/#network_mode

Sarath Ak
la source
la redirection de port est-elle ignorée dans ce cas?
toing_toing
3

Peut-être que je réponds très tard. Mais j'avais également un problème pour configurer le réseau hôte dans docker compose. Ensuite, j'ai lu attentivement la documentation et apporté les modifications et cela a fonctionné. Veuillez noter que cette configuration est pour la version "3.7" de docker-compose. Ici, einwohner_net et elk_net_net sont mes réseaux définis par l'utilisateur requis pour mon application. J'utilise le réseau hôte pour obtenir des métriques système.

Lien vers la documentation https://docs.docker.com/compose/compose-file/#host-or-none

version: '3.7'
services:
  app:
    image: ramansharma/einwohnertomcat:v0.0.1
    deploy:
      replicas: 1
      ports:
       - '8080:8080'
    volumes:
     - type: bind
       source: /proc
       target: /hostfs/proc
       read_only: true
     - type: bind
       source: /sys/fs/cgroup
       target: /hostfs/sys/fs/cgroup
       read_only: true
     - type: bind
       source: /
       target: /hostfs
       read_only: true
    networks:
     hostnet: {}
    networks:
     - einwohner_net
     - elk_elk_net
networks:
 einwohner_net:
 elk_elk_net:
   external: true
 hostnet:
   external: true
   name: host
Raman Sharma
la source
2
> Utilisé uniquement si vous utilisez les commandes docker stack. Si vous utilisez la commande docker-compose, utilisez plutôt network_mode.
thisismydesign
-8

supprimez l'option warn config pour services.app: 'net', cela peut fonctionner.

Jérôme
la source