Proporcione una IP estática a los contenedores de la ventana acoplable mediante docker-compose


95

Estoy tratando de proporcionar una dirección IP estática a los contenedores. Entiendo que tengo que crear una red personalizada. Lo creo y la interfaz del puente está activa en la máquina host (Ubuntu 16.x). Los contenedores obtienen la IP de esta subred pero no la estática que proporcioné.

Aquí está mi 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

Los contenedores obtienen 10.5.0.2 y 10.5.0.3, en lugar de 5 y 6.


aux-address se usa para informar manualmente al controlador ipam sobre las direcciones IP que ya están en uso en la red
Hamza

¿Cómo puedo escalar cualquiera de estos contenedores usando 'docker compose up -d --scale container-name = 3' cuando he asignado una ip estática al servicio?
Yash

Respuestas:


121

Tenga en cuenta que no recomiendo una IP fija para los contenedores en Docker a menos que esté haciendo algo que permita el enrutamiento desde el exterior hacia el interior de su red de contenedores (por ejemplo, macvlan). DNS ya está disponible para el descubrimiento de servicios dentro de la red de contenedores y admite el escalado de contenedores. Y fuera de la red de contenedores, debe usar puertos expuestos en el host. Con ese descargo de responsabilidad, aquí está el archivo de redacción que desea:

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
Debe haberse perdido la mitad inferior del archivo de redacción donde se definió la subred configurada por el usuario.
BMitch

11
¿Cómo puedes hacerlo en la versión 3?
Atr_Max

4
@Atr_Max Por el momento, no puede: "Nota: Las configuraciones adicionales de IPAM, como la puerta de enlace, solo se aceptan para la versión 2 en este momento". docs.docker.com/compose/compose-file/#ipam
BMitch

2
Las direcciones IP estáticas de @Ryan no mejorarán la seguridad, aún necesita abrir las mismas conexiones y sus contenedores aún se ejecutarán dentro de una red de espacio de nombres donde solo expondrá lo que necesita. Las IP estáticas disminuirán la flexibilidad, incluida la capacidad de realizar una actualización continua de su aplicación, no funcionarán en modo enjambre y harán que la configuración del contenedor sea más difícil de copiar entre entornos o contenedores similares. Para el problema vinculado, solo necesita escuchar 0.0.0.0 dentro del contenedor.
BMitch

1
@alvery tengo el mismo problema, debe usar la opción --force-recreate porque docker-compose no aplica la configuración en la red ya creada (tal vez un error)
HugoPoi

21

Estaba enfrentando algunas dificultades con una variable de entorno que tiene un nombre personalizado (no con la convención de puerto / nombre de contenedor para KAPACITOR_BASE_URL y KAPACITOR_ALERTS_ENDPOINT). Si damos el nombre del servicio en este caso, no resolvería la ip como

KAPACITOR_BASE_URL:  http://kapacitor:9092

En lo anterior http://[**kapacitor**]:9092no resolveríahttp://172.20.0.2:9092

Resolví los problemas de IP estáticas usando configuraciones de subredes.

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:
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.