[docker] 결정적 포트 바인딩을 사용하는 Docker 스케일

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 등). 대체 솔루션이 있습니까?



답변

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

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

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


답변