नियतात्मक पोर्ट बाइंडिंग के साथ डॉकर स्केल


14

मैं wildflyनियतकालिक परिणामों के साथ कई बंदरगाहों को उजागर करने वाले एक कंटेनर को स्केल करना चाहूंगा ।

डोकर-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 

समस्या यह है कि हर बार जब मैं कंपोज़ अप कमांड चलाता हूं, तो पोर्ट प्रत्येक कंटेनर के लिए अलग-अलग होते हैं।

उदाहरण आउटपुट:

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 कंटेनरों आदि की आवश्यकता है)। क्या कोई वैकल्पिक उपाय हैं?


यदि आप
जेन

पर्यावरण एक निश्चित नहीं है। लक्ष्य मूल रूप से इसे जरूरत के रूप में कहीं भी कई उदाहरणों को पॉप अप करने के लिए है। मैं इसे ymlविभिन्न पर्यावरण चर के साथ उल्लिखित टेम्पलेट के साथ हल कर सकता हूं , लेकिन मुझे दिलचस्पी है अगर ऐसा करने का कोई तरीका है --scale
हैश

वहाँ किसी भी कारण से आप झुंड मोड का उपयोग करने से रोक रहा है?
eez0

अनुक्रमिक बंदरगाहों और नियतात्मक पोर्ट बाइंडिंग के साथ कई उदाहरण बनाने के लिए आप झुंड मोड का उपयोग कैसे करेंगे?
हैश

आप कई उदाहरण चलाना चाहते हैं, जब आप एक अनुरोध भेजते हैं तो यह उपलब्ध उदाहरण में से एक पर जाएगा। क्या यह व्यवहार आप चाहते हैं?
केज

जवाबों:


3

नहीं, आप वर्तमान में नहीं कर सकते (10/14/19) पोर्ट चयन निर्धारक फ़ाइल-कंपोज़ में बनाते हैं। जीथब मुद्दों # 722 और # 1247 में इस व्यवहार का अनुरोध किया गया था , लेकिन उन मुद्दों को लागू किए बिना बंद कर दिया गया था।

यदि आप एक एप्लिकेशन को अर्ध-गतिशील रूप से स्केल करना चाहते हैं जैसे कि यह आपको लगता है, तो आपको इसे एक और तरीका हल करना होगा। आपका .ymlटेम्प्लेटिंग आइडिया सबसे साफ समाधान IMO की तरह लगता है।

क्या आप सुनिश्चित हैं कि आपको निर्धारक होने के लिए बंदरगाहों की आवश्यकता है? यदि आप nginx की तरह एक रिवर्स प्रॉक्सी का उपयोग करते हैं जो एक होस्ट पोर्ट पर सुनता है और आपके सभी डॉकटर कंटेनरों के बीच लोड को संतुलित करता है, तो क्या यह आपके उपयोग के मामले में काम करेगा? एक डॉक कंटेनर में एक नगीन लोड बैलेंसर स्थापित करना बहुत सीधा है। मेरा सुझाव है कि आप उस पर ध्यान दें, और यदि आपको अभी भी सेवा के बंदरगाह को जानने के लिए एक फोन करने वाले के लिए एक निर्धारित तरीके की आवश्यकता है, तो यह एक विशिष्ट सर्वर को बार-बार एक अनुरोध भेज सकता है, तो अपने .ymlअस्थायी समाधान या किसी प्रकार की सेवा खोज प्रक्रिया से अलग जाएं। docker- रचना विन्यास।


लिंक के लिए धन्यवाद, मैं थोड़ा निराश हूं कि उन्होंने समस्या को संबोधित नहीं किया ... मैं पूरी तरह से स्वचालित रूप से स्केल करना चाहता हूं। :) कंटेनरों के उठने से पहले मुझे कुछ फ़ाइलों को बनाने के लिए नियतात्मक बंदरगाहों की आवश्यकता है (प्रत्येक पोर्ट एक अलग उपयोगकर्ता के लिए होना चाहिए, क्योंकि मैंने लोड संतुलन से पहले एक विकल्प नहीं है)। इसलिए आपके द्वारा साझा की गई जानकारी एक टिप्पणी की तरह है, जवाब नहीं।
हैश

तो उस मामले में, आप वास्तव में "गतिशील रूप से स्केलिंग" नहीं कर रहे हैं कि डॉक-कंपोज और डॉक को संभालने के लिए सुसज्जित है। वे आपकी सेवा के उदाहरणों को पूरी तरह से विनिमेय होने की उम्मीद कर रहे हैं, और आपके मामले में वे नहीं हैं ... आपको या तो किसी प्रकार की सेवा खोज तंत्र या पोर्ट के नियतात्मक असाइनमेंट की आवश्यकता है, और मुझे लगता है कि आपका .ymlअस्थायी दृष्टिकोण सबसे तेज़, सबसे आसान है समाधान। और btw, मैंने तकनीकी रूप से आपके प्रश्न का उत्तर दिया "क्या पोर्ट वितरण निर्धारक बनाने का कोई तरीका है?" :) लेकिन मैं माफी माँगता हूँ कि मैं एक अधिक उपयोगी समाधान का सुझाव नहीं दे सका।
ब्रेंडन गोगिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.