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.
[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
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
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>
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.