결정적 포트 바인딩을 사용하는 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"

도커 파일

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.
Hash

Swarm 모드를 사용하지 못하게하는 이유가 있습니까?
eez0

스웜 모드를 사용하여 순차적 포트와 결정적 포트 바인딩이있는 다중 인스턴스를 작성하는 방법은 무엇입니까?
Hash

요청을 보낼 때 여러 인스턴스를 실행하려는 경우 사용 가능한 인스턴스 중 하나로 이동합니다. 이것이 당신이 원하는 행동입니까?
Keaz

답변:


3

아니요, 현재 (10/14/19) docker-compose 파일에서 포트 선택을 결정적으로 지정할 수 없습니다. 이 동작은 Github 문제 # 722# 1247 에서 요청되었지만 문제가 구현되지 않은 상태에서 종료되었습니다.

소리가 들리는 것처럼 응용 프로그램을 반동적으로 확장하려면 다른 방법으로 해결해야합니다. 귀하의 .yml템플릿 아이디어 사운드는 IMO 깨끗한 솔루션을 좋아한다.

포트가 결정적이어야합니까? 하나의 호스트 포트에서 수신 대기하고 모든 도커 컨테이너 간의 부하를 분산시키는 nginx와 같은 리버스 프록시를 사용하는 경우 사용 사례에 적합합니까? 도커 컨테이너에 nginx로드 밸런서를 설정하는 것은 매우 간단합니다. 나는 당신이 그것을 조사 할 것을 제안하고, 여전히 호출자가 서비스 포트를 알 수있는 결정적인 방법이 필요한 경우 특정 서버에 반복적으로 요청을 보낸 다음 .yml템플릿 솔루션이나 서비스 검색 프로세스와 별도로 갈 수 있습니다. 도커 작성 구성.


링크 주셔서 감사합니다, 나는 그들이 문제를 해결하지 않은 조금 실망 해요 ... 나는 완전히 자동으로 확장하고 싶습니다. :) 컨테이너가 가동되기 전에 일부 파일을 생성하려면 결정적 포트가 필요합니다 (로드 밸런싱이 옵션이되기 전에 주석을 달았 듯이 각 포트는 다른 사용자를위한 것이어야합니다). 따라서 여러분이 공유 한 정보는 답변이 아닌 설명과 비슷합니다.
Hash

따라서이 경우 도커 작성 및도 커가 처리 할 수있는 방식으로 실제로 "동적 크기 조정"이 아닙니다. 그들은 귀하의 서비스 인스턴스가 완전히 상호 교환 가능할 것으로 기대하고 있으며 귀하의 경우에는 그렇지 않습니다 ... 당신은 어떤 종류의 서비스 발견 메커니즘이나 포트의 결정적 할당이 필요하며, 귀하의 .yml템플릿 접근 방식이 가장 빠르고 쉽다고 생각합니다 해결책. 그리고 btw, 나는 기술적으로 "포트 분배를 결정 론적으로 만드는 방법이 있습니까?"라는 당신의 질문에 대답했습니다. :) 그러나 더 유용한 해결책을 제안 할 수 없어서 죄송합니다.
Brendan Goggin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.