Docker Compose를 사용하여 여러 Spring Boot 서비스 실행
10415 단어 dockercomposespringbootdevopsdocker
Docker가 작성한 이유는 무엇입니까?
우선, 여러 컨테이너를 실행하기 위해 Docker compose가 필요하지 않습니다.용기를 수동으로 시작하고 멈추면 앞의 post 와 같이 이 작업을 완성할 수 있습니다.그러나 응용 프로그램에서 용기 수가 증가함에 따라 모든 용기를 수동으로 관리하는 것은 더욱 번거로워졌다.
Docker compose를 사용하면 단일 YAML 파일에 다중 컨테이너 응용 프로그램을 구성하여 작업을 단순화할 수 있습니다.단일 명령을 사용하여 응용 프로그램의 모든 용기를 시작하고 정지할 수 있습니다.
응용 프로그램 코드 예
나는 이 글을 위해 예시 프로그램을 만들었는데, 너는 Github 에서 얻을 수 있다.그것은 다음과 같은 내용을 포함한다
은행 계좌 서비스 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 실행 설정 서비스 용기에 필요한 모든 설정을 정의하였습니다services
compose에서 용기를 실행하는 그림을 알려 줍니다.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 up
를 micro-services-network
로만약 우리가 명확한 정의
banks-service
가 없다면, Docker는 기본적으로 하나를 만들고compose 파일의 모든 서비스를 추가합니다.응용 프로그램 실행
실행
config-service
명령은config-service:8888.
만들기network
에 8888 포트를 공개하고 호스트 이름docker-compose up
을 통해 다른 용기에 접근할 수 있습니다.micro-service-network
에 포트 8080을 공개하고 호스트 이름config-service
을 통해 다른 용기에 접근할 수 있습니다.micro-service-network
및 config-service
부팅에는 약 20초가 소요됩니다.bank-service
를 실행하면 방금 만든 두 개의 용기를 볼 수 있습니다.서비스 종속성 및 시작 순서
용기 사이에는 일반적으로 의존 관계가 존재하기 때문에 용기 a는 용기 a가 시작되기 전에 용기 B를 실행해야 한다.
micro-service-network
속성을 사용하여 시작 순서를 정의하면 Compose에서 이 장면을 어느 정도 처리할 수 있습니다.예를 들어 다음compose 파일은 bank-service
서비스와 bank-service
서비스를 정의했는데 그 중에서 config-service
은 docker container ls
에 의존한다.version: '3'
services:
web:
image: myWebApp
depends_on:
- db
db:
image: postgres
위의 예시에서 compose는 의존 관계 순서에 따라 용기를 시작하기 때문에 depends_on
는 web
전에 시작합니다.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에 올라왔다.
Reference
이 문제에 관하여(Docker Compose를 사용하여 여러 Spring Boot 서비스 실행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/briansdevblog/running-multiple-spring-boot-services-with-docker-compose-5c2g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)