티스토리 뷰
최근 면접을 통해 Docker와 GitHub Actions를 활용한 자동 배포 경험이 있으면 좋다는 이야기를 듣게 되었다.
실제로 적용해보기 전에 도커가 무엇인지 그리고 왜 사용하는지에 대해 먼저 이해하고 나서 사용하는 것이 좋을 것 같아 적어보는 글이고, 실습보다는 이론적인 내용들로 정리해 볼 생각이다.
가상화 나오게 된 배경을 알아보자
내가 만든 웹서비스를 실행하기 위해 서버로 쓸 컴퓨터를 하나 구했다고 가정해 보자.
웹서비스를 위해 필요한 Java, MySQL 등의 소프트웨어를 설치하고, 많은 사용자가 사용할 수 있도록 서버를 설정했습니다.
시간이 지나, 또 다른 웹서비스를 개발하게 되었고, 이 새로운 서비스도 같은 컴퓨터에 설치하고자 합니다.
그러나 여기서 문제가 발생합니다.
새 웹서비스는 최신 버전의 Java 17과 MySQL 8.0을 사용해 개발되었고, 이전에 설치된 웹서비스와 버전이 달라 충돌이 발생했습니다.
혹은, 새로운 웹서비스가 Python으로 개발되어 아예 다른 언어를 사용할 수도 있겠죠?
물론 웹서비스마다 다른 컴퓨터를 사용해 충돌을 피할 수 있습니다.
하지만 이 경우 추가로 컴퓨터를 구매해야 하므로 비용이 많이 듭니다.
또한 고작 하나의 웹서비스를 위해 하나의 컴퓨터를 사용하게 된다면 컴퓨터의 리소스를 제대로 활용하지 못할 것입니다.
그럼 서버를 나눠서 사용할 수 있지 않을까?
이것이 바로 가상화라는 개념이 나오기 시작한 배경입니다.
가상화에는 서버 가상화와 컨테이너 기반 가상화가 있는데 이 둘에 대해 자세히 알아보도록 하겠습니다.
++ 참고로 도커는 컨테이너 기반 가상화 기술 중 하나의 속합니다.
서버 가상화가 뭐지?
서버 가상화란 하나의 물리적 서버를 여러 개의 독립된 운영체제로 나누어 사용하는 기술입니다.
우리가 아까 샀던 "컴퓨터"를 보면, 가장 아래에 CPU, RAM과 같은 하드웨어가 있고, 그 위에 운영체제가 설치되어 있습니다.
그 위에 하이퍼바이저를 설치하여 서버 가상화를 구현할 수 있는데,
하이퍼바이저는 가상화 기술을 활용해 하나의 물리적 서버에서 여러 개의 운영체제를 생성하고 관리할 수 있게 해주는 소프트웨어입니다.
그렇게 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제라고 부릅니다.
이렇게 구별이 된 여러 개의 운영체제들은 가상머신이라는 단위로 구별이 됩니다.
하이퍼바이저는 물리적인 리소스를 논리적으로 쪼개 각 가상머신에게 자원을 나눠주며 조율합니다.
👉🏻 이로써, 가상머신은 각기 독립적인 공간과 시스템 자원을 할당받아, 마치 독립된 물리적 서버처럼 작동합니다.
서버 가상화의 단점으로는 무조건 하이퍼바이저를 거쳐야 하므로, 가상화로 인한 추가적인 추상화 레이어 때문에 성능이 느려질 수 있습니다. 또한 게스트 운영체제를 관리하기 위해 추가적인 라이브러리와 커널이 필요하기 때문에 배포 이미지가 커져 저장 용량의 부담이 증가합니다.
이를 해결하기 위해 컨테이너 기반 가상화가 생겼습니다.
컨테이너 기반 가상화?
++ 물론 컨테이너 기반 가상화에는 Docker 외에도 다양한 도구와 기술이 존재합니다. 하지만 이 글에서는 Docker를 중심으로 설명할 것이므로, 다른 컨테이너 기술에 대해서는 자세히 설명하지 않겠습니다.
컨테이너 기반 가상화는 서버 가상화의 핵심 기술이었던 하이퍼바이저 대신 Docker Daemon이라는 프로세스가 동작하게 됩니다.
가상머신은 다른 운영체제를 독립적으로 실행하기 위해 각 가상머신마다 별도의 운영체제를 사용했습니다.
반면, 컨테이너 기반 가상화는 별도의 운영체제 대신 프로세스 단위로 격리하여 실행하는 방식이며,
이러한 격리된 프로세스들을 컨테이너라고 부릅니다.
즉, 컨테이너는 호스트 운영 체제를 공유하며, 애플리케이션과 종속성만을 프로세스로 격리해 독립된 환경에서 실행합니다.
실행 순서를 확인하며 컨테이너가 무엇인지 한번 더 살펴보도록 하겠습니다.
도커 클라이언트에서 컨테이너를 실행시키기 위해 'docker build', 'docker run' 명령을 실행하면
Docker Daemon은 호스트 운영체제에게 각 프로세스가 독립된 공간과 리소스를 사용할 수 있도록 프로세스를 격리해 달라고 요청합니다.
이러한 독립된 실행 환경을 "컨테이너"라고 부릅니다.
++ 도커 클라이언트
도커와 상호작용할 수 있는 명령줄 도구입니다. 도커 클라이언트를 통해 Docker Daemon에게 명령을 보내고, 컨테이너를 빌드, 실행, 관리할 수 있습니다.
정리해 보자
마지막으로 정리를 해보자면 서로 다른 운영체제를 가진 서버에서도 동일한 애플리케이션을 실행하기 위해 가상화라는 개념이 도입되었습니다.
가상화에는 서버 가상화, 컨테이너 기반 가상화가 있습니다.
서버 가상화는 하이퍼바이저가 동작하고 물리적인 리소스를 논리적으로 나누어 각 가상 머신에 할당합니다.
각 가상머신은 독립적인 운영체제를 갖고 있으며, 이 위에서 애플리케이션이 실행됩니다.
반면 컨테이너 기반 가상화는 컨테이너 런 타임(ex. Docker Daemon)이라는 프로세스 동작하여 애플리케이션과 그 종속성을 프로세스 단위로 격리하여 실행됩니다.
'TIL' 카테고리의 다른 글
OneToOne 관계에서의 N + 1 문제 (0) | 2024.09.07 |
---|---|
내가 원하는 컬럼으로만 업데이트 (2) | 2024.08.24 |
JPA에서 save할 때 select 쿼리가 나가는 이유? (0) | 2024.08.23 |
쿠키, 세션, 토큰 어떤 차이일까? (0) | 2024.04.23 |
- Redis
- 1차 캐시
- @Table
- @ManyToOne
- 조인 전략
- 비동기
- 연관관계
- @Cacheable
- @joincolumn
- 메일
- @OneToMany
- @MappedSuperclass
- 변경감지
- 준영속
- mappedBy
- 엔티티 매니저
- 최적화
- @Entity
- N + 1
- @TransactionalEventListener
- 영속성 컨텍스트
- onetoone
- JPA
- 비영속
- @Id
- 스키마 자동 생성
- 단일 테이블 전략
- 즉시 로딩
- 인메모리 db
- @GeneratedValue