[Docker] 도커(Docker)와 컨테이너(Container)

Docker란?
- 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
- 도커는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든 것이 포함되어 있다.
- 즉, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 환경에 구애받지 않고 애플리케이션을 신속하게 배포, 확장 및 관리 할 수 있다.
- 이렇게 생성된 컨테이너는 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있다.
- 또한, AWS, Azure, Google Cloud 등 어디에서든 실행할 수 있다.
Container란?
- 도커는 컨테이너를 위한 운영 체제이다.
- 가상 머신이 하드웨어를 가상화하는 방식처럼 컨테이너는 서버 운영 체제를 가상화한다.
- 도커는 각 서버에 설치되며,
컨테이너를 구축, 시작, 중단하는 데 사용할 수 있는 간단한 명령을 제공한다.
- 컨테이너는 격리된 공간에서 프로세스가 동작하는 기술로, 주로 OS를 가상화하는 기존 방식과는 차이가 있다.
- 이 방식은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식으로,
각각의 가상머신이 OS를 자체적으로 가지고 있기 때문에 배포 이미지의 용량이 커지게 된다는 단점이 있다.
- 도커의 컨테이너 기술을 사용할 경우, 하나의 서버에서 여러 개의 컨테이너를 실행해도 서로 영향을 미치지 않고 독립적으로 실행할 수 있다.
- 실행 중인 컨테이너에 접속하여 명령어 입력, 패키지 설치, 사용자 추가 등이 가능하며, 여러 개의 프로세스를 백그라운드로 실행할 수도 있다.
- CPU 또는 메모리 사용량을 제한할 수 있으며, 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉토리를 내부 디렉토리처럼 사용할 수도 있다.
Image란?
- 이미지는 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있다.
- 컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 값이 추가되거나 수정되면 컨테이너에 저장된다.
- 같은 이미지를 가진 여러 개의 컨테이너를 생성할 수 있고, 컨테이너의 상태가 바뀌거나 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
- Docker Hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있다.
- Ubuntu 이미지는 우분투를 실행하기 위한 모든 파일을 가지고 있고,
MySQL 이미지는 Debian을 기반으로 ruby, go, database, redis, gitlab source, nginx 등을 가지고 있다.
- 컨테이너를 실행하기 위한 모든 정보를 가지고 있으므로, 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없다.
Docker를 사용하는 이유
1. 빠른 시작과 종료 속도
- 가상환경이 커널에서 공유되기 때문에 새로운 커널을 시작할 필요가 없고, 하드웨어 초기화 등의 작업이 필요 없다.
2. 높은 집적도
- 컨테이너는 커널이 직접 프로세스를 조작하여 분리된 공간을 구성하기 때문에 PC상에서 동작하는 OS는 하나이다.
- 여러 개의 컨테이너를 만들어 실행 중이라고 해도 OS는 하나이기 때문에 가상머신에 비해 고밀도가 가능하다.
- 컨테이너는 실행되는 프로세스를 위한 메모리만 필요하기 때문에 낮은 사양의 환경에서도 동작이 가능하다.
3. 낮은 오버헤드
- 가상화를 위한 하드웨어 에뮬레이트 단계없이, 분리된 공간을 만들기 때문에 오버헤드가 줄어든다.
4. 애플리케이션 컨테이너 지원
- 컨테이너는 가상머신과 달리 init을 먼저 시작하거나 각종 데몬들을 실행할 필요가 없다.
- 컨테이너는 목적에 맞는 프로세스만 존재하는 환경을 만들 수 있다.
예를 들어 웹서버용 컨테이너라면 Apache httpd 프로세스만 존재하는 컨테이너를 만들 수 있다.
- 이러한 환경을 애플리케이션 컨테이너 라고 하며, init 을 처음 시작하여 보통의 OS가 시작하는 것과 같은 환경을 만들 수 있는데 이를 시스템 컨테이너 라고 부른다.
5. 운영 표준화
- 작은 컨테이너식 애플리케이션을 사용하면 손쉽게 배포할 수 있고, 문제를 파악하기 쉬우며, 수정을 위해 롤백할 수 있다.
6. 원활하게 이전
- Docker 기반 애플리케이션을 로컬 개발 시스템에서 AWS의 프로덕션 배포로 원활하게 이전할 수 있다.
7. 비용 절감
- Docker 컨테이너를 사용하면 각 서버에서 좀 더 쉽게 더 많은 코드를 실행하여 사용률을 높이고 비용을 절감할 수 있다.