Container? Docker?

Kim Dong Kyun·2023년 8월 1일
1
post-thumbnail

Docker?

Docker는 컨테이너 기술을 기반으로 한 오픈 소스 플랫폼으로, 애플리케이션과 그의 종속성을 격리된 환경인 컨테이너로 패키징하여 실행하는 것이다.


1. Linux Container

Docker는 처음에 LXC(LinuX Container) 기반으로 만들어졌다. 그리고 이 LXC의 핵심 아이디어는

리눅스 운영 체제에서 프로세스를 격리된 환경으로 실행한다!

그리고 이러한 격리는 컨테이너 안에 실행되는 프로세스가 호스트 시스템과(OS)와 분리된다는 것을 의미한다.

그렇다면 LXC는 어떻게 동작하는지?

LXC는 리눅스 시스템 기능 2가지를 바탕으로 만들어지며, 그 두가지는 아래와 같다

1. namespace

  • 프로세스를 독립화시켜주는 가상화 기술이다.
  • 같은 PID(프로세스 ID)를 가지더라도, 독립된 프로세스로 기능 할 수 있게 만들어 준다.

같은 공간에 존재하지만, 서로 볼 수 없는 녀석들이며, 프로세스간의 통신을 IP로 해야 한다.
why? : PID, IPC, Network, UID, Mouht, UTS 가 독립적으로 존재할 수 있기 때문

2. cgroup (control group)

  • 하드웨어 자원을 배분하는 기능을 수행한다.
  • 사용하지 않는 하드웨어 자원들(CPU, RAM)을 사용자가 원하는 만큼 격리된 프로세스에 할당 할 수 있게 해준다.

    이를 통해서 컨테이너에 올라가는 어플리케이션마다 필요에 따라 자원을 분배 할 수 있게 된다.

이게 VM(Virtual Machine) 과 무엇이 달라요?

하드웨어에 대한 논리적인 가상화를 최소화한다

VM의 경우에는 Guest Operating System을 어플리케이션 위에 올리지만, Container 의 경우에는 OS에서 어플리케이션에 필요한 부분만 사용한다.

  1. LXC는 경량화되어 있어서 빠르고 가볍다.
  2. LXC는 자원 및 용량 측면에서 효율적이다 (OS를 최소한 사용)

2. Linux Container vs Docker?

출처 : Red Hat 공식문서

1. LXC는 하나의 컨테이너에 여러개의 어플리케이션을 띄울 수 있다

그러나 도커는 컨테이너당 하나의 어플리케이션 사용을 권장하고 있다. 그리고 이 장점은 다음과 같다.

  • 다른 프로젝트에서 쉽게 재사용 가능
    : 나의 경우 Redis 이미지나 컨테이너를 따로 생성하는 게 아니라, 토이 프로젝트들에 한하여 재사용 해 왔다.

  • 보안 및 격리 관점에서 더 많은 유연성을 가져올 수 있다
    : 공격자가 하나의 프로세스를 탈취한다면 해당 컨테이너의 다른 프로세스도 탈취당할 가능성이 높다
    :

  • 업데이트시 서로간의 간섭을 받지 않음

  • MSA 구성이 효율적임

2. LXC는 캡쳐 기능이 없고, Docker는 캡쳐 기능이 있다.

  • 구축된 환경을 이미지로 만들어서 저장 후 언제든지 사용 가능하다.

3. Docker는 새로운 컨테이너를 구축할 때 이러한 계층을 재사용하므로 구축 프로세스가 빠르다

중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다.

4. Docker는 컨테이너를 이미지화 시켜 배포를 쉽고 빠르게 할 수 있다.


Docker 의 작동 순서

Docker 이미지?

도커 이미지는 애플리케이션의 실행에 필요한 모든 파일과 설정, 라이브러리, 환경 변수 등을 포함하는 스냅샷이다.

  • 이미지는 여러 계층으로 구성되어 있는데, 각 계층은 이전 계층의 변경 사항을 나타낸다.

  • 이미지는 불변성을 가지고 있어서, 한 번 생성되면 변경이 불가능하다.

Docker Container?

컨테이너는 이미지를 기반으로 만들어지고, 격리된 실행 환경을 제공한다.

  • 각 컨테이너는 이미지의 스냅샷에 대한 실행 환경을 포함하며, 프로세스, 네트워크, 파일 시스템 등을 격리한다.

Docker Daemon?

  • 사용자가 입력한 명령을 수신하고
  • 컨테이너를 관리하며
  • 이미지 관리 기능도 제공한다.

작동 순서

  1. 사용자가 Docker 명령어를 입력한다.

  2. 명령어는 Docker Daemon 의해 실행된다. 이 때 이미지 생성, 컨테이너 실행, 관리 등의 작업을 수행할 수 있다.

  3. 필요한 이미지가 없다면, Docker Daemon은 원격 이미지 저장소(Docker Hub 등)에서 이미지를 가져온다.

  4. Docker Daemon은 사용자가 요청한 작업을 수행하기 위해 이미지를 사용하여 컨테이너를 생성하고 실행한다. 이 과정에서 컨테이너들은 전용 네트워크와 파일 시스템 등을 가지게 된다.

  5. 컨테이너가 실행되면, 사용자는 애플리케이션을 사용할 수 있다. 필요한 경우 Docker 데몬을 통해 컨테이너를 중지, 삭제, 업데이트 등의 관리 작업을 수행할 수 있다.


분량 문제로 인해 끊어갑니다

다음시간엔 Docker 와 OCI!


참고한 블로그 및 사이트

블로그
RedHat 공식문서

2개의 댓글

comment-user-thumbnail
2023년 8월 1일

정리가 잘 된 글이네요. 도움이 됐습니다.

1개의 답글