로컬에서 Nginx와 Spring Boot의 로그를 ES쌓는 파이프라인 ELK을 구현해본다.
Spring Boot Application을 Docker로 띄우기
첫번째 스텝은 Nginx와 Spring Boot를 Docker로 띄어 통신이 되는지 확인한다.
Spring Boot는 단순 응답만 하는 간단한 프로젝트를 생성했다.
Spring Boot의 jar파일이 현재 작성할 Dockerfile과 같은 디렉토리에 있다는 전제하에 Spring Boot를 띄울 Dockerfile은 다음과 같다.
FROM java:8
EXPOSE 8080
COPY ./application.jar application.jar
CMD ["java", "-jar", "application.jar"]
Docker 내부에서 jar파일을 실행시키고 8080포트를 오픈한다는 뜻이다.
작성된 Dockerfile을 spring-app:1이라는 이름으로 이미지 빌드한다.
$ docker image build -t spring-app:1
빌드된 이미지를 Docker에 띄운다.
$ docker run -p 18080:8080 spring-app:1
로컬에 18080포트를 열어주고 Docker는 18080포트를 내부의 8080포트로 포트포워딩시킨다는 뜻이다.
Docker에 스프링 애플리케이션이 제대로 띄어졌는지 확인한다.
$ curl localhost:18080
> Hello, SpringBoot !!
Nginx & Spring Boot를 Docker로 띄우기
위에서 빌드한 스프링부트 이미지를 이용해서 Nginx와 함께 Docker에 띄어본다.
먼저 nginx에서 springboot로 리버시 프록시를 할 것이므로 다음과 같이 설정파일을 로컬에 작성한다.
# nginx/nginx.conf
user nginx;
worker_processes 1;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://spring-app:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
여기서 spring-app:8080 으로 리버시프록시를 해주고 있는데, Docker끼리는 컨테이너 명을 보고 인식할 수 있으므로 spring-app으로 설정이 가능하다.
이제 위에서 작성한 nginx 설정파일과 스프링 애플리케이션 이미지를 docker에 띄우기 위해 docker-compose 활용할 것이다.
다음과 같이 docker-compose.yml 파일을 작성한다.
# docker-compose.yml
version: "3"
services:
spring-app:
image: spring-app:0.1
nginx:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/log:/var/log/nginx
spring boot app의 컨테이너 명은 spring-app으로 설정해서 image을 설정하였다.
nginx는 컨테이너 명을 nginx로 하고, 이미지는 기본적으로 제공하는 nginx 이미지를 설정했다.
port는 80포트를 열어주었고, 작성한 nginx의 설정파일을 보도록 볼륨 설정을 했다. (path가 다르다면 수정할 것)
nginx log 또한 로컬에서 확인하기 위해 마운트해주었다.
작성된 docker-compose 파일을 실행시켜본다.
$ docker-compose up
Nginx -> Spring Boot 제대로 Docker에 띄어졌는지 확인
$ curl localhost
> Hello, SpringBoot !!
여기까지 요청 플로우를 정리하면,
1. 로컬에서 80포트로 curl을 날림
2. Docker Nginx가 요청을 받고 8080포트로 리버시프록시
3. Docker Spring Boot App이 요청을 받고 응답
글이 너무 길어져서 1편은 여기서 마무리....!!