소프트웨어는 OS와 라이브러리에 의존성을 뛴다. 그러므로 하나의 컴퓨터에서 성격이 다른(OS,라이브러리 버전이 다른) 소프트웨어를 한번에 실행할 때 어려움을 가질 수 있고 관련된 구성을 관리하기가 어렵다. 컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말합니다. 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다.
가상머신또한 독릭접인 실행환경을 구성할 수 있도록 도와주는데 차이는 다음과 같다.
HyperVisor라는것이 있다. 이는 컴퓨터가 가지고 있는 인프라 리소스들에 대해 VM별로 배분 하는역할들을 한다. 또한 각 VM에서는 독립적인 Guest OS를 가지고 있다.
따라서 독립적인 플랫폼을 하나씩 증가시킬 때마다 불필요한 OS를 만드는 작업에 대해서 계속해서 해야한다. 즉 확장성이 떨어진다. 또한 메모리나 자원에 관해서 유동적으로 관리 되는게 아니라 처음부터 정해놓고 실행하기에 비효율적이다.
컨테이너의 경우 하나의 Host OS위에서 마치 각각의 독립적인 프로그램처럼 관리되고 실행된다. 불필요한 OS만드는작업 및 Infra를 독립적으로 나눌 필요가 없어서 확장성이 좋고 빠르다.
- 애플리케이션 레벨 고립
- VM보다 빠른 셋업
- VM보다 메모리 덜 소모
- 마이그레이션, 백업, 전송이 쉬움. VM과 비교해 크기가 작기 때문이다.
- 하드웨어와의 빠른 커뮤니케이션은 따라, 성능에 효과적일 수 있다.
- 애플리케이션 배치와 유지보수를 향상시킨다.
- 애플리케이션 전달 시간 감소
도커는 컨테이너 기반의 오픈소스 가상화 플랫폼중 하나이다. Docker를 사용하면 인프라에서 애플리케이션을 분리하여 컨테이너로 추상화시켜 소프트웨어를 빠르게 제공 할 수 있습니다.이는 주어진 하나의 호스트OS안에서 여러 컨테이너를 동시에 실행 할 수 있습니다. 또한 도커는 컨테이너의 라이프 사이클을 관리하고 어플리케이션을 오케스트레이션(Work flow의 자동화)된 서비스로 배포할 수 있습니다. 예를들어 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있습니다.
특징:Docker는 클라이언트-서버 아키텍처이다. 도커 클라이언트와 도커 데몬이RestApi를 사용하여 통신
Docker 사용자가 Docker와 상호작용하기 위한 방법. 기본적인 도커명령어를 통해서 Docker 데몬과 통신
Docker 이미지를 저장, Docker hub이라는 공용 레지스트리와 개인private한 레지스트리가 있다. 일반적으로 공용 레지스트리에서 실행
docker pull, docker run: 사용하면 필수이미지 가져온다.
docker push: 레지스트리에 저장
docker run //이를 통해 실행 컨테이너 실행이 가능하다.
도커의 이미지가 변할때마다 새롭게 다운받는다면 이미지의 용량이 크기에 비효율적이다. 이를 해결하기 위해 Layer라는 개념을 이용한다.
ubuntu의 이미지는 A+B+C이다. nginx의 경우 A+B+C+Nginx를 하고 싶다. 이때 Layer 기능을 이용하여 ubuntu에 nginx만 쌓으면 된다.
도커이미지 생성 과정에 대해 기술.
이미지를 빌드하려면 이미지 를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문 으로 Dockerfile 을 만듭니다. Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. Dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어 만 다시 빌드됩니다.
# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr
ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh
EXPOSE 8080
EXPOSE 7000
CMD ["start.sh"]