컨테이너와 도커

갱두·2022년 1월 9일
0

📓 도커

목록 보기
2/2

컨테이너

컨테이너란?

  • 가상화의 기술 중 하나임
  • 소프트웨어가 현재의 컴퓨팅 환경에서 다른 환경으로 이동하더라도 안정적으로 실행되도록 하기 위해 나온 개념이 바로 컨테이너

✔️ 호스트 OS위에 컨테이너 엔진을 설치하고 애플리케이션 작동에 필요한 바이너리, 라이브러리 등을 하나로 모아 각자가 별도의 서버인 것처럼 사용하는 환경
✔️ 최근 클라우드 컴퓨팅에서는 컨테이너 기반 가상화가 기존의 하이퍼바이저 기반의 가상화 기술을 대체하며 각광받고 있음

  • 구글은 Gmail, Google Drive를 포함한 모든 서비스를 컨테이너로 제공한다고 함!!

✅ 방식

리눅스 기반 시스템에서 프로세스 간 격리를 위해 사용하던 기술을 조합하여 발전한 것 !

  • 격리 기술 덕분에 호스트 머신에게는 프로세스로 인식되지만, 컨테이너 관점에서는 마치 독립적인 환경을 가진 가상 머신처럼 보인다.

✔️ OS 커널 단에서 프로세스를 어떻게 격리하여 자원을 할당 ???

  • chroot : 특정 디렉토리를 루트(최상위 디렉토리)로 인식하게끔 하는 명령어
  • 네임 스페이스 : 리눅스 시스템 자원을 묶어 프로세스에 할당하는 방식으로, 하나의 프로세스 자원을 관리하는 기능
  • cgroup : CPU, 메모리 등 프로세스 그룹의 시스템 자원 사용량을 관리하여 특정 애플리케이션이 자원을 과다하게 사용하는 것을 제한

이 세가지를 조합한 형태인 LXC(Linux Container)에서부터 컨테이너 가상화 기술이 본격적으로 발전

먼저 chroot를 통해 특정 파일 디렉토리가 최상위 계정(Root)으로 인식되도록 한 후, cgroup과 네임스페이스를 통해 특정 프로세스에 자원을 할당하고 제어하는 방식

이처럼 격리된 고유 영역에서 할당된 자원을 이용해 애플리케이션을 실행하는 것을 의미하는 컨테이너애플리케이션의 실행에 필요한 라이브러리와 바이너리, 기타 구성 파일을 ‘이미지’ 단위로 빌드하여 패키지로 배포합니다.

  • 바이너리: 컴퓨터 저장과 처리 목적을 위해 이진수 형식으로 인코딩된 데이터 파일을 의미하는 것으로 코드의 컴파일(Compile) 또는 압축된 결과물

🚀 실행에 필요한 모든 환경이 준비되어 있으므로 어떤 환경에서도 애플리케이션을 오류 없이 동작시킬 수 있는 것이 가장 큰 특징

📌 VM vs 컨테이너

✔️ 컨테이너

  • VM과 비교했을 때 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍다.
    일반적으로 컨테이너에는 OS가 포함되지 않아 크기가 수십 MB에 불과하고, 운영체제 부팅이 필요 없으므로 서비스를 시작하는 시간도 짧다.

  • 크기가 작기 때문에 컨테이너 복제와 배포에도 용이하다.
    애플리케이션을 실행할 때에도 물리 서버에서 애플리케이션 하나를 실행하는 것과 마찬가지로, 호스트 OS 위에 애플리케이션의 실행 패키지인 ‘이미지’를 배포하기만 하면 됨.

  • CPU나 메모리는 딱 프로세스가 필요한 만큼만 추가로 사용하고 성능적으로도 거어어어어의 손실이 없다.
    (도커의 기본 네트워크 모드는 Bridge모드로 약간의 성능 손실이 있다고 함.. 네트워크 성능이 중요한 프로그램의 경우 --net=host 옵션을 고려해야 한다고 함)

✔️ VM

  • VM은 항상 게스트 OS가 포함되므로 보통 수 GB에 해당하고, 애플리케이션을 실행할 때에도 먼저 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 애플리케이션을 실행시켜야 함.

이처럼 VM에 비해 컨테이너는 애플리케이션을 실행, 배포하는 과정이 가볍기 때문에 하나의 물리 서버에서 더 많은 애플리케이션을 구동시킬 수 있어 가장 주목받는 서버 가상화 기술인 것 !

✅ 할 수 있는 일

  • 실행중인 컨테이너에 접속하여 명령어를 입력할 수 있고
  • apt-get이나 yum으로 패키지를 설치할 수 있으며
  • 사용자도 추가하고 여러개의 프로세스를 백그라운드로 실행할 수도 있음.
  • CPU나 메모리 사용량을 제한할 수 있고
  • 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리인 것처럼 사용할 수도 있음

도커

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

✔️ 도커에 의해 개발자가 소프트웨어를 패키징 해 ‘한번 구축하면 어디서나 실행할 수 있는(build once and run anywhere)’ 것이 어느 때보다 더 쉬워졌다.
✔️ 도커는 손쉽게 분산 마이크로서비스 아키텍처를 구축 및 실행하고, CI/CD를 통해 코드를 배포하고, 고도로 확장 가능한 데이터 처리 시스템을 구축하고, 개발자를 위한 완전관리형 플랫폼을 생성할 수 있다.

📌 이미지

이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다. = Immutable

예를 들면 ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있다.

✔️ 이미지를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것
✔️ 컨테이너는 이미지를 실행한 상태라고 할 수 있음!
✔️ 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.

말그대로 이미지는 컨테이너를 실행하기 위한 모오오오오든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됨. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제 없다.

여기서 왜 도커인지를 알 수 있다. 👇🏻

✅ 도커는 왜 이렇게 핫할까?

컨테이너는 도커에서 처음 나온 기술일까?
놉. 원래 있었던 기술임 우리가 모르는 컨테이너 기술들이 굉장히 많음.
근데 왜 모르게 ? 어려워서

1. 레이어 저장 방식

✔️ 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가 정도 됨.

  • 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없습니다.

🚀 도커는 이런 문제를 해결하기 위해 레이어 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다!

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

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

가상화의 특성상 이미지 용량이 크고 여러대의 서버에 배포하는걸 감안하면 단순하지만 엄청나게 영리한 설계라고 볼 수 있음 ~

2. 이미지 경로

🚀 이미지를 url 방식으로 관리하고 태그를 붙일 수 있다.

  • ubuntu 14.04 이미지는 docker.io/library/ubuntu:14.04 또는 docker.io/library/ubuntu:trusty 이고 docker.io/library는 생략가능하여 ubuntu:14.04 로 사용할 수 있습니다.

이러한 방식은 이해하기 쉽고 편리하게 사용할 수 있으며 태그 기능을 잘 이용하면 테스트나 롤백도 쉽게 할 수 있다.

3. 도커 허브

도커 이미지의 용량은 보통 수백메가지만, 수기가가 넘는 경우도 흔하다. 이렇게 큰 용량의 이미지를 서버에 저장하고 관리하는 것은 쉽지 않은데 도커는 Docker hub를 통해 공개 이미지를 무료로 관리해 줌. 하루에도 엄청난 용량의 이미지가 전세계에서 다운로드 되고 트래픽 비용만 해도 어마어마 할 것 같은데 그것이 다 무료!

✅ 도커의 구성 요소

위에서 본 도커 이미지, 도커 허브

이 외에도
✔️ 도커 파일
각 도커 컨테이너는 도커파일과 함께 시작한다. 이 텍스트 파일은 운영체제, 언어, 환경 변수, 파일 위치, 네트워크 포트, 이를 실행하는 데 필요한 여타 컴포넌트를 포함하는 도커 이미지를 구축할 수 있는 일련의 명령을 제공.

  • 여러가지 명령어를 토대로 Docker File을 작성하면 설정된 내용대로 Docker Image를 만들 수 있음.
$ vim Dockerfile

FROM ubuntu:14.04

# app 디렉토리 생성
RUN mkdir -p /app

#Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정합니다.
WORKDIR /app

# 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함
ADD     . /app
RUN apt-get update
RUN apt-get install apache2
RUN service apache2 start
VOLUME ["/data", "/var/log/httpd"]

# 하기 포트를 외부로 노출합니다.
EXPOSE 80

# 쉘을 사용하지 않고 컨테이너가 시작되었을 때 logbackup 스크립트를 실행
CMD ["/app/log.backup.sh"]

이렇게 도커 파일을 만들면 도커 파일 경로에서 👇🏻 명령어를 입력하면 이미지 생성 가능!

$ docker build -t [만들고싶은 이미지 이름] 

✅ 도커의 배포

도커는 변경 불가능한 인프라(Immutable Infrastructure) 이다.

  • 기본적으로 소프트웨어가 자주 수정이 되면 많은 오류가 날 수도 있고, 변경에 따른 이력 관리도 필요함
  • 하지만 도커는 변경을 불가능하게 만들어버림 ! = 서버를 구축한 이후 변경이나 업데이트를 할 수 없도록 함

✔️ 그렇다면 업데이트는 어떻게 ...?
도커는 업데이트를 하기 위해서 새로운 도커 이미지 자체를 업데이트해서 컨테이너에 담고, 기존 이미지는 컨테이너에서 삭제해버림!! = 서버를 통째로 바꾸는 것이라고 생각하면 쉽다

변경하기 위한 이미지를 올리기만 하면 배포 끝~

✅ Docker의 장,단점

✔️ 모듈성

  • 도커의 컨테이너화 접근 방식은 전체 애플리케이션을 분해할 필요 없이 애플리케이션의 일부를 분해하고, 업데이트 또는 복구하는 능력에 집중되어 있다. 사용자는 이 마이크로서비스 기반 접근 방식 외에도 SOA(service-oriented architecture)의 작동 방식과 동일하게 멀티플 애플리케이션 사이에서 프로세스를 공유할 수 있다.
    SOA : 소프트웨어 컴포넌트의 재사용이 가능하게 하는 방법을 정의, 새 어플리케이션에 빠르게 통합될 수 있도록 해줌

✔️ 계층 및 이미지 제어

  • 각 Docker 이미지 파일은 일련의 계층으로 이루어져 있으며 이 계층들은 단일 이미지로 결합됩니다. 이미지가 변경될 때 계층이 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됨

  • Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 훨씬 더 빨라집니다. 중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다. 계층화에는 버전 관리가 내재되어 있으며 새로운 변경 사항이 발생할 때마다 내장 변경 로그가 기본적으로 적용되므로 컨테이너 이미지를 완전히 제어할 수 있습니다.

✔️ 롤백

  • 계층화에서 가장 유용한 부분 = 롤백 기능
  • 모든 이미지에는 계층이 있으며, 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다.
    => 애자일(agile) ⭕️ , CI/CD ⭕️

✔️ 신속한 배포

  • Docker 기반 컨테이너는 배포 시간을 몇 초로 단축할 수 있다.
  • 각 프로세스에 대한 컨테이너를 생성함으로써 사용자는 유사한 프로세스를 새 앱과 빠르게 공유할 수 있습니다.
  • 또한, 컨테이너를 추가하거나 이동하기 위해 OS를 부팅할 필요가 없으므로 배포 시간이 크게 단축됩니다.
  • 이뿐만 아니라 배포 속도가 빨라 컨테이너에서 생성된 데이터를 비용 효율적으로 쉽게 생성하고 삭제할 수 있다.

=> 즉, Docker 기술은 효율성을 중시하며 더 세분화되고 제어 가능한 마이크로서비스 기반 접근 방식.

✔️ 더 많은 소프트웨어를 빠르게 제공할 수 있음

  • Docker 사용자는 평균적으로 Docker를 사용하지 않는 사용자보다 7배 더 많은 소프트웨어를 제공합니다.

✔️ 도커는 단일 컨테이너 관리에 적합

  • 수백 개로 세분화된 컨테이너와 컨테이너화된 앱을 점점 더 많이 사용하기 시작하면 관리와 오케스트레이션이 매우 어려워질 수 있습니다. = 여기서 쿠버네티스를 사용~

출처 : https://m.post.naver.com/viewer/postView.nhn?volumeNo=21385900&memberNo=2521903
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

profile
👩🏻‍💻🔥

0개의 댓글