確定的ポートバインディングによるDockerスケール


14

wildfly複数のポートが公開されているコンテナを確定的な結果でスケーリングしたいと思います。

docker-compose.yml

version: '3'
services:
  wildfly-server:
    build:
      context: .
      dockerfile: Dockerfile
      args:
        admin_user: admin
        admin_password: admin
    deploy:
      resources:
          limits:
            memory: 1.5G
            cpus: "1.5"
    restart: always
    ports:
      - "8000-8099:8080"
      - "8100-8199:9990"
      - "8200-8299:8787"
    expose:
      - "8080"
      - "9990"
      - "8787"

Dockerfile

FROM jboss/wildfly:16.0.0.Final

# DOCKER ENV VARIABLES
ENV WILDFLY_HOME /opt/jboss/wildfly
ENV STANDALONE_DIR ${WILDFLY_HOME}/standalone
ENV DEPLOYMENT_DIR ${STANDALONE_DIR}/deployments
ENV CONFIGURATION_DIR ${STANDALONE_DIR}/configuration

RUN ${WILDFLY_HOME}/bin/add-user.sh ${admin_user} ${admin_password} --silent

# OPENING DEBUG PORT
RUN rm ${WILDFLY_HOME}/bin/standalone.conf
ADD standalone.conf ${WILDFLY_HOME}/bin/

# SET JAVA ENV VARS
RUN rm ${CONFIGURATION_DIR}/standalone.xml
ADD standalone.xml ${CONFIGURATION_DIR}/

開始するコマンド

docker-compose up --build --force-recreate --scale wildfly-server=10

ほぼ問題なく動作しますが、ポートの不一致がいくつかあります。コンテナーを作成するとき、次のように各コンテナーが公開されるように増分ポートを用意します。

machine_1 8001, 8101, 82001
machine_2 8002, 8102, 82002
machine_3 8003, 8103, 82003 

しかし、結果として得られるのは確定的ではなく、次のようになります。

machine_1 8001, 8102, 82003
machine_2 8002, 8101, 82001
machine_3 8003, 8103, 82002 

問題は、compose upコマンドを実行するたびに、ポートがコンテナーごとに異なることです。

出力例:

CONTAINER ID  COMMAND                  CREATED             STATUS              PORTS                                                                    NAMES
0232f24fbca4  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8028->8080/tcp, 0.0.0.0:8231->8787/tcp, 0.0.0.0:8126->9990/tcp   wildfly-server_7
13a6a365a552  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8031->8080/tcp, 0.0.0.0:8230->8787/tcp, 0.0.0.0:8131->9990/tcp   wildfly-server_10
bf8260d9874d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8029->8080/tcp, 0.0.0.0:8228->8787/tcp, 0.0.0.0:8129->9990/tcp   wildfly-server_6
3d58f2e9bdfe  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8030->8080/tcp, 0.0.0.0:8229->8787/tcp, 0.0.0.0:8130->9990/tcp   wildfly-server_9
7824a73a09f5  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8027->8080/tcp, 0.0.0.0:8227->8787/tcp, 0.0.0.0:8128->9990/tcp   wildfly-server_3
85425462259d  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8024->8080/tcp, 0.0.0.0:8224->8787/tcp, 0.0.0.0:8124->9990/tcp   wildfly-server_2
5be5bbe8e577  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8026->8080/tcp, 0.0.0.0:8226->8787/tcp, 0.0.0.0:8127->9990/tcp   wildfly-server_8
2512fc0643a3  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8023->8080/tcp, 0.0.0.0:8223->8787/tcp, 0.0.0.0:8123->9990/tcp   wildfly-server_5
b156de688dcb  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8025->8080/tcp, 0.0.0.0:8225->8787/tcp, 0.0.0.0:8125->9990/tcp   wildfly-server_4
3e9401552b0a  "/opt/jboss/wildfly/…"   5 minutes ago       Up 5 minutes        0.0.0.0:8022->8080/tcp, 0.0.0.0:8222->8787/tcp, 0.0.0.0:8122->9990/tcp   wildfly-server_1

質問

ポートの分布を確定的にする方法はありますか?並列実行を無効にして、使用可能なポートまたは他の方法でシリアルチェックを行うようにしますか?私が見つけた唯一の選択肢は、yml テンプレートを用意し、必要なすべてのファイルを生成することです(10個のコンテナーが必要な場合は10個など)。代替ソリューションはありますか?


jenkinsのようなCIサーバーを使用している場合は、それを簡単に操作できます
LinPy

環境は固定的なものではありません。目標は基本的に、必要なだけインスタンスをどこにでもポップアップすることです。上記のymlテンプレートをさまざまな環境変数で解決することができますが、を使用--scaleしてそれを行う方法があるかどうか興味があります。
ハッシュ

Swarmモードを使用できない理由はありますか?
eez0

連続ポートと確定的ポートバインディングで複数のインスタンスを作成するには、スウォームモードをどのように利用しますか?
ハッシュ

複数のインスタンスを実行したい場合、リクエストを送信すると、利用可能なインスタンスの1つに移動します。これはあなたが望む行動ですか?
Keaz

回答:


3

いいえ、現在(10/14/19)docker-composeファイルでポート選択を確定的にすることはできません。この動作はGithubの問題#722および#1247で要求されましたが、これらの問題は、問題が実装されずに終了しました。

アプリケーションのように半動的にスケーリングしたい場合は、別の方法で解決する必要があります。君の.yml IMOクリーンなソリューションのようなテンプレートアイデア音。

ポートを確定的にする必要がありますか?1つのホストポートでリッスンし、すべてのDockerコンテナー間で負荷を分散するnginxのようなリバースプロキシを使用する場合、それはユースケースで機能しますか?Dockerコンテナーでのnginxロードバランサーの設定は非常に簡単です。それを検討することをお勧めします。特定のサーバーにリクエストを繰り返し送信できるように、呼び出し元がサービスのポートを知るための確定的な方法が必要な場合は、.ymlテンプレートソリューションまたは何らかのサービス検出プロセスを使用してください。 docker-compose構成。


リンクありがとうございます。問題に対処していなかったので少しがっかりしました...完全に自動スケーリングしたいのですが。:)コンテナが稼働する前にいくつかのファイルを生成するために確定的なポートが必要です(各ポートは別のユーザー用である必要があるため、ロードバランシングを選択する前にコメントしました)。つまり、あなたが共有した情報は、答えではなくコメントのようなものです。
ハッシュ

そのため、その場合、docker-composeとdockerが処理するように装備されているため、実際には「動的にスケーリング」していません。彼らはあなたのサービスのインスタンスが完全に交換可能であることを期待しています、そしてあなたの場合それらはそうではありません...あなたはある種のサービス発見メカニズムまたはポートの確定的な割り当てのいずれかを必要とします、そしてあなたの.ymlテンプレートアプローチは最も速く、最も簡単だと思います解決。ところで、私は技術的に「ポートの分布を確定的にする方法はありますか?」という質問に答えました。:)しかし、私はもっと役立つ解決策を提案できなかったことをお詫び申し上げます。
ブレンダンゴギン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.