web-dev-qa-db-fra.com

Docker compose l'adressage IP statique yml

J'ai un tel docker-compose.yml (pas une liste complète ici):

version: '2'

services:

  nginx:
    build: ./nginx/
    ports:
      - 8080:80
    links:
      - php
    volumes_from:
      - app
    networks:
      app_subnet:
        ipv4_address: 172.16.1.3

  php:
    build: ./php/
    expose:
      - 9000
    volumes_from:
      - app
    networks:
      app_subnet:
        ipv4_address: 172.16.1.4

    networks:
      app_subnet:
        driver: bridge
        ipam:
        config:
          - subnet: 172.16.1.0/24
          gateway: 172.16.1.1

Après docker-compose up J'ai eu une telle erreur:

L'adresse IP spécifiée par l'utilisateur n'est prise en charge que lors de la connexion à des réseaux avec des sous-réseaux configurés par l'utilisateur

Je crée donc un sous-réseau avec docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet

Mais cela ne résout pas le problème car docker-compose crée le sous-réseau avec le nom dev_app_subnet à la volée. Et mon sous-réseau n'est pas utilisé - je reçois la même erreur. Le but principal de cette opération est d'attribuer une adresse IP statique au service nginx - ouvrez l'url web de votre projet à partir du fichier etc/hosts.

9
alvery

[RESOLU] Trouvé la solution. Lorsque nous pointons vers le réseau, nous devons utiliser le drapeau "externe" pour indiquer que le réseau est déjà créé et doit être pris à l'extérieur (sinon il sera créé à la volée avec le préfixe du projet):

networks:
  app_subnet:
    external: true

Ainsi, après ce docker-compose, les conteneurs seront attachés aux app_subnet Avant cela, le sous-réseau doit être créé:

docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet
14
alvery

Dans mon cas, je lance d'abord docker-compose up a échoué, mais le réseau déjà créé peut voir à l'aide de docker network ls.

Dans ce cas, juste docker-compose down, corrigez le yml, relancez docker-compose up c'est bien

2
tony.hokan

Il est probable que lors de l'exécution précédente du script, l'interface réseau ait déjà été créée mais sans le paramètre de sous-réseau.

Pour le fixer courir

docker network ls -a

et supprimer le réseau qui bloque la création du service

docker network rm <network interface id> 
0
Alessio Trivisonno

Pour être précis si vous utilisez le docker stack deploy pour déployer un cluster swarm. Et vous devez spécifier la portée du sous-réseau en tant que "essaim":

docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 --scope swarm app_subnet

dans le docker-compose.yml, vous devez spécifier le réseau externe comme:

réseaux: par défaut: externe: nom: etl_subnet

Utilisez-le par défaut.

0
Qiushi