도커(Docker) - 도커란, 이미지, 컨테이너, 레이어, 특징, 한계

·2021년 8월 17일
2

Cloud Computing

목록 보기
2/2

도커 (Docker)

도커란?

애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼

Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다.
=> 프로그램의 배포 관리 단순화

Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원한다.

대충 말하면, Docker는 컨테이너를 위한 운영 체제!



도커의 주요 개념

1) Docker image

Docker image란?

도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라 한다.

다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치 할 필요가 없는 상태의 파일을 의미한다.

  • 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port정보 등을 모두 가지고 있다.

특징

1) 따라서 도커 이미지의 용량은 보통 수백MB~수GB가 넘는다. 하지만 가상머신의 이미지에 비하면 굉장히 적은 용량이다.

2) 이미지는 상태 값을 가지지 않고 변하지 않는다(Immutable).

3) 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있다.

4) 도커 이미지들은 github와 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.

5) 다양한 API가 제공되어 원하는 만큼 자동화가 가능하다.

6) 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.(그래서 누구나 이미지 생성과정을 확인할 수 있으며 수정도 할 수 있다)


2) 레이어

기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없다. 레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다.

  • 이미지는 여러 개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

ubuntu 이미지A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지A + B + C + nginx가 된다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A + B + C + nginx + source 레이어로 구성된다. webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source(v2) 레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다. 가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계이다.


3) 컨테이너

이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서 프로세스를 동작시키는 기술이다.

1) 컨테이너는 이미지 Layer에 읽기/쓰기(read-write) Layer를 추가하는 것으로 생성/실행된다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적음

2) 컨테이너는 종료되었다고 메모리에서 삭제되지않고 남아있다. 삭제하려면 명시적으로 삭제해야 한다. 즉, 종료가 되어도 컨테이너 & 읽기/쓰기 Layer 또한 그대로 존재하기 때문에 다시 시작할 수 있다.

3) 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것. 예) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻과 동일.

4) 한 서버는 여러 개의 컨테이너를 가져도 당연히 상관없으며, 컨테이너는 각각 독립적으로 실행된다.

5) 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유한다.



✔ 이미지는 어디서 가져오나요?

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이른다. 누구나 쉽게 이미지를 만들고 배포할 수 있다.

(약간 Git'hub'가 소스코드 pull하고 push하고 하는 것처럼 docker 'hub'에 올리고 이미지 pull해서 run해서 컨테이너로 실행할 수 있다!)


(이미지 출처: https://www.ahnlab.com/kr/site/securityinfo/secunews/secuNewsView.do?seq=30533)

도커 이미지 업로드/다운로드 자세히 보기



도커의 특징

  • 어떠한 프로그램도 컨테이너로 만들 수 있다!

    • 서로 다른 프로그램이더라도 컨테이너로 규격화되었음
    • AWS, Azure, Google cloud 등 어떤 환경에서도 돌아간다.
  • 가상머신처럼 독립적으로 실행되지만, 가상머신보다 빠르고 쉽고 효율적이다.

    • 도커는 컴퓨터 자원을 그대로 사용한다. (가상머신은 독립 된 메모리를 할당받는 것으로 알고 있음)
  • 도커는 가상머신이 아니고 격리만 해주기 떄문에 성능상 하락이 없다. (성능 하락이 큰 VM과 다르다.)

  • 확장성과 이식성

    • 도커가 설치되어 있다면 어디서든 컨테이너를 실행할 수 있다.
    • 오픈 소스이기에 특정 회사나 서비스에 종속적이지 않다.
    • 쉽게 개발서버를 만들 수 있고 테스트 서버 생성도 가능하다.
  • 표준성

    • 도커를 사용하지 않는 경우, 각각의 언어로 만든 서비스들의 배포 방식은 모두 다르다.
    • 도커는 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포 과정이 동일해진다.
  • 이미지

    • 컨테이너를 실행하기 위한 압축파일과 같은 개념이다.
    • 이미지에서 컨테이너를 생성하기 떄문에 반드시 이미지를 만드는 과정이 필요하다.
    • Dockerfile을 이용하여 이미지를 만들고 처음부터 재현 가능하다.
    • 빌드 서버에서 이미지를 만들면 해당 이미지를 이미지 저장소(허브)에 저장하고 운영서버에서 이미지를 불러와 사용한다.
  • 설정관리

    • 도커에서 설정은 보통 아래와 같이 환경변수로 제어한다.
    • MYSQL_PASS=password와 같이 컨테이너를 띄울 때 환경변수를 같이 지정한다.
    • 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야한다.
  • 자원관리

    • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화된다. (제거가 쉽다.)
    • 그러므로 저장이 필요하다면, 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요하다.
    • 세션이나 캐시를 memcached나 redis와 같은 외부로 분리한다.

도커의 한계

Docker는 단일 컨테이너 관리에 적합하도록 만들어져 있다.

수백 개로 세분화된 컨테이너와 컨테이너화된 앱을 점점 더 많이 사용하기 시작하면 관리와 오케스트레이션이 매우 어려워질 수 있다.

결국 모든 컨테이너 전체에서 네트워킹, 보안, 텔레메트리와 같은 서비스를 제공하기 위해서는 컨테이너를 그룹화를 해야한다. =>쿠버네티스 사용



출처

https://aws.amazon.com/ko/docker/
https://wooody92.github.io/docker/Docker-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/
https://dev-youngjun.tistory.com/2
https://hoon93.tistory.com/48
https://galid1.tistory.com/324

profile
당근먹고 자라나는 개발자

0개의 댓글