Docker - Container Engine

호호빵·2023년 3월 23일
0

sunflowerProject

목록 보기
5/10

Docker

  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트

서버 가상화와 컨테이너 기반의 가상화



1. 가상화

가상화가 왜 등장했을까
하나의 서버를 분산하여 사용하기 위해

서버 가상화

  • 하나의 물리적 서버 호스트에서 여러 개의 서버 운영체제를 게스트로 운행할 수 있게 해주는 소프트웨어 아키텍처
  • 하드웨어 infrastructure 위에 Hypervisor(vm)를 이용해 각각의 가상의 머신 만들 수 있음

Hypervisor

  • 서버 가상화 기술을 구현할 수 있게하는 소프트웨어 가상 머신이라는 단위로 구별

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

    kernel
    - 컴퓨터
       ⎡ 하드웨어
       ⎣ 소프트웨어
          ⎡ 응용프로그램
          ⎣ 운영체제(OS)
             ⎡ 시스템 프로그램
             ⎣ 커널                     <--

    • 커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 한다.
    • 즉, 커널은 인터페이스로써 응용 프로그램 수행에 필요한 여러가지 서비스를 제공하고, 여러가지 하드웨어(CPU, 메모리) 등의 리소스를 관리하는 역할을 한다.
  • 대표적인 툴 : Virtual Box, vmware

  • 각 가상머신에는 여러 운영체제가 설치, 하이퍼바이저에 의해 생성되고 관리되는 운영제체를 게스트 운영체제라 부름

단점

  • 가상화 작업은 하이퍼바이저를 반드시 거쳐야 함
  • 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 이미지가 커짐
  • 완벽한 운영체제를 만들기 위한 trade off -> 성능이 느리고, 용량상 부담있음
  • 단점을 해결하기 위해 컨테이너 등장!

컨테이너 기반의 가상화 (vm의 경량화)

  • 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경 만듦.
  • container engine이 Host OS에 접근해서 처리
  • 애플리케이션을 구동하는 데 필요한 라이브러리, 및 실행 파일만 존재
    -> 이미지의 용량이 현저하게 줄어듦. 배포에 소요되는 시간이 적어짐.

컨테이너를 왜 써야하나

  • 이미지의 실행 배포가 빨라지니까
  • Host OS와의 격리를 통해 독립된 개발 환경을 보장
  • 프로세스를 컨테이너 단위로 사용
  • 프로세스의 관리, 확장에 용이

컨테이너

  • 모듈화되고, 컴퓨터 공간, 환경 등을 격리한 공간
  • 프로세스의 라이프 사이클(생명 주기)를 관리
  • 이미지의 목적에 따라 생성되는 프로세스 단위의 격리 환경
  • 어플리케이션, 환결설정 npm, 라이브러리, 어플리케이션 구동에 필요한 모든 것들이 담겨 있음
  • 특징 : 경량화, 컴퓨팅 자원, 구동방식, 안정성

도커엔진(container engine)

  • 컨테이너의 라이프 사이클 관리
  • 유저가 컨테이너를 쉽게 사용할 수 있게 하는 주체
  • 이미지, 볼륨, 네트워크 관리

명령어를 입력했을 때

- 사용자가 docker 명령어로 도커 엔진에게 명렁어 보냄
- 전달받은 도커 클라이언트는 /var/run/docker.sock에 위치한 유닉스 소켓을 통해 도커 데몬의 API 호출
- 도커 데몬은 명령어에 해당하는 작업을 수행하고, 결과를 도커 클라이언트에 반환
- dockerd는 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체
- 도커 데몬 : 도커 프로세스가 실행되어 입력받을 준비가 된 상태


2. 준비하기 - Dockerfile, Image, Container

Dockerfile

  • Copy files : 어플리케이션을 구동할 때 필요한 파일들
  • Install dependencies : 어플리케이션 구동 시 필요한 라이브러리들
  • Set environment variables : 환경 변수에 관한 설정
  • Run setup scripts : 어떻게 구동해야하는지 스크립트
# 노드 기준

FROM node:16-alpine   // 어떤 base 이미지를 쓸건지 명시
WORKDIR  /app         // 어떤 디렉토리에서 복사해올 건지
COPY package.json package-lock.json ./   // 현재 경로인 /app으로 복사
RUN npm ci 			  // 버전을 맞춰서 설치 (그냥 설치는 npm install)
COPY index.js 		  // 소스파일 복사
ENTRYPOINT [ "node", "index.js" ]        // 명령어로 실행

자주 변경되는 파일일수록 아래쪽에 배치 -> layer의 최상단에 위치함 

Docker image

  • 어플리케이션 실행 시 필요한 모든 것을 담고있음 -> 불변의 상태
  • 컨테이너를 만드는데 사용되는 읽기 전용의 템플릿으로, 컨테이너 실행에 필요한 파일, 설정 값등을 포함하고 있는 도커 파일을 만든 후 DockerFfile을 빌드해 이미지 만듦.

Docker container

  • 만든 이미지 파일을 실행할 수있는 환경을 제공함
  • 이미지를 만든 후 이미지의 목적에 맞게 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간

3. 사용하기

  • 도커 이미지에 우리가 필요한 것들을 다 넣고 컨테이너에 올림 ->
    언제 어디서든 이 컨테이너를 받아 환경에 방해받지 않고 애플리케이션 구동이 가능하게 함!
1. Docker 다운

2. Dockerfile 설정

3. 프로젝트 build -> docker 이미지화 -> docker images로 확인 가능
   명령어 : docker build -t ( 사용할 이름) .
   
   docker build -f Dockerfile -t sunflower-docker .
   // . : build context, 현재 최상위 경로라는 것을 명시해줌
   // use -f to point a Dockerfile
   // use -t to name the image, 도커 이미지에 이름 부여 가능
   
4. 해당 이미지 파일로 컨테이너 실행 -> docker ps 로 실행 중 컨테이너 확인 가능
   명령어 : docker run (사용할 이름)

   docker run -d -p 8080:8080 sunflower-docker
   // -d stands for detached to run a container in a background, 터미널아 기다리지말고 너 할일헤~
   // -p is port publishing maps a port on the container to a port on the host, host와 컨테이너의 포트 연결

4. 장점

팀원 및 서버와 개발 환경을 쉽게 동기화 가능

팀워크

  • 도커 이미지에 언어, 프레임워크 버전을 미리 모두 정해놓고 이미지를 컨테이너화 시키면 로컬 환경의 간섭없이 독립적으로 구동 가능
  • Dockerfile을 사용하면 언어, 프레임워크, 패키지 등을 미리 코드 형태로 명시하고 쉽게 자동으로 설치 가능

서버

  • 서버를 옮기거나 늘릴 때 이미지만을 가져와 새로운 서버에 컨테이너를 만들어쉽게 동일 환경 구축 가능
  • 하나의 물리 서버에 여러 도커 컨테이너를 돌려 여러 서비스 배포도 가능

자원적, 성능적으로 뛰어남

  • 기존의 가상화 방식은 가상환경마다 독립된 커널 OS가 존재하여 무겁고 느렸지만 도커의 가상화 방식은 새로운 커널 OS가 아닌 기존의 커널 OS 자원을 계승하여 사용하기 때문에 자원이 한정적이지 않고 유동적임

-> 도커를 사용하면 개발 환경을 이미지화 시키고 해당 이미지를 통해 개발 및 배포 환경을 쉽게 컨테이너화 시켜 구축 가능






Reference

https://minkwon4.tistory.com/295 - 커널
Docker 공식 문서
테코톡 - 검프의 Docker 이론편
드림코딩 - 도커 한방에 정리
지환님의 도커 사용기
docker 권한 문제 발생시
EC2에 docker 설치
docker 중지 및 이미지 삭제
https://velog.io/@ye1219/도커를 사용하는 이유

profile
하루에 한 개념씩

0개의 댓글