일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 백엔드
- JPA
- spring boot
- Spring
- 데이터베이스
- CI/CD
- computer science
- Spring Security
- spring cloud
- web server
- CS
- 도커
- 자바
- 스프링 시큐리티
- 웹 서버
- HTTP
- Container
- virtualization
- 배포
- spring batch
- mysql
- vm
- 영속성 컨텍스트
- 스프링 부트
- 컨테이너
- ORM
- 가상화
- 스프링
- 스프링 배치
- Java
- Today
- Total
개발 일기
[Docker] 하나의 컨테이너에 하나의 어플리케이션만? 본문
정리하게된 계기
이번에 nginx-react(front)-spring(back)을 도커를 통해 각각을 EC2에서 컨테이너로 작동시키고자했다. 그러나 프론트의 랜더링에 대한 이해가 부족했던 탓인지 Nginx의 이해도가 부족했던 탓인지 하면서 계속 80포트로 받아서 백엔드의 요청은 잘 받았지만 프론트로는 요청을 제대로 보내주지 못했다. 사실 이러한 단순한 문제로 2일을 잡아먹었다.
그래서 어제 최근 학교에 선배 특강을 오셨던 쿠팡 백엔드 개발자 선배님께 따로 연락을 드렸고 도움을 받았다.
선배님의 답변을 통해 다시 시도했고
3개의 컨테이너가 각각 하나의 어플리케이션을 가지고 컴포즈를 통해 잘 동작하고 OAuth2.0 또한 아주 잘 작동했다 ㅎ
그러나 이때 질문을 하던 과정에서 선배님께서 하나의 미션? 질문?을 던져주셨다.
처음 나의 질문 의도는 Nginx도 컨테이너로 돌리는 것이 나은가?에 대한 질문이였다. 그런데 하도 길고 긴 상황 설명과 질문을 하다보니 내가 봐도 엉뚱한 질문을 한 것 같았다. 그런데 운 좋게?도 내가 모르고 있는 부분을 명확하게 꼬집어 주셨다.
사실 나는 이때까지 도커를 공부하고 사용하면서 그냥 거의 대부분의 사람들이 하나의 컨테이너 안에는 하나의 어플리케이션만 쓰니까 그냥 따라서 나도 하나의 컨테이너로 하나의 어플리케이션만 띄웠다. 그런데 저렇게 질문이 들어와서 생각을 해보니 막상 답을 할 수 없었다. 물론 누구에게는 너무 당연한 질문일 수도 있지만 어쨋든 나는 모르고 있었고 배우고 있는 입장이기 때문에 정리해놔야 겠다는 생각이 들었다.
이번 기회에 왜 그렇게 쓰는지에 대해서 알고 도커를 써야겠다.
사고 과정
왜 하나의 컨테이너에는 하나의 어플리케이션을 쓰는 가에 대해 고민을 해봤다.
처음엔 Virtual Machine을 통한 가상화 방식보다 Container 가상화 방식이 더 나은 점에 대해 생각해봤다. VM에서는 Host OS위에서 각각의 Guest OS를 동작시키기 위해 필요한 커널, 라이브러리 등을 위한 리소스들이 컨테이너에선 필요없다? 이거는 답이 될 수 없을 것 같았다.
그래서 처음으로 돌아가서 도커 자체가 왜 이렇게 널리 쓰이는가?에 대해 생각해 봤다. 도커는 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼으로 핵심은 "가상화"를 위한 플랫폼이라는 것이다.
그래서 또 이어서 가상화가 왜 필요한가에 대해서 또 고민해봤다.
가상화 없이 프로그램을 돌리게 되면 하나의 컴퓨터에 여러 어플리케이션(프로그램)을 한번에 돌리거나 아니면 하나의 컴퓨터에 하나의 프로그램만 돌리거나 두 가지 방법이 있을 것이다. 이 중 전자로 인해 발생할 수 있는 문제가 바로 저 질문에 대한 답이 될 수 있을 것 같았다.
만약 하나의 컴퓨터에서 여러개의 프로그램을 돌리게 되면 프로그램 간에 간섭이 발생하고 자원을 경쟁 상태로 소비하게되어 안정성의 문제와 성능의 문제가 발생할 수 있다. 그렇다고해서 하나의 컴퓨터에 하나의 프로그램만 돌리게 되면 그만큼 낭비하는 리소스가 발생하기 때문에 이러한 낭비되는 리소스를 최대한 활용하기 위해 논리적으로 독립적인 공간을 만들어서 사용할 수 있는 VM, Container 방식의 가상화를 도입하게 된 것이다.
그래서 왜 ???
이때 하나의 컴퓨터에 여러 프로그램을 올렸을 때 발생할 수 있는 문제가 바로 위의 질문인 왜 하나의 컨테이너에 하나의 어플리케이션만? 이라는 질문에 답이 될 수 있을 것 같다.
결론적으로 애초에 도커를 도입한 이유가 가상화를 통해 하나의 컴퓨터에 여러 프로그램을 올려서 그 프로그램들 간에 리소스 경쟁으로 인한 성능 저하를 겪지 않지 않기 위함인데 도커의 컨테이너 안에 하나의 어플리케이션만 돌리지 않고 여러 개의 어플리케이션을 돌리게 되면 그 여러 어플리케이션 끼리의 간섭 및 리소스 경쟁이 발생할 수 있기 때문에 도커를 도입한 의미 자체가 없어지기 때문이다.
'DevOps > Docker Kubernetes' 카테고리의 다른 글
[Docker] 컨테이너 런타임(Container Runtime) (0) | 2024.05.21 |
---|---|
[Kubernetes] 쿠버네티스(Kubernetes) 교양 쌓기 (0) | 2024.05.21 |
[Docker] 스프링 부트 Dockerfile 작성부터 EC2 환경에 배포까지 (0) | 2024.05.19 |
[Docker] 도커파일(Dockerfile) 작성하기 (0) | 2024.05.15 |
[Docker] 도커 명령어 정리 (0) | 2024.05.14 |