Docker Compose를 사용하여 여러 Spring Boot 서비스 실행

이 문서에서는 Docker Compose가 로컬 환경에서 여러 컨테이너를 쉽게 구성하고 실행할 수 있도록 하는 방법에 대해 설명합니다.

Docker가 작성한 이유는 무엇입니까?


우선, 여러 컨테이너를 실행하기 위해 Docker compose가 필요하지 않습니다.용기를 수동으로 시작하고 멈추면 앞의 post 와 같이 이 작업을 완성할 수 있습니다.그러나 응용 프로그램에서 용기 수가 증가함에 따라 모든 용기를 수동으로 관리하는 것은 더욱 번거로워졌다.
Docker compose를 사용하면 단일 YAML 파일에 다중 컨테이너 응용 프로그램을 구성하여 작업을 단순화할 수 있습니다.단일 명령을 사용하여 응용 프로그램의 모든 용기를 시작하고 정지할 수 있습니다.

응용 프로그램 코드 예


나는 이 글을 위해 예시 프로그램을 만들었는데, 너는 Github 에서 얻을 수 있다.그것은 다음과 같은 내용을 포함한다
  • 스프링 부팅 어플리케이션 2개
  • 은행 계좌 서비스 - 은행의 간단한 계좌 정보를 만들고 읽는 데 사용되는 REST API
  • 공개
  • 구성 서비스 - 애플리케이션 구성이 포함된 REST API를 은행 계좌 서비스
  • 에 공개
  • Dockerfiles 2개 - 상기 서비스의 컨테이너 이미지 정의
  • 다중 컨테이너 응용 프로그램을 정의하는 Docker compose 파일
  • Docker 관련 사항 외에는 안내 서비스를 자세히 설명하지 않습니다.만약 당신이 더 많은 정보를 알고 싶다면, 당신은 이전 페이지를 볼 수 있습니다.

    은행 계좌 서비스 Dockerfile


    우리는 은행 계좌 서비스에 Docker 이미지를 정의하기 시작할 것이다.
    # MAINTAINER Brian HannawayFROM openjdk:8-jre-alpine
    WORKDIR /app
    # Add wait script to the image - script pulled from https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait
    COPY /scripts/wait /app/RUN chmod +x /app
    RUN apk --no-cache add curl
    COPY /target/bank-account-service-0.0.1-SNAPSHOT.jar /app/
    CMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar
    
    FROM openjdk:8-jre-alpine Docker에게 openjdk:8-jre-alpine base 이미지를 사용하라고 알려줍니다.WORKDIR /app Docker가/app이라는 이미지에 새 작업 디렉토리를 만듭니다.다른 모든 명령은 이 디렉터리에서 실행됩니다.COPY /scripts/wait /app/ 호스트의 scripts 디렉터리에서 이미지의/app 디렉터리로 스크립트를 복사하는 것을 Docker에게 알려 줍니다.잠시 후 스크립트를 기다리는 목적을 상세하게 설명할 것입니다.wait/app 디렉터리의 내용을 실행할 수 있도록 하기RUN chmod +x /app 호스트의 대상 디렉토리에서 이미지의/app 디렉토리로 서비스 JAR 복사COPY /target/bank-account-service-0.0.1-SNAPSHOT.jar /app/ 스크립트를 실행하고 은행 계좌 서비스를 실행합니다.CMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar 스크립트가 완성되기 전까지는 서비스가 실행되지 않습니다.

    서비스 Dockerfile 구성


    다음은 구성 서비스 Docker 이미지를 정의합니다.이것은 우리가 상술한 은행 계좌 서비스를 위해 만든 이미지의 약간 간단한 버전이다.우리는 서비스 JAR에 복사해서 실행하는 작업 디렉터리만 만들 수 있습니다.
    FROM openjdk:8-jre-alpine
    MAINTAINER Brian Hannaway
    WORKDIR /app
    COPY /target/config-server-0.0.1-SNAPSHOT.jar /app/
    ENTRYPOINT ["java", "-jar", "config-server-0.0.1-SNAPSHOT.jar"]
    

    Docker Compose 파일 정의


    현재 우리는 은행 계좌와 설정 서비스에 DockerFile을 정의했습니다. 다음은 dockercompose 파일을 만듭니다. 이 파일은 용기를 실행하기 위해 이 이미지를 어떻게 사용하는지 설명합니다.
    version: "3"
    
    services: 
       config-service: 
          image: config-service 
          container_name: config-service 
          networks: 
             - micro-service-network 
          ports: 
             - 8888:8888 
    
       bank-service: 
          image: bank-service 
          container_name: bank-service 
          networks: 
             - micro-service-network 
          ports: 
             - 8080:8080 
          environment: 
             WAIT_HOSTS: config-service:8888
    
    networks: micro-service-network:
    
    wait Docker에게 Docker compose 파일 형식의 버전 3을 사용하고 있다고 알려 줍니다.본문을 작성할 때 3판은 최신 추천 판본이다.사용하는 dockercompose 형식의 버전은 실행 중인 docker 버전에 의해 결정됩니다.Docker 버전 19.03.12를 실행하고 있습니다. 이것은 버전 3을 사용해야 한다는 것을 의미합니다.dockercompose의 어느 버전이 docker 버전과 호환되는지 확인하려면 이것 compatibility matrix 을 보십시오.

    서비스 정의

    wait 응용 프로그램을 구성하는 용기를 부분적으로 정의했다.각 서비스 정의에는 이미지에서 컨테이너를 시작하는 데 필요한 모든 구성이 포함됩니다.모든 서비스 정의의 정보는 일반적으로 명령줄에서 제공하는 수동으로 용기를 실행합니다.
    config-service: 
       image: config-service 
       container_name: config-service 
       networks: 
          - micro-service-network 
       expose: - "8888"
    

    서비스 구성

    version: "3" 부분에서docker 실행 설정 서비스 용기에 필요한 모든 설정을 정의하였습니다servicescompose에서 용기를 실행하는 그림을 알려 줍니다.config-service 는 컨테이너를 시작할 때 지정한 이름입니다.만약 우리가 이름을 지정하지 않는다면,compose는compose 파일의 이름과 이미지 이름에 따라 이름을 파생할 것입니다.예를 들어 image과runcontainer_name의name 속성을 생략하면 용기 파생의 이름이 config-service인 것을 볼 수 있다.

    보통 용기에 의미 있는 이름을 짓는 것은 좋은 생각이다.나중에 보시다시피 docker-compose up 에서 boot-microservices-docker-compose_config-service_1 을 참조해야 합니다.이 작업은 config-service 에서 지정한 이름으로 수행됩니다.bank-service 용기가 시작될 때 들어갈 네트워크를 정의합니다.이 예에서는 container_name 을 추가하고 나중에 정의합니다.networks 컨테이너에 노출된 포트가 나열됩니다.포트는 기본 네트워크나 용기가 연결된 모든 네트워크에 노출됩니다.포트가 호스트에 노출되지 않습니다.이를 위해서는 config-service 속성을 사용하고 적당한 매핑을 제공해야 합니다.

    은행 서비스

    micro-service-network의 정의는 우리가 이미 정의한 것과 매우 비슷하다. expose, ports, bank-service, image 속성과 container_name 정의는 비슷하다
    bank-service:
       image: bank-service 
       container_name: bank-service 
       networks: 
          - micro-service-network 
       expose: - "8080" 
       environment: 
          WAIT_HOSTS: config-service:8888
    
    networks 속성은 컨테이너의 환경 변수 목록을 지정하는 데 사용됩니다.expose 에서 환경 변수 config-service 를 지정하고 값 environment 을 부여합니다.간단히 말하면 이것은 용기의 시작 순서를 제어하고 bank-service WAIT_HOSTS 시작하기 전에 시작하고 실행하는 데 필요한 것이다.나는 잠시 후에 이 점을 상세하게 설명할 것이다.

    네트워크 정의

    config-service:8888 부분에서 귀하의 서비스에 대한 네트워크를 정의할 수 있습니다.응용 프로그램에 대해 우리는 config-service라는 네트워크를 정의했다.bank-service 를 실행하면 시작된 모든 용기가 networks 에 추가되고 응용 프로그램의 모든 다른 용기를 볼 수 있습니다.컨테이너는 호스트 이름 (서비스 이름과 동일) 을 통해 서로 참조할 수 있습니다.따라서 우리의 예시 응용 프로그램에서 micro-service-network 액세스 docker-compose upmicro-services-network
    만약 우리가 명확한 정의banks-service가 없다면, Docker는 기본적으로 하나를 만들고compose 파일의 모든 서비스를 추가합니다.

    응용 프로그램 실행


    실행config-service 명령은
  • 네트워킹 네트워킹 config-service:8888. 만들기
  • 이미지를 사용하여 컨테이너를 시작합니다.이 컨테이너는 network 에 8888 포트를 공개하고 호스트 이름docker-compose up을 통해 다른 용기에 접근할 수 있습니다.
  • 이미지를 사용하여 컨테이너를 시작합니다.컨테이너는 micro-service-network 에 포트 8080을 공개하고 호스트 이름config-service을 통해 다른 용기에 접근할 수 있습니다.
  • micro-service-networkconfig-service 부팅에는 약 20초가 소요됩니다.bank-service를 실행하면 방금 만든 두 개의 용기를 볼 수 있습니다.

    서비스 종속성 및 시작 순서


    용기 사이에는 일반적으로 의존 관계가 존재하기 때문에 용기 a는 용기 a가 시작되기 전에 용기 B를 실행해야 한다.micro-service-network 속성을 사용하여 시작 순서를 정의하면 Compose에서 이 장면을 어느 정도 처리할 수 있습니다.예를 들어 다음compose 파일은 bank-service 서비스와 bank-service 서비스를 정의했는데 그 중에서 config-servicedocker container ls 에 의존한다.
    version: '3'
    
    services: 
       web: 
          image: myWebApp 
          depends_on: 
             - db 
          db: 
             image: postgres
    
    위의 예시에서 compose는 의존 관계 순서에 따라 용기를 시작하기 때문에 depends_onweb 전에 시작합니다.db 용기가 작동하는 순서가 설정되어 있지만, web 용기 내의Postgres가 db 용기가 시작되기 전에 완전히 작동하는 것을 보장할 수 없습니다.
    우리의 예시 프로그램에도 유사한 문제가 있다. 왜냐하면 db 시작할 때 호출을 시도하기 때문이다. web만약 depends_on 완전히 일어서지 않고 8888 포트의 요청을 수신하는 데 사용할 수 있다면 db 실패할 것이다.먼저 web 속성을 사용하여 시작bank-service, config-service 호출 전에 완전히 조작할 수 있음을 보장할 수 없습니다.

    docker compose wait 소개


    docker-compose-wait는 상술한 문제를 해결할 수 있는 좋은 명령행 실용 프로그램이다.앞에서 config-service 스크립트를 bank-service 디렉터리에 복사해서dockercomposewait를 이미지에 사용할 수 있도록 합니다.
    # Add wait script to the image - script pulled from https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /waitCOPY /scripts/wait /app/
    
    그런 다음 컨테이너를 시작할 때 JAR과 함께 스크립트를 실행하는 Docker에 알려 줍니다.
    CMD ./wait && java -jar bank-account-service-0.0.1-SNAPSHOT.jar
    
    dockercompose 파일에서 depends_on 을 정의할 때, 우리는 config-service 환경 변수를 포함합니다. 이 변수는 8888 포트의 config-service 를 인용합니다.bank-service를 실행할 때, bank-service 스크립트는 포트 8888에서 pingwait을 실행합니다.app 8888 포트에서 시작하고 실행될 때까지 컨테이너 wait 를 시작할 수 있습니다.
    우리는 아래의 로그 부분에서 이 점을 볼 수 있다.bank-service 스크립트 검사WAIT_HOSTS가 포트 8888에서 사용할 수 있는지 확인합니다. 처음에는 사용할 수 없다고 보고했습니다.

    최종 config-service 은 8888 포트에서 부트 및 실행됩니다.그리고 docker-compose up 스크립트 보고 호스트 구성 서비스: 8888 현재 사용 가능, wait 용기 시작.

    끝내다


    본고에서 우리는dockercompose가 간단한 단일 노드 환경에서 여러 용기를 쉽게 관리하는 방법을 연구했다.이것은 개발 환경과 자동 테스트 환경에 특히 유용하다.다중 노드 환경에서 여러 컨테이너를 관리하려면 Docker Swarm이 좋습니다.우리는 곧 다른 문장에서 Swarm을 볼 수 있을 것이다.
    게시물Running Multiple Spring Boot Services with Docker Compose이 먼저 briansdevblog에 올라왔다.

    좋은 웹페이지 즐겨찾기