도커 & 컨테이너

YEON·2022년 6월 6일
0

인프라 미션

목록 보기
6/7

✔︎ 설명에 앞서 학습하게 된 계기

애플리케이션을 배포해보면서 도커를 사용하게 되었다.
도커(Docker)오픈소스 기반의 컨테이너 관리 플랫폼 이다.

이때 도커와, 배포시 도커를 사용하는 의의에 대해서 더욱 학습해보고자
도커(Docker) 와 도커를 이해하기 위해 컨테이너(Container) 기술에 대해 학습을 진행하였다.



컨테이너(Container)

컨테이너란? 어플리케이션을 구동하는 환경을 격리한 공간(격리된 컴퓨팅 환경)을 의미한다.
컴퓨터 프로그램들은 환경이 바뀔 때 네트워크,스토리지,보안 등 정책이 달라서 오류들이 발생할 수 있다.
때문에 소프트웨어가 현재의 컴퓨팅 환경에서 다른 환경으로 이동하더라도 안정적으로 실행되도록 하기 위해 나온 개념이 바로 컨테이너 기술이다.
(+ 구글은 모든 서비스를 컨테이너로 제공하고 자사의 컨테이너 플랫폼인 ‘쿠버네티스(Kubernetes)’를 통해 20억개 이상의 컨테이너를 구동한다.)

이때, 컨테이너는 Bean,IoC Container 등 에도 특성이 해당되는데
넓게 보았을 때 컨테이너는 프로세스를 관리한다고 볼 수 있다. 프로세스가 생성되고 운영되고 제거되기까지의 생애주기를 격리를 통해 관리한다.
(이때 격리란 컨테이너 안의 프로세스는 제한된 자원 내에서 제한된 사용자만 접근이 가능하다.)


컨테이너를 사용하는 이유는?

컨테이너 단위로 사고하고 각 프로세스 라이프 사이클을 관리하기 위함이다.

컨테이너를 사용하면 컨테이너 안에 무엇이 있든 컨테이너 단위로 사고를 할 수 있고, 다른 컨테이너에도 영향을 주지 않는다. (즉, 컨테이너는 컨테이너 자체가 세상이다. 또한 컨테이너는 OS 위에 있기 때문에 OS를 새로 시작할 필요도 없다.)


컨테이너 구조는?

‘OS 레벨 가상화’ 형태의 운영 체제의 커널(운영 체제의 핵심이 되는 컴퓨터 프로그램)이 여러 격리된 사용자 공간 인스턴스를 갖출 수 있도록 하는 가상화 방식이다.
(별도의 OS가 아니기 때문에 자원만 격리된 상태이고 Host OS의 시스템 커널을 사용한다)

운영 체제를 제외하고 어플리케이션 실행에 필요한 모든 파일만을 패키징(Packaging)한 형태이기 때문에,
기존의 가상머신에 비해 가볍고 빠르게 동작이 가능하다는 장점이 있다.

또한 어플리케이션의 실행에 필요한 라이브러리 등을 패키지로 묶어서 배포하기 때문에
구동 환경이 바뀌어도 오류를 최소화할 수 있다.


컨테이너 기술 특징은?

컨테이너에는 OS가 포함되지 않아 빠르고 가벼워 컨테이너에 대한 복제와 배포가 용이하다.
또한 컨테이너는 생성 및 실행되면 마치 운영 체제 위에서 하나의 어플리케이션이 동작하는 것과 동일한 수준의 컴퓨팅 자원만을 필요로 하여 존의 가상머신 방식 대비 시스템의 성능 부하가 훨씬 적다.

컨테이너는 특정 클라우드 어플리케이션이 실행되기 위한 모든 라이브러리 등이 패키지화되어 있기 때문에 기존의 시스템에서 실행하는 식으로 구동 방식이 편리하다.

다만, 컨테이너 기술은 호스트 OS 커널을 공유하는 구조이기 때문에 한쪽에서 장애가 발생하면 다른 컨테이너들 또한 영향을 받을 수 있다는 안정성 측면을 고려해야한다.


+ VM 과 컨테이너 차이는?

기존 사용하고 있는 운영체제(ex.Window) 이외에 다른 운영체제(ex.Linux)를 사용하고 싶을 때 주로 VM을 사용해 OS 전체를 가상화 하는 방식을 사용했다.

VM 방식은 특정 어플리케이션을 실행하기 위해 먼저 새로운 VM을 띄우고 자원을 할당한 다음, 필요한 게스트 OS를 부팅한 후 어플리케이션을 실행시켜야 한다. 결국 다른OS(Linux) 를 사용하기 위해서는 기존 OS(Window)를 이용해야하므로 속도와 용량 측면에서 비효율적이다.
(별도의 Guest OS들을 띄워서 Hypervisor를 통해 물리 장비들을 리소스들을 시스템 콜을 통해서 사용하는 방식)

하지만 컨테이너는 가상화보다는 프로세스 격리 방법 측면으로 별도의 OS 사용이 필요하지 않아 메모리 용량이 효율적이고 성능 개선이 이루어진다는 것이 차이이다.
(우리가 사용하는 서버 인스턴스 OS를 사용하면서 자원만 격리하는 방식)







도커(Docker)

도커는 오픈소스 기반의 컨테이너 관리 플랫폼으로,
도커 컨테이너는 가상의 공간을 만들어서 호스트OS와는 전혀 별개의 환경에서 프로세스들이 동작하는 기술이다.


도커를 사용하는 의의는?

  1. 변화하지 않는 실행환경으로 멱등성 확보
  2. 실행 환경과 애플리케이션의 일체화로 이식성 향상
  3. 코드를 통한 실행환경 구축 및 애플리케이션 구성
  4. 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성

도커 기술 특징은?

도커는 리눅스 컨테이너(LXC) 기술 기반의
리눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈소스 프로젝트이다.

기존 리눅스 컨테이너(LXC) 기술보다 이식성을 향상시켜 개발환경과 운영환경을 거의 동등하게 재현하였고
데이터와 코드의 분산된 관리, 프로그램 스택의 간결 명료함 등 이동성과 유연성을 높였고,
기존 시스템보다 더 쉽고 빠르게 워크로드를 배포 및 복제하고 이동할 수 있으며 백업도 가능하다는 장점이 있다.

또한 컨테이너 이미지 생성 기능을 통해 특정 컨테이너에서 실행될 소프트웨어와 방식에 대해서 컨테이너 실행에 필요한 파일, 설정값 등의 구동 사양을 미리 정의해 놓을 수 있는데
이를 통해 개발자는 컴퓨팅 환경에 구애 받지 않은 채 어플리케이션의 이미지를 만듦으로써 원격으로 쉽고 편리하게 배포 하여 실행하는 것이 가능하다.

+ 리눅스 컨테이너(LXC)
LXC(LinuX Containers)는 단일 컨트롤 호스트 상에서 여러개의 고립된 리눅스 시스템 (컨테이너)들을 실행하기 위한 운영 시스템 레벨 가상화 방법이다.

도커는 LXC와 달리 docker engine을 이용한 실행환경 표준화시켰고, Dockerfile 을 이용하여 컨테이너 구성 및 애플리케이션의 배포를 정의하며, 레이어 구조를 갖는 이미지 포맷을 지니고 이미지 버전 관리를 할 수 있다는 차이 등이 있다.


도커 이미지란?

이미지란 컨테이너 실행에 필요한 모든 파일과 설정값 등을 포함하고 있는 파일을 의미한다.
(ex. MySQL 이미지는 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보 등)
한마디로 이제 새로운 서버를 추가할땐 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다.

이미지는 상태값을 가지지 않고 변하지 않는 특징을 지니고 있어,
컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있는다.

그러나 도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있어 기존 이미지에 단지 파일 하나가 추가되었다고 해서 전체를 다시 다운받는 것은 매우 비효율적이다.

때문에 도커는 레이어 라는 개념을 사용하여 수정된 값만을 다운받고 관리할 수 있게 경량화 되었다.
도커의 이미지는 여러 개의 읽기 전용(Read only) 레이어로 구성되고, 파일이 추가되거나 수정되면 기존 레이어는 변하지 않고 그 위에 새로운 레이어가 생성된다.

도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있고 누구나 쉽게 이미지를 만들고 배포할 수 있다.




그렇다면 배포에서 도커를 사용하는 의의는 무엇일까?

도커를 사용하는 의의는 변화하지 않는 실행환경 구성, 실행 환경과 애플리케이션의 일체화로 이식성 향상, 코드를 통한 실행환경 구축 및 애플리케이션 구성 및 시스템을 구성하는 애플리케이션 및 미들웨어의 관리 용이성 등이 있다.
때문에, 다양한 작업환경에서의 도커를 사용하게 된다면 배포는 더욱 빠르고 자유로워질 수 있다.
또한 배포가 빠르고 자유로워지면 개발자들은 개발을 하면서 배포에 더욱 시간을 쓰지 않고 개발에 더욱 전념할 수 있다.






[참조]
https://github.com/brainbackdoor/playground-docker/tree/master/week1#2-%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%8B%A4%ED%96%89%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EA%B5%AC%EC%84%B1
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
https://subicura.com/2016/06/07/zero-downtime-docker-deployment.html
https://m.blog.naver.com/shakey7/221600166205
https://hanhyx.tistory.com/27

profile
- 👩🏻‍💻

0개의 댓글