146 votes

Fournir une IP statique aux conteneurs docker via docker-compose

J'essaie de fournir une adresse IP statique aux conteneurs. Je comprends que je dois créer un réseau personnalisé. Je le crée et l'interface de pont est en place sur la machine hôte (Ubuntu 16.x). Les conteneurs obtiennent l'IP de ce sous-réseau mais pas l'adresse statique que j'ai fournie.

Voici mon docker-compose.yml :

version: '2'

services:
  mysql:
    container_name: mysql
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
     - "3306:3306"
    networks:
     - vpcbr

  apigw-tomcat:
    container_name: apigw-tomcat
    build: tomcat/.
    ports:
     - "8080:8080"
     - "8009:8009"
    networks:
     - vpcbr
    depends_on:
     - mysql

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.5.0.0/16
         gateway: 10.5.0.1
         aux_addresses:
          mysql: 10.5.0.5
          apigw-tomcat: 10.5.0.6

Les conteneurs reçoivent 10.5.0.2 et 10.5.0.3, au lieu de 5 et 6.

0 votes

Aux-address est utilisé pour informer manuellement le pilote ipam des adresses IP déjà utilisées sur le réseau.

0 votes

Comment puis-je mettre à l'échelle l'un de ces conteneurs en utilisant 'docker compose up -d --scale container-name=3' alors que j'ai alloué une adresse IP statique au service ?

175voto

BMitch Points 3744

Notez que je ne recommande pas une IP fixe pour les conteneurs dans Docker, à moins que vous ne fassiez quelque chose qui permette le routage de l'extérieur vers l'intérieur de votre réseau de conteneurs (par exemple, macvlan). Le DNS est déjà présent pour la découverte de services à l'intérieur du réseau de conteneurs et prend en charge la mise à l'échelle des conteneurs. Et en dehors du réseau de conteneurs, vous devez utiliser les ports exposés sur l'hôte. Avec cet avertissement, voici le fichier compose que vous voulez :

version: '2'

services:
  mysql:
    container_name: mysql
    image: mysql:latest
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
    ports:
     - "3306:3306"
    networks:
      vpcbr:
        ipv4_address: 10.5.0.5

  apigw-tomcat:
    container_name: apigw-tomcat
    build: tomcat/.
    ports:
     - "8080:8080"
     - "8009:8009"
    networks:
      vpcbr:
        ipv4_address: 10.5.0.6
    depends_on:
     - mysql

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.5.0.0/16
         gateway: 10.5.0.1

2 votes

Vous avez dû manquer la moitié inférieure du fichier de composition où le sous-réseau configuré par l'utilisateur était défini.

23 votes

Comment le faire dans la version 3 ?

4 votes

@Atr_Max Pour le moment, vous ne pouvez pas : "Remarque : les configurations supplémentaires d'IPAM, telles que la passerelle, ne sont honorées que pour la version 2 pour le moment." docs.docker.com/compose/compose-file/#ipam

33voto

Jaswinder Points 489

J'ai rencontré quelques difficultés avec une variable d'environnement dont le nom est personnalisé (pas avec la convention nom du conteneur /port pour KAPACITOR_BASE_URL et KAPACITOR_ALERTS_ENDPOINT). Si nous donnons le nom du service dans ce cas, il ne résoudra pas l'ip en tant que

KAPACITOR_BASE_URL:  http://kapacitor:9092

En ci-dessus http://[**kapacitor**]:9092 ne se résoudrait pas à http://172.20.0.2:9092

J'ai résolu les problèmes d'IP statiques en utilisant des configurations de sous-réseau.

version: "3.3"

networks:
  frontend:
    ipam:
      config:
        - subnet: 172.20.0.0/24
services:
    db:
        image: postgres:9.4.4
        networks:
            frontend:
                ipv4_address: 172.20.0.5
        ports:
            - "5432:5432"
        volumes:
            - postgres_data:/var/lib/postgresql/data

    redis:
        image: redis:latest
        networks:
            frontend:
                ipv4_address: 172.20.0.6
        ports:
            - "6379"

    influxdb:
        image: influxdb:latest
        ports:
            - "8086:8086"
            - "8083:8083"
        volumes:
            - ../influxdb/influxdb.conf:/etc/influxdb/influxdb.conf
            - ../influxdb/inxdb:/var/lib/influxdb
        networks:
            frontend:
                ipv4_address: 172.20.0.4
        environment:
          INFLUXDB_HTTP_AUTH_ENABLED: "false"
          INFLUXDB_ADMIN_ENABLED: "true"
          INFLUXDB_USERNAME: "db_username"
          INFLUXDB_PASSWORD: "12345678"
          INFLUXDB_DB: db_customers

    kapacitor:
        image: kapacitor:latest
        ports: 
            - "9092:9092"
        networks:
            frontend:
                ipv4_address: 172.20.0.2
        depends_on:
            - influxdb
        volumes:
            - ../kapacitor/kapacitor.conf:/etc/kapacitor/kapacitor.conf
            - ../kapacitor/kapdb:/var/lib/kapacitor
        environment:
          KAPACITOR_INFLUXDB_0_URLS_0: http://influxdb:8086

    web:
        build: .
        environment:
          RAILS_ENV: $RAILS_ENV
        command: bundle exec rails s -b 0.0.0.0
        ports:
            - "3000:3000"
        networks:
            frontend:
                ipv4_address: 172.20.0.3
        links:
            - db
            - kapacitor
        depends_on:
            - db
        volumes:
            - .:/var/app/current
        environment:
          DATABASE_URL: postgres://postgres@db
          DATABASE_USERNAME: postgres
          DATABASE_PASSWORD: postgres
          INFLUX_URL: http://influxdb:8086
          INFLUX_USER: db_username
          INFLUX_PWD: 12345678
          KAPACITOR_BASE_URL:  http://172.20.0.2:9092
          KAPACITOR_ALERTS_ENDPOINT: http://172.20.0.3:3000

volumes:
  postgres_data:

14voto

Michael Love Points 11

Si vous ne voyez jamais l'adresse IP statique définie, cela pourrait être dû au fait que vous utilisez "docker compose up". Essayez d'utiliser "docker-compose up".

Lorsque j'utilise "docker-compose up" (avec le trait d'union), je vois maintenant les IP statiques attribuées.

networks:
  mynet:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 192.168.55.0/24
          gateway: 192.168.55.1

services:
  web:
    image: 'mycompany/webserver:latest'
    hostname: www
    domainname: mycompany.com
    stdin_open: true # docker run -i
    tty: true        # docker run -t
    networks:
      hfnet:
        ipv4_address: 192.168.55.10
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - '../honeyfund:/var/www/html'

J'ai perdu beaucoup de temps à le découvrir. :(

1 votes

Cette réponse vient de résoudre un problème auquel je faisais face depuis plus d'une semaine !

0 votes

Cela fonctionne pour moi. Je pense que vous avez une faute de frappe dans votre yaml. Ca ne devrait pas être mynet au lieu de hfnet ?

0voto

Jan Rausch Points 1

J'ai réalisé que la manière la plus pratique et la plus significative était de donner un nom de conteneur au conteneur. Vous pouvez utiliser ce nom dans le même réseau docker que la source. Cela m'a aidé parce que les conteneurs docker avaient des IP changeantes et que je pouvais ainsi communiquer avec un autre conteneur avec un nom statique que je pouvais utiliser dans les fichiers de configuration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X