Fornece IP estático para contêineres docker via docker-compose


96

Estou tentando fornecer um endereço IP estático aos contêineres. Eu entendo que tenho que criar uma rede personalizada. Eu o crio e a interface de ponte está ativa na máquina host (Ubuntu 16.x). Os contêineres obtêm IP desta sub-rede, mas não o IP estático fornecido.

Aqui está meu 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

Os contêineres recebem 10.5.0.2 e 10.5.0.3, em vez de 5 e 6.


aux-address é usado para informar manualmente o ipam-driver sobre endereços IP já em uso na rede
Hamza

Como posso aumentar qualquer um desses contêineres usando 'docker compose up -d --scale container-name = 3' quando aloquei um ip estático para o serviço?
yash,

Respostas:


124

Observe que não recomendo um IP fixo para contêineres no Docker, a menos que você esteja fazendo algo que permita o roteamento de fora para dentro de sua rede de contêiner (por exemplo, macvlan). O DNS já existe para descoberta de serviço dentro da rede de contêineres e oferece suporte ao dimensionamento de contêineres. E fora da rede do contêiner, você deve usar portas expostas no host. Com essa isenção de responsabilidade, aqui está o arquivo de composição que você deseja:

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
Você deve ter perdido a metade inferior do arquivo de composição em que a sub-rede configurada pelo usuário foi definida.
BMitch,

12
Como você pode fazer isso na versão 3?
Atr_Max de

4
@Atr_Max No momento, você não pode: "Nota: Configurações adicionais de IPAM, como gateway, só são aceitas para a versão 2 no momento." docs.docker.com/compose/compose-file/#ipam
BMitch

2
Os IPs estáticos do @Ryan não melhorarão a segurança, você ainda precisa abrir as mesmas conexões e seus contêineres ainda funcionarão dentro de uma rede com namespace onde você só expõe o que precisa. Os IPs estáticos diminuirão a flexibilidade, incluindo a capacidade de fazer uma atualização contínua de seu aplicativo, não funcionarão no modo swarm e tornarão a configuração do contêiner mais difícil de copiar entre ambientes ou contêineres semelhantes. Para o problema vinculado, você só precisa ouvir 0.0.0.0 dentro do contêiner.
BMitch

1
@alvery Tenho o mesmo problema, você precisa usar a opção --force-recreate porque docker-compose não aplica a configuração na rede já criada (talvez um bug)
HugoPoi

22

Eu estava enfrentando algumas dificuldades com uma variável de ambiente que está com nome personalizado (não com convenção de porta / nome de contêiner para KAPACITOR_BASE_URL e KAPACITOR_ALERTS_ENDPOINT). Se dermos o nome do serviço neste caso não resolveria o ip como

KAPACITOR_BASE_URL:  http://kapacitor:9092

Acima http://[**kapacitor**]:9092não resolveriahttp://172.20.0.2:9092

Resolvi os problemas de IPs estáticos usando configurações de sub-rede.

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:
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.