LG CNS 부트캠프 학습일지 55일차
학습 내용
- 마이크로서비스를 컨테이너로 만들기
- Dockerfile 작성하기
- docker-compose.yml 작성하기
curl명령어로 JSON 데이터를 보낼 때 파일을 사용하기
개요
지금까지 개발한 마이크로서비스를 컨테이너로 만들었다. 더 이상 로컬 컴퓨터에서 실행하는 것이 아니기 때문에, application.yml 파일을 컨테이너 환경에 맞게 수정해주어야 했다.
Dockerfile
Dockerfile을 작성해서 마이크로서비스가 실행될 독립된 환경을 만들어줄 수 있다. 자바 스프링부트 어플리케이션이기 때문에 JDK 또는 JRE 베이스 이미지를 사용하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FROM maven:3.9.11-eclipse-temurin-21 AS builder
WORKDIR /build
COPY pom.xml ./pom.xml
COPY src ./src
RUN mvn clean compile package -DskipTest=true
FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=builder /build/target/user-service-1.0.jar /app/user-service.jar
ENTRYPOINT ["java", "-jar", "user-service.jar"]
위 Dockerfile은 크게 두 가지 부분으로 구성되어 있다. 두 개 FROM 명령어를 기준으로 나눌 수 있는데, 전반부는 스프링부트 어플리케이션을 빌드하는 부분이고, 후반부는 빌드 결과를 실행환경으로 가져와서 java 명령어로 실행한다. 빌드환경은 Maven 베이스 이미지를 사용했고, 실행환경은 JRE를 사용했다.
데비안 베이스 이미지에 Maven이랑 JRE를 설치해서 사용하면 되지 않나 생각했는데, 이 접근 방법은 문제가 몇 가지 있다.
- 이미지 크기가 불필요하게 커질 수 있다.
- 베이스 이미지에 필요한 패키지가 없을 수 있다.
조금 더 부연하자면 Maven은 빌드할 때는 필요하지만 실행할 때는 필요하지 않다. 실행할 때는 java 명령어와 .jar 파일이 있기만 하면 되기 때문이다.
소스코드를 git clone 명령어로 불러오는 것에 대하여
위 Dockerfile은 스프링부트 어플리케이션 소스코드를 호스트에서 복사한다. 하지만 Dockerfile 안에서 깃 저장소로부터 소스코드를 내려받는 단계를 정의하고, 그것을 빌드하는데 사용하는 것이 좋지 않을까 생각했었다. 실제로 그렇게 Dockerfile을 작성하는 경우를 봤었다.
만약 어플리케이션 개발자와 도커 이미지 개발자가 동일하다면 Dockerfile에서 깃 저장소에서 소스코드를 내려받는 단계를 정의하는 것이 딱히 필요하지 않을 것이다. 반면 그렇지 않은 경우라면 Dockerfile에서 소스코드를 내려받는 단계를 정의해서 빌드를 하는 것이 자연스러울 수 있겠다고 생각했다.
docker-compose.yml 작성하기
지금까지 배웠던 docker-compose.yml 파일 작성 방식이랑 다르지 않다. 하지만 컨테이너 정의 단계에서 스프링부트 어플리케이션에 환경변수값을 전달할 수가 있어서 그 방법을 적으려고 한다.
1
2
3
4
5
6
7
environment:
server.port: 8081
spring.cloud.config.uri: http://config-server:8888
spring.zipkin.base-url: http://zipkin:9411
eureka.client.service-url.defaultZone: http://service-discovery:8761/eureka
eureka.instance.ip-address: 172.30.1.13
management.zipkin.tracing.endpoint: http://zipkin:9411/api/v2/spans
위 환경변수 값들은 application.yml 파일에서 정의한 내용들이다. Config Server에서 일괄적으로 업데이트하는 방법이 있는데, 컨테이너 정의 단계에서 특정 값을 사용하도록 만들 수가 있었다. application.yml 파일을 수정할 때마다 다시 빌드할 필요가 없는 것이다. 하지만 application.yml 파일에서 어플리케이션의 기본값을 정의하고, 도커 호스트 환경에 따라서 환경변수를 사용해서 덮어씌우는 전략이 좋을 것이다. 환경변수로 전달한 값들은 Config Server에서 불어오는 값보다도 우선한다.
curl 명령어로 JSON 데이터를 보낼 때 파일을 사용하기
curl 명령어로 JSON 데이터를 보낼 때 지금까지 명령어에 입력했었다.
1
curl --request POST http://localhost:8081/users --header "Content-Type: application/json" --data "{ ... }"
하지만 명령어를 반복하다보니 데이터를 매 번 입력하는 것이 불편했다. 명렁어 히스토리를 불러와서 다시 사용할 수 있지만, 원하는 명령어가 있을 때까지 화살표 키를 반복해서 누르는 것도 일이다.
대신에 아래와 같이 JSON 데이터를 파일로 만들어서 전달할 수 있었다.
1
curl --request POST http://localhost:8081/users --header "Content-Type: application/json" --data @user-registration.json
Comments powered by Disqus.