Docker

Mixer·2023년 11월 24일
0

Docker

  • IT 소프트웨어 "Docker"는 Linux® 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술입니다.

  • 오픈소스 Docker 커뮤니티는 모든 사용자가 혜택을 누릴 수 있도록 이러한 기술을 개선하기 위해 노력합니다.

  • Docker Inc.라는 기업은 Docker 커뮤니티의 작업을 기반으로 하여 보안을 강화하고 이러한 개선 사항을 더 큰 커뮤니티에 공유합니다. 그런 다음 엔터프라이즈 고객을 위해 개선되고 강화된 기술을 지원합니다.

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

💡 Linux 컨테이너란?
시스템의 나머지 부분과 분리된 1개 이상의 프로세스 세트이다.
이러한 프로세스를 실행하는 데 필요한 모든 파일은 개별 이미지에서 제공되므로, Linux 컨테이너는 개발 단계에서 테스트, 프로덕션에 이르기까지 이식성과 일관성을 유지할 수 있다. 따라서 전통적인 테스트 환경을 복제해야 하는 개발 파이프라인보다 사용 시점을 훨씬 더 앞당길 수 있고, 대중성과 사용의 편의성 때문에 컨테이너 역시 IT보안의 중요한 부분이다.

가상화와 컨테이너 기술

상호 보완적인 관계에 가깝다

  • 가상화는 단일 하드웨어 시스템에서 여러 운영 체제 (Window or Linux)가 동시에 실행될 수 있도록 한다.

  • 컨테이너는 동일한 운영 체제 커널을 공유하고 시스템의 나머지 부분으로부터 애플리케이션 프로세스를 격리한다. 예를 들면, ARM Linux 시스템은 ARM Linux 컨테이너를 실행하고, x86 Linux 시스템은 x86 Linux 컨테이너를 실행하고, x86 Windows 시스템은 x86 Windows 컨테이너를 실행한다. Linux 컨테이너는 이식성이 매우 뛰어나지만 기본 시스템과 호환되어야 한다.

즉, 가상화는 하이퍼바이저를 사용해 하드웨어를 에뮬레이션하고 이를 통해 여러 운영 체제를 '병렬'로 실행하는데, 이 경우 컨테이너를 사용할 때만큼 경량화할 수는 없다.
리소스와 기능이 제한되어 있을 때는 고밀도로 배포할 수 있는 경량화된 애플리케이션이 필요하다.
Linux 컨테이너는 운영 체제에서 기본으로 실행되고 모든 컨테이너 전체에서 운영 체제를 공유하므로 애플리케이션과 서비스를 가볍게 유지할 수 있으며 빠른 속도로 동시에 실행할 수 있다.

Linux 컨테이너는 애플리케이션 개발, 배포, 관리 방식을 혁신적으로 발전시켰다.
Linux 컨테이너 이미지는 이식성과 버전 관리 기능을 제공해 개발자의 노트북에서 수행하는 작업을 프로덕션에서도 수행할 수 있도록 한다.
골든 이미지라고 하는 특별한 유형의 컨테이너 이미지는 시스템 구성을 위한 일관되고 안정적인 기준을 만든다. 실행 중인 Linux 컨테이너는 가상 머신보다 리소스를 적게 사용하고 안정적인 기준을 만든다.
실행 중인 Linux 컨테이너는 가상 머신보다 리소스를 적게 사용하고 표준 인터페이스(시작, 중지, 환경 변수 등)가 갖춰져 있으며 애플리케이션 격리를 유지할 뿐 아니라 대규모 애플리케이션(여러 컨테이너)의 일부로 더 쉽게 관리할 수 있다.
또한 이런 멀티컨테이너 애플리케이션은 여러 클라우드에 걸쳐 오케스트레이션 할 수 있다.

골든 이미지란?
미디어 프로덕션에서 골드 이미지란 모든 편집 및 믹싱이 완료된 앨범 또는 필름의 최종 편집본을 의미합니다. 최종적이며 완벽한 형태라는 의미에서 골드라고 부릅니다.
이런 의미는 시스템 관리에서도 적용되며, 동일한 맥락에 골든 이미지는 의도적으로 구성한 시스템의 스냅샷(서버, 가상 데스크톱 환경, 디스크 드라이브 등)으로 새로운 인스턴스를 배포하는데 사용할 수 있다.
이런 골든 이미지는 네트워크 가상화에 사용되어 새로운 시스템을 생성하기 때문에 '마스터 이미지' 또는 '복제 이미지'로도 불린다.

Docker 와 Linux 컨테이너의 차이

도커 기술은 처음에는 Linux 컨테이너를 기반으로 개발되었지만 추후 종속 관계를 벗어났다.

Linux 컨테이너는 경량의 가상화 방법으로는 유용했지만, 사용자 친화적이지 못했고
Docker는 컨테이너 구동하는 기능 이상의 것을 제공해주었다, 컨테이너 생성 및 구축, 이미지 전송, 이미지 버전 관리 등 프로세스를 용이하게 하여 사용자 친화적인 모습을 보였다.

일단 Linux 컨테이너는 멀티플 프로세스를 관리할 수 있는 init 시스템을 사용한다
즉, 전체 애플리케이션을 하나로 실행할 수 있다.

하지만 도커 기술은 애플리케이션을 개별 프로세스로 세분화하도록 권장하고 이를 위한 툴까지 제공한다 기본적으로 이런 세분화된 접근 방식에서 차이를 보인다.

컨테이너 보안이란?

컨테이너 보안에는 유동적인 부분이 많다. 컨테이너 파이프라인과 애플리케이션, 배포 환경과 인프라를 보호해야 하고, 앤터프라이즈 보안 툴 및 정책과 통합하기 위한 계획도 수립해야 하기에 때문이다.

컨테이너 보안

도커 이미지 & 도커 컨테이너

도커 엔진에서 사용하는 기본 단위는 이미지컨테이너이며 도커 엔진의 핵심이다.

도커 이미지와 컨테이너는 1:N 관계이다.

도커 이미지와 컨테이너의 관계는
운영체제에서의 프로그램 <-> 프로세스,
객체지향 프로그래밍에서의 클래스 <-> 인스턴스의 관계와 비슷하다

Docker File ➡️ Docker Image: 도커 파일은 도커 이미지를 만들때 사용하는 파일
Docker build 명령어를 실행시키면 도커 이미지를 만들 수 있다.

Docker Image ➡️ Docker Container: 도커 이미지를 Docker run 명령어를 실행시키면 Docker Container를 만들 수 있다.

Docker Image

Docker Image는 컨테이너를 생성할 때 필요한 요소이며, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념이다.
이미지는 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용되며 여러 계층으로 된 바이너리 파일로 존재한다.

  • 도커에서 사용하는 이미지의 이름의 기본적 형태
[저장소 이름]/[이미지 이름]:[태그]
  • 저장소 이름: 이미지가 저장된 저장소 이름이 명시되지 않은 이미지는 도커 허브의 공식 이미지를 뜻한다.
  • 이미지 이름: 해당 이미지가 어떤 역할을 하는지 나타내며 필수로 설정해야한다
    예) ubuntu:latest : 우분투 컨테이너를 생성하기 위한 이미지라는 것을 나타낸다.
    -태그: 이미지의 버전을 나타내며 태그를 생략할 시 도커 엔진은 latest로 인식한다.

Docker Container

Docker Container는 도커 이미지로 생성할 수 있으며 컨테이너를 생성하면 해당 이미지의 목적에 맞는 파일이 들어있는 호스트와 다른 컨테이너로부터 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간(프로세스)가 생성된다.

대부분의 도커 컨테이너는 생성될 때 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지고 있기 때문에 도커 이미지의 목적에 맞도록 사용되는 것이 일반적이다.

예를 들자면, 웹 서버 도커 이미지로부터 여러 개의 도커 컨테이너를 생성하면 생성된 컨테이너의 개수만큼 웹 서버가 생성되고, 이 컨테이너들은 외부의 웹서비스를 제공하는데 사용된다.

컨테이너는 이미지를 읽기 전용으로 사용하되 이미지에서 변경된 사항만을 컨테이너 계층에 저장하므로서 컨테이너에서 무엇을 하던지 원래 이미지는 영향을 받지 않는다.
또한 생성된 각 컨테이너는 각각 독립된 파일시스템을 제공받으며 호스트와 분리되있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치, 삭제해도 다른 컨테이너와 호스트에는 변화가 없다.

가상화된 공간을 생성하기 위해 Linux 자체 기능인 chroot, 네임스페이스, cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.
컨테이너에 필요한 커널을 공유해서 사용하고, 컨테이너 안에는 애플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머신에 비해 대폭 줄어든다.
따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점을 가졌다.
도커를 포함한 컨테이너 툴은 이미지 기반 배포 모델을 제공하는데, 여러 환경 전반에서 애플리케이션 또는 서비스를 모든 종속 항목과 손쉽게 공유할 수 있다.
또한 도커는 이 컨테이너 환경 내에서 애플리케이션(또는 애플리케이션을 구성하는 결합된 프로세스) 배포를 자동화한다.
이런 툴은 Linux 컨테이너를 기반으로 구축되어 도커를 사용자 친화적이고 고유하게 만들어 주므로 사용자는 그 어느 때보다 쉽게 애플리케이션에 액세스하고, 신속하게 배포하고, 버전 및 버전 배포를 제어할 수 있다.
출처 - https://www.redhat.com/ko/topics/containers/what-is-docker

도커 컨테이너의 장점

  • 모듈성
    컨테이너화에 대한 도커 접근 방식은 전체 애플리케이션을 분해하지 않고도 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둔다.
    이런 마이크로서비스 기반 접근 방식 외에도 서비스 지향 아키텍쳐(SOA)와 거의 같은 방식으로 멀티플 애플리케이션 간에 프로세스를 공유할 수 있다.

  • 계층 및 이미지 버전 제어
    각 도커 이미지 파일은 일련의 계층으로 구성되며 이런 계층들은 단일 이미지로 결합된다.
    계층은 이미지가 변경될 때 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성된다.

도커는 이런 계층을 재사용하여 새 컨테이너를 구축하는데, 이때 구축 프로세스 속도가 빨라진다. 중간 변경 사항은 이미지 간에 공유되므로 속도와 크기, 효율성이 더욱 향상되는 점이다.
또한 계층화에는 버전 제어가 내재되어 있는데, 새로운 변경 사항이 있을 때마다 변경 로그가 기본 제공되므로 컨테이너 이미지를 완벽하게 제어할 수 있다.

  • 롤백
    계층화의 가장 큰 장점은 롤백 기능이다.
    모든 이미지에는 계층이 있고, 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 된다.
    이 기능은 애자일 개발 접근 방식을 지원하며 툴 관점에서 실제로 지속적 통합 및 배포(CI/CD)를 수행하는데 도음을 준다.

  • 신속한 배포
    도커 이전에는 새로운 하드웨어 확보, 실행, 프로비저닝 등을 제공하는 데 며칠이 걸렸고 이를 위한 작업 및 오버헤드 부담도 상당했다.
    하지만 도커 기반 컨테이너는 배포 시간을 몇 초로 줄일 수 있다.
    각 프로세스에 대한 컨테이너를 생성하면 해당 프로세스를 새 애플리케이션과 빠르게 공유할 수 있고 또한 컨테이너를 추가하거나 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축된다.
    배포 시간이 단축되면서 컨테이너에서 생성항 데이터를 쉽고 비용 효율적으로 생성하고 제거가 가능하다.

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

도커의 구성요소

  • Docker Client 도커를 설치하면 그것이 Client이며 build, pull rn 등의 도커 명령어를 수행한다.

  • DOCKER_HOST 도커가 띄어져있는 서버를 의미하며, DOCKER_HOST에선 컨테이너와 이미지를 관리하게 된다.

  • Docker daemon 도커 엔진

  • Registry 외부remote 이미지 저장소이다. 다른 사람들이 공유한 이미지를 내부Local 도커 호스트에 pull 할 수 있으며 이렇게 가져온 이미지를 RUN하면 컨테이너가 된다.

  • public 저장소: Docker Hub, QUAY
  • private 저장소: AWS ECR OR Docker Registry에 직접 띄워 비공개로 사용하는 방법 등

💡 데몬, Daemon 이란?
멀티태스크 운영 체제에서 데몬은 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌며 여러 작업을 하는 프로그램을 말한다.

Docker Container Life-Cycle

  1. 컨테이너의 개념
  • Docker Image 인스턴스 실행 (실제 응용프로그램 실행)
  • 응용 프로그램과 모든 종속성이 포함
  • 커널을 다른 컨테이너와 공유하고 호스트 OS의 사용자 공간에서 격리된 프로세스로 실행
  1. 컨테이너 생성
  • 이미지에 포함된 Linux 디렉터리 및 파일 집합의 스냅샷을 만들어 컨테이너 생성
  • 컨테이너를 생성하는 것 뿐이며, 컨테이너를 구동하지는 않는다.(구동할 준비상태를 만드는 단계)
  1. 컨테이너 생성 및 구동
  • 이미지에서 컨테이너를 생성하여 컨테이너 상에서 프로세스를 구동
  • 서버 프로세스를 백그라운드에서 실행하더나 경우에 따라 강제 종료 가능
  • 포트 번호 등 네트워크 설정을 통해 외부에서 컨테이너 프로세스에 액세스 가능
  1. 컨테이너 구동
  • 중지 상태인 컨테이너를 구동할 때 사용
  • 컨테이너에 할당된 컨테이너명 또는 ID를 입력해 컨테이너 구동
  1. 컨테이너 중지
  • 구동 중인 컨테이너를 중지할 때 사용
  • 컨테이너에 할당된 컨테이너명 또는 ID를 입력해 컨테이너 구동
  1. 컨테이너 삭제
  • 중지되어 있는 컨테이너를 삭제할 때 사용
  • 컨테이너를 삭제하기 전에 docker container stop 명령으로 컨테이너를 중지해야한다.
  1. Docker 컨테이너 라이프 사이클


출처 https://racoonlotty.tistory.com/entry/Docker-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EB%9D%BC%EC%9D%B4%ED%94%84-%EC%82%AC%EC%9D%B4%ED%81%B4

profile
Minthug'life

0개의 댓글