docker-composeを介してDockerコンテナに静的IPを提供します


95

コンテナに静的IPアドレスを提供しようとしています。カスタムネットワークを作成する必要があることを理解しています。私はそれを作成し、ブリッジインターフェイスはホストマシン(Ubuntu 16.x)で起動しています。コンテナはこのサブネットからIPを取得しますが、私が提供した静的な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

コンテナは、5と6ではなく、10.5.0.2と10.5.0.3を取得します。


aux-addressは、ネットワークですでに使用されているIPアドレスについてipam-driverに手動で通知するために使用されます
Hamza

静的IPをサービスに割り当てたときに、「docker compose up -d --scale container-name = 3」を使用して、これらのコンテナーのいずれかをスケールアップするにはどうすればよいですか?
ヤシュ

回答:


121

コンテナネットワークの外部から内部へのルーティングを可能にする何かをしているのでない限り、Dockerのコンテナに固定IPを使用することはお勧めしません(例:macvlan)。DNSは、コンテナネットワーク内のサービス検出のためにすでに存在し、コンテナのスケーリングをサポートしています。また、コンテナネットワークの外部では、ホストの公開ポートを使用する必要があります。その免責事項とともに、必要な作成ファイルは次のとおりです。

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
ユーザーが構成したサブネットが定義された作成ファイルの下半分を見逃したに違いありません。
BMitch 2016年

11
バージョン3でどのようにそれを行うことができますか?
atr_Max 2017

4
@Atr_Max現時点では、次のことはできません。「注:ゲートウェイなどの追加のIPAM構成は、現時点ではバージョン2でのみ適用されます。」docs.docker.com/compose/compose-file/#ipam
BMitch

2
@Ryan Static IPはセキュリティを向上させません。同じ接続を開く必要があり、コンテナは名前空間付きネットワーク内で実行され、必要なものだけを公開します。静的IPは、アプリケーションのローリング更新を実行する機能を含む柔軟性を低下させ、スウォームモードでは機能せず、コンテナーの構成を環境間または同様のコンテナー間でコピーすることを困難にします。リンクされた問題については、コンテナ内の0.0.0.0をリッスンする必要があります。
BMitch 2018

1
@alvery私は、ドッキングウィンドウ-COMPOSEが既に作成されたネットワーク(たぶんバグ)の設定は適用されませんので、あなたが--force-再作成オプションを使用する必要があり、同じ問題を持っている
HugoPoi

21

カスタム名(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:
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.