Stellen Sie Docker-Containern über Docker-Compose eine statische IP-Adresse zur Verfügung

90

Ich versuche, Containern eine statische IP-Adresse bereitzustellen. Ich verstehe, dass ich ein benutzerdefiniertes Netzwerk erstellen muss. Ich erstelle es und die Bridge-Schnittstelle ist auf dem Host-Computer (Ubuntu 16.x) aktiv. Die Container erhalten IP von diesem Subnetz, aber nicht die von mir bereitgestellte statische.

Hier ist meine 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

Die Container erhalten 10.5.0.2 und 10.5.0.3 anstelle von 5 und 6.

chenchuk
quelle
Die Aux-Adresse wird verwendet, um den IPAM-Treiber manuell über IP-Adressen zu informieren, die bereits im Netzwerk verwendet werden
Hamza,
Wie kann ich einen dieser Container mit 'docker compose up -d --scale container-name = 3' skalieren, wenn ich dem Dienst eine statische IP zugewiesen habe?
Yash

Antworten:

116

Beachten Sie, dass ich keine feste IP für Container in Docker empfehle, es sei denn, Sie tun etwas, das das Routing von außen nach innen in Ihr Containernetzwerk ermöglicht (z. B. Macvlan). DNS ist bereits für die Diensterkennung innerhalb des Containernetzwerks vorhanden und unterstützt die Containerskalierung. Außerhalb des Containernetzwerks sollten Sie exponierte Ports auf dem Host verwenden. Mit diesem Haftungsausschluss ist hier die gewünschte Erstellungsdatei:

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
BMitch
quelle
6
Funktioniert bei mir nicht: Benutzerdefinierte IP-Adresse wird nur unterstützt, wenn eine Verbindung zu Netzwerken mit benutzerdefinierten Subnetzen hergestellt wird
immer
2
Sie müssen die untere Hälfte der Erstellungsdatei übersehen haben, in der das vom Benutzer konfigurierte Subnetz definiert wurde.
BMitch
10
Wie geht das in Version 3?
Atr_Max
4
@Atr_Max Im Moment können Sie nicht: "Hinweis: Zusätzliche IPAM-Konfigurationen, wie z. B. das Gateway, werden derzeit nur für Version 2 berücksichtigt." docs.docker.com/compose/compose-file/#ipam
BMitch
2
Statische IP-Adressen von @Ryan verbessern die Sicherheit nicht. Sie müssen immer noch dieselben Verbindungen öffnen, und Ihre Container werden weiterhin in einem Netzwerk mit Namespace ausgeführt, in dem Sie nur das offenlegen, was Sie benötigen. Statische IPs verringern die Flexibilität, einschließlich der Möglichkeit, ein fortlaufendes Update Ihrer Anwendung durchzuführen, nicht im Schwarmmodus zu arbeiten, und erschweren das Kopieren der Containerkonfiguration zwischen Umgebungen oder ähnlichen Containern. Für das verknüpfte Problem müssen Sie nur 0.0.0.0 im Container abhören.
BMitch
21

Ich hatte einige Probleme mit einer Umgebungsvariablen mit benutzerdefiniertem Namen (nicht mit Containername / Portkonvention für KAPACITOR_BASE_URL und KAPACITOR_ALERTS_ENDPOINT). Wenn wir in diesem Fall den Namen des Dienstes angeben, wird die IP-Adresse nicht als aufgelöst

KAPACITOR_BASE_URL:  http://kapacitor:9092

Oben http://[**kapacitor**]:9092würde sich nicht auflösenhttp://172.20.0.2:9092

Ich habe die Probleme mit statischen IPs mithilfe von Subnetzkonfigurationen behoben.

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:
Jaswinder
quelle