Docker quy mô với ràng buộc cổng xác định


14

Tôi muốn mở rộng một wildflycontainer có tiếp xúc với nhiều cổng với kết quả xác định.

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}/

Lệnh bắt đầu

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

Nó gần như hoạt động như tôi muốn, nhưng có một số khác biệt về cổng. Khi tôi tạo các container, tôi muốn chúng có các cổng tăng dần cho mỗi container được hiển thị như sau:

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

Nhưng những gì tôi nhận được là kết quả không mang tính quyết định và trông như thế này:

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

Vấn đề là mỗi khi tôi chạy lệnh soạn thảo, các cổng sẽ khác nhau đối với mỗi container.

Ví dụ đầu ra:

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

Câu hỏi

Có cách nào để phân phối cổng xác định? Giống như vô hiệu hóa chạy song song để kiểm tra nối tiếp trên các cổng có sẵn hoặc bất kỳ phương pháp nào khác? Cách thay thế duy nhất tôi tìm thấy là có một yml mẫu và tạo tất cả các tệp cần thiết (như 10 nếu tôi cần 10 container, v.v.). Có giải pháp thay thế nào không?


nếu bạn sử dụng máy chủ CI như jenkins, bạn có thể xử lý đơn giản
LinPy

Môi trường không phải là một cố định. Mục tiêu về cơ bản là bật nó lên bất cứ nơi nào nhiều trường hợp cần thiết. Tôi có thể giải quyết nó với ymlmẫu được đề cập với các biến môi trường khác nhau, nhưng tôi quan tâm nếu có bất kỳ cách nào để sử dụng --scaleđể làm như vậy.
Hash

Có lý do nào ngăn bạn sử dụng chế độ Swarm không?
eez0

Làm thế nào bạn sẽ sử dụng chế độ swarm để tạo nhiều phiên bản với các cổng tuần tự và với ràng buộc cổng xác định?
Hash

Bạn muốn chạy nhiều thể hiện, khi bạn gửi một yêu cầu thì nó sẽ chuyển đến một trong các thể hiện có sẵn. Đây có phải là hành vi bạn muốn?
Keaz

Câu trả lời:


3

Không, hiện tại bạn không thể (10/14/19) làm cho lựa chọn cổng xác định trong tệp soạn thảo docker. Hành vi này đã được yêu cầu trong các vấn đề Github # 722# 1247 , nhưng những vấn đề đó đã bị đóng mà không có vấn đề nào được thực hiện.

Nếu bạn muốn mở rộng quy mô một ứng dụng giống như bạn làm, thì bạn sẽ cần giải quyết theo cách khác. .ymlÝ tưởng khuôn mẫu của bạn nghe có vẻ như là giải pháp sạch nhất IMO.

Bạn có chắc chắn rằng bạn cần các cổng để được xác định? Nếu bạn sử dụng proxy ngược như nginx lắng nghe trên một cổng máy chủ và cân bằng tải giữa tất cả các container docker của bạn, điều đó có hiệu quả cho trường hợp sử dụng của bạn không? Thiết lập bộ cân bằng tải nginx trong thùng chứa docker khá đơn giản. Tôi khuyên bạn nên xem xét điều đó và nếu bạn vẫn cần một cách xác định để người gọi biết cổng dịch vụ để họ có thể gửi yêu cầu đến một máy chủ cụ thể, thì hãy đi cùng với .ymlgiải pháp tạo khuôn mẫu của bạn hoặc một loại quy trình khám phá dịch vụ riêng biệt cấu hình docker-compose.


Cảm ơn bạn đã liên kết, tôi hơi thất vọng vì họ thậm chí không giải quyết vấn đề ... Tôi muốn mở rộng quy mô hoàn toàn tự động. :) Tôi cần các cổng xác định để tạo một số tệp trước khi các thùng chứa hết (mỗi cổng nên dành cho một người dùng khác nhau để tôi nhận xét trước khi cân bằng tải không phải là một tùy chọn). Vì vậy, thông tin bạn đã chia sẻ giống như một bình luận, không phải là một câu trả lời.
Hash

Vì vậy, trong trường hợp đó, bạn không thực sự "mở rộng quy mô" theo cách mà docker-compose và docker được trang bị để xử lý. Họ đang mong đợi các phiên bản dịch vụ của bạn có thể hoán đổi cho nhau và trong trường hợp của bạn không phải là ... bạn cần một cơ chế khám phá dịch vụ nào đó hoặc gán cổng xác định và tôi nghĩ .ymlcách tiếp cận khuôn mẫu của bạn là nhanh nhất, dễ nhất giải pháp. Và btw, tôi đã trả lời kỹ thuật câu hỏi của bạn về "Có cách nào để phân phối cổng xác định không?" :) nhưng tôi xin lỗi rằng tôi không thể đề xuất một giải pháp hữu ích hơn.
Brendan Goggin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.