Предоставить статический IP для контейнеров Docker через docker-compose

Я пытаюсь предоставить статический IP-адрес для контейнеров. Я понимаю, что я должен создать собственную сеть. Я создаю его, и интерфейс моста работает на хост-машине (Ubuntu 16.x). Контейнеры получают IP из этой подсети, но не статический, который я предоставил.

Вот мой 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

Контейнеры получают 10.5.0.2 и 10.5.0.3 вместо 5 и 6.

5 ответов

Решение

Обратите внимание, что я не рекомендую фиксированный IP для контейнеров в Docker, если вы не делаете что-то, что позволяет маршрутизировать снаружи внутрь вашей контейнерной сети (например, macvlan). DNS уже существует для обнаружения службы внутри контейнерной сети и поддерживает масштабирование контейнера. А вне контейнерной сети вы должны использовать открытые порты на хосте. С этим отказом от ответственности, вот вам файл compose:

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

Я столкнулся с некоторыми трудностями с переменной среды, которая имеет пользовательское имя (не с именем контейнера / соглашением о порте для KAPACITOR_BASE_URL и KAPACITOR_ALERTS_ENDPOINT). Если мы дадим имя сервиса в этом случае, он не разрешит IP как

KAPACITOR_BASE_URL:  http://kapacitor:9092

В выше http://[**kapacitor**]:9092 не разрешит http://172.20.0.2:9092

Я решил проблемы со статическими IP-адресами, используя конфигурации подсетей.

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:

Если вы никогда не видите установленный статический IP-адрес, возможно, это связано с тем, что вы используете команду «docker compose up». Попробуйте использовать "docker-compose up".

Когда я использую «docker-compose up» (с дефисом), я теперь вижу назначенные статические IP-адреса.

      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'

Я потратил много времени, чтобы понять это. :(

Я понял, что более удобный и осмысленный способ — дать контейнеру имя контейнера. Вы можете использовать имя в той же сети докеров, что и источник. Это помогло мне, потому что у докер-контейнеров менялись IP-адреса, и благодаря этому я мог общаться с другим контейнером со статическим именем, которое я могу использовать в конфигурационных файлах.

Статические IP-адреса в докере очень полезны, особенно при использовании с обратным прокси-сервером. Эмпирическое правило заключается в том, что первый файл компоновки Docker (контейнер) определяет сетевую подсеть, которая будет использоваться будущими контейнерами.

Простой вариант использования — работа с прокси-менеджером, который направляет трафик в контейнеры в дополнение к выделению контейнерам SSL-сертификатов. Источник: Docker Compose для статического/фиксированного IP-адреса (открывает видео на YouTube).

Другие вопросы по тегам