[DevOps] Docker란?

이민우·2024년 6월 10일
1

DevOps

목록 보기
1/5

Docker란?


Docker는 컨테이너 기반의 오픈 소스 가상화 플랫폼으로, 애플리케이션 및 그에 따른 환경을 격리된 컨테이너에 패키징하여 개발, 배포, 실행을 쉽게 지원하는 툴이다.

먼저 Docker를 이해하기 위해서는 가상화에 대해서 이해가 필요하다.

가상화란?

하이퍼바이저를 이용해 여러개의 운영체제를 하나의 호스트에서 생성하는 방식이다.

하이퍼바이저

하이퍼바이저는 다음과 같은 역할을 수행한다.

  • OS들에게 자원을 나누어 주며 조율
  • OS들의 커널을 번역해서 하드웨어에게 전달

위 그림을 보면 하나의 Host OS에서 여러 개의 서버 운영 체제(게스트 OS)가 생성되어 있는 것을 볼 수 있다.

이렇게 생성된 게스트 OS들은 가상 머신이라는 단위로 구별되고, 다른 게스트 OS와는 완전히 독립된 공간과 시스템 자원을 할당 받아 사용한다.

얼핏보면 좋은거아니야?? 라고 생각할 수 있다. 하지만 이 가상화 방식은 아래와 같은 단점들이 존재한다.

서버 가상화의 단점

  • 각종 시스템 자원을 가성화하여 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거치기 때문에 일반 호스트에 비해 성능 저하가 발생한다.
  • 게스트 운영체제를 사용하기 위한 라이브러리, 커널들을 모두 포함하기 때문에 배포하기 위한 이미지를 만들었을 때 크 기가 커진다.
  • 각 가상 머신마다 독립된 운영체제를 가지고 있어서 추가적인 메모리 및 디스크 공간이 필요하다.
  • 게스트 운영체제별로 완전히 독립된 공간을 사용하기 때문에 서로간의 자원 공유가 불가능하다.

컨테이너란?

기존 가상화의 대표적인 예로는 VMware, VirtualBox가 있다.
이런 가상머신을 사용하려면 처음에 OS 설치를 해야한다.
호스트 OS와 다르게 독립적으로 게스트 OS를 구축해서 동작하기 때문이다.
이 뿐만 아니라 실제 PC처럼 별도로 환경설정을 하는 등 세팅을 해줘야하기 때문에 시간도 소요된다. (메모리도 많이 잡아먹음)

반면에 컨테이너를 사용하면 이런 부분을 해결할 수 있다.
이제 컨테이너에 대해 알아보자.
컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만든다.


위 그림을 보면 기존 가상화와는 달리 컨테이너 엔진위에 컨테이너들이 할당되어 있는것을 볼 수 있다.

컨테이너안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하므로, 이미지를 만들었을 때 이미지의 용량이 가상 머신에 비해 훨씬 작다.
이미지의 용량이 작기 때문에 이미지를 만들어 배포하는 시간이 빠르고, 가상화된 공간을 사용했을 때 성능 손실도 거의 없다.

이 컨테이너 가상화의 대표적인 기술이 바로 Docker이다.

컨테이너를 왜 사용해야하나?

궁극적으로 어떠한 큰 장점이 있어서 컨테이너 가상화를 사용하는지에 대해 의문이 있을 수 있다. 이에 대해 알아보자.
이제 편의상 컨테이너에 대해서는 Docker라고 하겠다.

1. 격리(Isolation)

Docker는 프로세스를 격리된 환경에서 관리한다.
격리된 환경이란 Host OS 와의 격리를 의미하며 컨테이너에 어떠한 설정을 하든  Host OS에 영향을 끼치지않는다.
우리만의 독립된 개발 환경을 보장받는 것이다.
Docker를 사용함으로써 프로세스를 컨테이너 단위로 사용할 수 있게 되어
각 애플리케이션과 그와 관련된 의존성 및 설정 파일 등을 완전히 분리하여 지원되어 이러한 격리로 인해 서로 다른 애플리케이션 간의 충돌 및 호환성 문제를 방지하는 등등
프로세스의 관리, 확장이 용이 해진다.

2. 이식성

개인적인 생각으로 도커를 사용하는 가장 큰 이유는 이식성 때문에 인것 같다.
예를 들어, EC2 인스턴스에서 Java 애플리케이션을 실행한다고 가정해보자. Docker를 사용하지 않는 경우, 먼저 EC2 인스턴스에 JDK를 설치하고, 애플리케이션의 모든 종속성을 설정해야 한다. 이렇게 하면 환경 설정에 많은 시간이 걸리고, 각 인스턴스마다 동일한 설정을 보장하기 어려워진다.
그러나 Docker를 사용하면, 필요한 JDK와 애플리케이션 종속성이 모두 포함된 Docker 이미지를 만들 수 있다. 이 Docker 이미지를 사용하면, EC2 인스턴스에 Docker만 설치되어 있으면, 그 위에서 동일한 환경으로 애플리케이션을 실행할 수 있다
Docker로 만들어진 컨테이너는 Docker가 설치된 모든 환경에서 동일하게 실행된다.
이를테면 개발을 진행한 로컬 환경의 애플리케이션을 다른 서버 환경으로 쉽게 옮겨 실행할 수 있게 한다.
환경 일관성: 개발자, 테스터, 운영자가 동일한 환경에서 애플리케이션을 실행할 수 있으므로 "내 로컬에서는 잘 되는데..."와 같은 문제가 줄어듭니다.

3. 경량화

Docker는 필요한 바이너리와 라이브러리만 포함하여 경량화되고, 호스트 커널과 리소스를 공유하여 더 적은 오버헤드로 실행할 수 있다.

4. 버전 관리

Docker는 이미지 빌드와 배포를 위한 버전 관리를 제공한다.
이미지는 여러 레이어로 구성되며, 변경 사항에 대해 새로운 레이어를 추가하여 효율적인 빌드와 저장 상황을 제공한다.

💿 Docker Image

Docker Image란 서비스 운영에 필요한 애플리케이션, 소스코드, 라이브러리, 실행파일, 설정 값들을 묶어서 가지고 있는 것이다.

즉, 애플리케이션을 행하기 위한 모든 요소를 포함하고 있는 것이다.
Docker 이미지들은 github과 똑같이 Docker Hub 사이트를 통해 버전관리 및 배포 Push, Pull이 가능하다.

Docker Hub 사이트에서 다양한 컨테이너 이미지를 사용할 수 있는데, 여기서 Nginx 도커 이미지를 다운받고 실행시키면 Nginx가 바로 실행되는 것이다.

📁 DockerFile

도커 이미지를 만들기 위해서는 도커 파일이 필요하다.

도커 파일을 이용해 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다.
도커파일은 이미지를 생성하기 위한 스크립트 파일이다.
주로 텍스트 형식의 명령어들로 구성되어 있으며, 이를 사용하여 이미지 빌드 과정을 자동화하고 문서화할 수 있다.

예시

FROM openjdk:17-ea-11-jdk-slim
VOLUME /tmp
COPY build/libs/plant-sns-service-1.0.jar plant-sns-service.jar
ENTRYPOINT ["java", "-jar", "plant-sns-service.jar"]

🫙 Docker Container

도커 컨테이너는 도커 이미지로 생성할 수 있으며, 도커 이미지와 컨테이너는 1 : N 관계를 갖는다.
즉, 하나의 이미지로 여러 컨테이너를 생성할 수 있는 것이다.


이미지를 실행하여 컨테이너를 생성하면, 도커 파일로 작성된 해당 이미지의 목적에 맞게 프로세스 단위의 격리 환경에 컨테이너가 생성된다.

참고

https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90
https://hstory0208.tistory.com/entry/Docker%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

profile
백엔드 공부중입니다!

0개의 댓글