Docker는 컨테이너 기술을 기반으로 한 오픈 소스 플랫폼으로, 애플리케이션과 그의 종속성을 격리된 환경인 컨테이너로 패키징하여 실행하는 것이다.
Docker는 처음에 LXC(LinuX Container) 기반으로 만들어졌다. 그리고 이 LXC의 핵심 아이디어는
리눅스 운영 체제에서 프로세스를 격리된 환경으로 실행한다!
그리고 이러한 격리는 컨테이너 안에 실행되는 프로세스가 호스트 시스템과(OS)와 분리된다는 것을 의미한다.
LXC는 리눅스 시스템 기능 2가지를 바탕으로 만들어지며, 그 두가지는 아래와 같다
같은 공간에 존재하지만, 서로 볼 수 없는 녀석들이며, 프로세스간의 통신을 IP로 해야 한다.
why? : PID, IPC, Network, UID, Mouht, UTS 가 독립적으로 존재할 수 있기 때문
이를 통해서 컨테이너에 올라가는 어플리케이션마다 필요에 따라 자원을 분배 할 수 있게 된다.
하드웨어에 대한 논리적인 가상화를 최소화한다
VM의 경우에는 Guest Operating System을 어플리케이션 위에 올리지만, Container 의 경우에는 OS에서 어플리케이션에 필요한 부분만 사용한다.
출처 : Red Hat 공식문서
그러나 도커는 컨테이너당 하나의 어플리케이션 사용을 권장하고 있다. 그리고 이 장점은 다음과 같다.
다른 프로젝트에서 쉽게 재사용 가능
: 나의 경우 Redis 이미지나 컨테이너를 따로 생성하는 게 아니라, 토이 프로젝트들에 한하여 재사용 해 왔다.
보안 및 격리 관점에서 더 많은 유연성을 가져올 수 있다
: 공격자가 하나의 프로세스를 탈취한다면 해당 컨테이너의 다른 프로세스도 탈취당할 가능성이 높다
:
업데이트시 서로간의 간섭을 받지 않음
MSA 구성이 효율적임
중간 변경 사항이 이미지 사이에서 공유되므로 속도, 규모, 효율성이 더 개선됩니다.
도커 이미지는 애플리케이션의 실행에 필요한 모든 파일과 설정, 라이브러리, 환경 변수 등을 포함하는 스냅샷이다.
이미지는 여러 계층으로 구성되어 있는데, 각 계층은 이전 계층의 변경 사항을 나타낸다.
이미지는 불변성을 가지고 있어서, 한 번 생성되면 변경이 불가능하다.
컨테이너는 이미지를 기반으로 만들어지고, 격리된 실행 환경을 제공한다.
사용자가 Docker 명령어를 입력한다.
명령어는 Docker Daemon 의해 실행된다. 이 때 이미지 생성, 컨테이너 실행, 관리 등의 작업을 수행할 수 있다.
필요한 이미지가 없다면, Docker Daemon은 원격 이미지 저장소(Docker Hub 등)에서 이미지를 가져온다.
Docker Daemon은 사용자가 요청한 작업을 수행하기 위해 이미지를 사용하여 컨테이너를 생성하고 실행한다. 이 과정에서 컨테이너들은 전용 네트워크와 파일 시스템 등을 가지게 된다.
컨테이너가 실행되면, 사용자는 애플리케이션을 사용할 수 있다. 필요한 경우 Docker 데몬을 통해 컨테이너를 중지, 삭제, 업데이트 등의 관리 작업을 수행할 수 있다.
분량 문제로 인해 끊어갑니다
다음시간엔 Docker 와 OCI!
참고한 블로그 및 사이트
정리가 잘 된 글이네요. 도움이 됐습니다.