코딩 쏙쏙

[Docker] Docker란? 본문

[Docker]

[Docker] Docker란?

두두만두 2023. 5. 6. 02:20

(하이퍼바이저 가상화)Hypervisor Virtualization VS (컨테이너 가상화)Container Virtualization

 

하이퍼바이저 가상화나 컨테이너 가상화가 사용되기 이전에는 하나의 컴퓨터에 하나의 OS만 사용하는 것이 주된 운영 방식이였다.

하나의 OS가 컴퓨터의 모든 리소스를 항상 FULL로 사용하기 어려워 리소스(CPU 등)들이 idle 상태로 낭비 될 수 있다.

더 효율적인 리소스 사용을 위해 하이퍼바이저 가상화 기술이 탄생한다.

 

하이퍼바이저 가상화

 

1. 하이퍼바이저

  • 하나의 컴퓨터에서 여러 OS를 동시에 실행하기 위한 소프트웨어 
  • 하나의 컴퓨터에서 하나의 PS만 운영하는 기존의 방식에서 발생하는 비효율적인 상황을 해결하기 위해 하이퍼바이저를 이용한 가상화 기술을 도입

 

2. 하이퍼바이저 가상화를 통해 하나의 물리적 서버 위에 Host OS가 존재하고 그 위에 독립적인 다수의 OS(Virtual Machine)를 두어 낭비되는 서버 자원을 더 유연하게 사용할 수 있게됨

  • VMware, VirtualBox와 같은 대표적인 가상화 서비스가 존재
  • 하지만 여러 Guest OS를 가상화하여 사용하는 방식은 간단하지만 기술적으로 너무 무겁다는 단점이 있음
  • 각각의 독립적인 OS(Virtual Machine)를 실행시켜야 하기 때문에 부팅 싣간이 길며 리소스를 많이 차지할 수 밖에 없음

 

컨테이너 가상화

  • 리눅스 컨테이너(LXC)
  •  OS를 가상화하는 것이 아닌 운영체제 수준의 가상화 기술로 리눅스  커널을 공유하면서 프로세스를 격리된 환경에서 실행하기 때문에 하이퍼바이저 가상화 방식보다 더욱 가볍고 빠르게 동작
  • 컨테이너 가상화 기술을 통해 하나의 서버에 다수의 컨테이너를 실행하면 컨테이너끼리 서로 영향을 끼치지 않고 독립적으로 실행
  • 실행중인 컨테이너에 접수하여 명령어 입력, 패키지 설치 등 다양한 작업을 할 수 있음
  • 새로운 컨테이너를 만드는 시간은 OS를 가상화하는 기존의 방식과는 비교할 수 없이 빠름
  • 컨테이너를 실행하는데 필요한 모든 파일을 이미지로 만들어 놓고 제공하기 때문에 컨테이너 가상화 방식을 사용하면 개발 단계부터 테스트 및 프로덕션에 이르기까지 일관된 환경을 유지할 수 있음

 

Docker란?

Docker는 컨테이너 가상화 기술을 기반으로 하는 오픈 소스 플랫폼이며, 최초의 컨테이너 기술인 리눅스 컨테이너에 여러가지 중요한 기술을 가미해 강력한 효율성과  유연성을 제공

  • Docker는 컨테이너 가상화 환경 위에 애플리케이션 배포 엔진을 더함으로써 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있다.
  • 게다가 요즘 널리 사용되는 MSA(Micro Service Architeecture), CI/CD와 아주 잘 어울리기 때문에 각광 받고있다.
  • 실제로 Docker는 한 컨테이너 당 하나의 애플리케이션이나 ㅍ,로세스를 실행하는 것을 권고하고 있으니 이는 MSA의 철학과 일맥상통하다고 볼 수 있다.

 

 

Docker Object

이미지(Image)

1. 컨테이너를 생성하기 위해 필요한 템플릿

2. Docker에서 공식적으로 제공해주는 이미지 혹은 다른 개발자들이 만들어 놓은 이미지를 사용하여 커스텀 이미지를 만들 수 있다,

3. Ubuntu를 기반으로 하는 커스텀 이미지를 빌드 (생성)

  • 아파치 웹 서버(Apache Web Server)와 나의 애플리케이션이 올바르게 동작해야 한다.
  • 단순히 Docker에서 제공해주는 공식 Ubuntu 이미지만으로는 나만의 이미지를 완성할 수 없다.
  • 따라서 기반이 되는 이미지를 선택하고 필요한 것들을 알맞게 이미지 안에 추가하여 사용자만의 커스텀 이미지를 생성

 

컨테이너(Container)

  • 이미지를 실행 가능한 인스턴스
  • 이미지를 실행시켜 컨테이너라는 가상화 공간을 만들게 된다,
  • Docker만 올바르게 설치되었다면 어디서든지 저장소로부터 이미지를 가져와 컨테이너를 실행시킬 수 있다.
  • 이미지안에 본인의 애플리케이션을 실행하기 위한 모든 것들을 담아놓고 어디서든지 해당 이미지를 사용하여 똑같은 컨테이너, 즉 일관된 환경으로 본인만의 애플리케이션을 쉽게 빠르게 배포할 수 있다.

 

Dockerfile 

Docker를 처음 접하게 되었을때 

  • Docker에서 공식적으로 제공하는 이미지로 컨테이너를 생성
  • 컨테이너 내부에 접속하여 수정

매번 컨테이너를 새로 만들 때마다 개발 환경 세팅을 다시 해줘야 한다.

해결하기 위해 Dockerfile을 만든다.

Docker 이미지를 만드는 스크립트

기반이 되는 이미지,  즉 Docker에서 공식적으로 지원해주는 이미지 혹은 다른 사람들의 커스텀 이미지 위에 본인의  애플리케이션에 맞게 다양한 instruction을 추가하여 오로지 내 애플리케이션만을 위한 전용 이미지를 만들 수 있게 된다.

 

Dockerfile작성

# Dockerfile

FROM node:16-alpine

WORKDIR /usr/src/app

# 현재 패키지 설치 정보(package.json, package-lock.json)를 Docker 이미지에 복사한다.
COPY package*.json .

RUN npm install

# 현재 경로에 존재하는 모든 파일을 Docker 이미지에 복사한다.
COPY . .

EXPOSE 3000

CMD ["npm", "start"]

 

FROM : 기반이 될 이미지를 선택한다.

WORKDIR : 컨테이너 실행 시 작업 디렉토리를 설정한다.

COPY : 호스트에 있는 정보를 이미지에 복사한다. COPY를 나눠 사용하는 이유는 해당 레이어를 캐싱하여 효율적으로 운영하기 위함이다.

RUN : pakage를 설치하는 등 쉘 명령어를 해당 이미지가 실행될 때 사용한다.

EXPOSE : 컨테이너를 어떤 포트로 외부에 노출해야 할지 지정할 때 사용된다.

CMD : 컨테이너가 시작될 때 실행할 명령어를 지정할 수 있다.

 

'[Docker]' 카테고리의 다른 글

[Docker] Docker 명령어 & 사용법  (0) 2023.05.06