[DevOps] Apache와 Spring Boot 연결
1. 왜 Apache와 Spring Boot를 연결할까?Spring Boot는 기본적으로 내장 톰캣을 사용한다. (처음에 스프링 부트로 설정해놓고 톰캣에 띄우려고 해서 애를 먹었다...)하지만 직접 8080 포트를 열어두고 운영
ghan2.tistory.com
Apache와 Spring boot를 연결했던 이전 실습처럼,
Nginx와 Spring boot 자체를 연동하는 것도 크게 어렵지는 않았다. (아주 기본적인 설정으로만 해서지만...)
그 후로 해보려 했던 것이 도커였는데
막상 시작하려고 하니 도커를 왜 써야 하지?? 라는 의문이 들었다.
직접 해봐야 느끼는 것들이 있겠지만..
기본적으로 도커를 사용하는 이유와 방법에 대해 공부한 후 실제 적용해보려 한다.
실습 배경
나의 홈서버에는 ... 🏡
Nginx(80) <--> Spring boot(8080)
둥둥 떠있고
외부 환경에서 공인 아이피:80 으로 접속하면 나의 스프링 부트 페이지가 접속된다.
왜 Docker 인가?
현재 환경에서도 단순히 외부에서 내가 올린 페이지로 접속은 가능하지만 실제 서버를 운영하기에는 여러 한계가 존재한다.
내 로컬에서는 잘 동작하던 코드가 배포 환경에서는 뜻대로 동작하지 않을 수 있기 때문이다.
[예를 들어]
나는 Mac 환경에서 spring boot 서버를 개발하고 -> Ubuntu 환경의 홈 서버에 배포를 시도한다.
로컬 개발시 new File("resources/data.txt"); 을 했다면,
IDE 환경에서는 프로젝트 루트 기준으로 실행하기 때문에 파일 경로를 찾을 수 있지만
Ubuntu에서 배포시 실행 경로가 달라지면 해당 파일을 찾을 수 없게 된다.
한 두 번이야 하겠지만.. 배포시마다 오류가 터진다면 오류 원인 찾고 ..
경로 수정/ 버전 확인 / 권한 확인 / 로그 확인 등...
공수가 많이 들어가고 언제 오류가 발생할 지 모르는 불안정한 상태가 될 것이다.
=> ✨ 이 때 빛을 발하는게 Docker 이다.
Docker를 도입하면 환경 자체를 통째로 복제해서 배포가 가능하다!
🐳 Docker는 "앱이 실행되려면 필요한 모든 것"을 하나의 패키지로 만들어주는 도구.
그래서 배포할 때마다 환경 문제로 고생하지 않아도 된다!
Docker의 실행 원리
Docker는 리눅스 커널의 기능을 활용해서 운영체제 수준에서 가벼운 격리 환경(컨테이너)을 만드는 기술이다.
💡 Docker 와 Virtual Machine은 무엇이 다른가?
가상머신은 기본적으로 운영체제를 포함하고 있다. 이는 굉장히 무겁고 실행 속도도 느릴뿐더러 컴퓨터 리소스를 잡아먹는 원인이 된다. 반면 도커는 VM의 좀 더 경량화된 개념으로 이해할 수 있다. 운영체제를 포함하지 않고 컨테이너 엔진에 포함된 호스트 운영체제를 공유하는 방식으로 구성된다. 덕분에 나머지 환경을 격리함으로 가볍게 환경을 구축할 수 있다.
도커를 공부하기 위해 꼭 알아야 할 3대 구성요소가 있다.

Dockerfile
↓ docker build
Docker Image (읽기 전용 레이어)
↓ docker run
Docker Container (읽기/쓰기 가능한 인스턴스)
1. Dockerfile: 이미지 만드는 설계도
이미지를 만들기 위한 스크립트(레시피)이다.
어떤 OS를 사용할건지, 어떤 파일을 복사할건지, 어떤 명령어로 앱을 실행할지를 한 줄씩 작성한다.
dockerfile
FROM openjdk:17
COPY build/libs/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
2. Docker Image: 실행 가능한 앱 패키지
dockerfile로 만든 실행 가능한 앱 환경의 스냅샷이다.
파일 시스템 + 실행 설정 + 필요한 환경들이 전부 들어있다.
읽기 전용이며, 컨테이너를 실행할 수 있는 템플릿 역할을 한다.
docker build -t gan-app .
3. Docker Container: 실제 실행되는 앱 인스턴스
이미지를 기반으로 실행한 프로세스
읽기 전용 이미지 + 읽기 / 쓰기 가능한 격리된 공간으로 만들어진다.
여러 개 만들 수 있고, 각각 독립된 환경에서 돌아간다.
docker run -d -p 8080:8080 --name myapp gan-app
Docker로 띄워보자
이제 각각의 서버(Spring Boot 앱, Nginx, MySQL 등) 를 각각 하나의 Docker 컨테이너로 감싸보자.
그리고 그 전체를 관리하는 도구를 docker-compose라고 한다.
docker-compose는 여러 개의 컨테이너들을 한번에 띄우고, 한번에 연결해주는 관리자 역할을 한다.
- Nginx + Spring Boot를 직접 설치해서 띄운 상태에서 Docker 컨테이너 기반으로 전환하려 한다.
project-root/
├── spring-app/ ← Spring Boot 프로젝트 (jar 생성됨)
│ └── Dockerfile
├── nginx/
│ └── nginx.conf
├── docker-compose.yml
- Spring Boot → Dockerfile 작성
FROM openjdk:17
COPY build/libs/craft-shop.jar app.jar. --- craft-shop 자리에는 자르 파일 이름 명시
ENTRYPOINT ["java", "-jar", "/app.jar"]
- nginx.conf 작성

- docker-compose.yml 작성

여기까지 작성을 마쳤다면 이제 도커 컴포즈를 실행해준다.
sudo docker-compose up --build -d
오류 메시지 없이 done 된다면
도커가 잘 띄워졌는지 확인한 후
sudo docker ps
http:[공인 IP] 로 접속하여 내가 올린 스프링 부트 페이지가 잘 띄워졌는지 확인한다.

마치며..
요즘 Hello World가 정말 반갑다..
docker에 대한 내용이 막막했었는데 간단한 개념 정리와 실습을 통해 흐름을 이해할 수 있었다.
아직 모르는 내용이 너~~~무 많다.. 무중단 배포도 도전해보고 싶지만.. 놓쳤던 내용들 먼저 다시 짚어보고 차근차근 해보자 !
'CS 지식 > DevOps' 카테고리의 다른 글
| [DevOps] Jenkins로 중단 배포 (5) | 2025.08.03 |
|---|---|
| [DevOps] Apache와 Nginx 차이 (2) | 2025.07.04 |
| [DevOps] Apache와 Spring Boot 연결 (0) | 2025.07.01 |
| [DevOps] CI / CD 무중단 배포 (0) | 2024.06.22 |