애플리케이션은 그것이 실행되는 호스트가 반드시 충족해야 하는 종속성이 있으며 컨테이너 시대 이전의 개발자들은
이러한 작업을 부가적인 방법으로 수행했다.
ex) 자바 애플리케이션은 데이터베이스와 통신하기위해 방화벽 규칙이 함께 실행되는 JVM이 필요하다.
결론적으로 도커는 컨테이너를 실행하는 방법 중 하나이다.
아래에서 도커, 컨테이너, 이미지에 대해 알아보자
Docker는 애플리케이션 구축, 구현 및 테스트를 위해 격리된 가상화 환경을 생성하는 서비스형 플랫폼이다.
Docker는 컨테이너 엔진으로 리눅스 커널 기능을 사용하여 운영 체제 위에 컨테이너를 만들고,
Docker 자체는 서비스의 컨테이너를 관리하는 데몬으로 실행된다.
도커에서는 애플리케이션을 포장 및 전송하기 위해 "docker image"를 사용한다.
Docker image는 파일로 어플리케이션 실행에 필요한 독립적인 환경을 포함하며, 런타임 환경을 위한 일종의 템플릿이다.
도커 이미지는 소스 코드, 라이브러리, 종속성, 도구 및 응용 프로그램을 실행하는데 필요한 기타 파일을 포함하는 불변(변경 불가) 파일이다.
이미지는 읽기 전용이므로 스냅샷이라고도 하며, 특정 시점의 애플리케이션과 가상 환경을 나타낸다.
이러한 일관성은 도커의 큰 특징 중 하나로 개발자가 안정적이고 균일한 조건에서 소프트웨어를 테스트하고 실험할 수 있도록 한다.
이미지는 템플릿일 뿐이므로 시작하거나 실행할 수 없다. 컨테이너는 실행 중인 이미지일 뿐이기 때문이다.
컨테이너를 생성하면 쓰기 가능한 레이어가 immutable image(불변 이미지) 위에 추가된다. 즉, 컨테이너는 수정이 가능하다.
컨테이너를 생성하는 이미지 베이스는 별도로 존재하며 변경할 수 없다.
컨테이너 환경을 실행할 때는 기본적으로 컨테이너 내부에 해당 파일 시스템(도커 이미지)의 읽기-쓰기 복사본을 만든다.
이렇게 하면 이미지 전체 복사본을 수정할 수 있는 컨테이너 레이어가 추가된다.
하나의 베이스 이미지에서 도커 이미지를 무제한으로 생성할 수 있다.
이미지의 초기 상태를 변경하고 기존 상태를 저장할 때마다 추가 레이어가 있는 새 템플릿을 만든다.
따라서 도커 이미지는 여러 개의 레이어로 구성될 수 있으며, 각각은 다르지만 이전 레이어에서 비롯된다.
이미지 계층은 컨테이너 계층을 사용하여 가상 환경을 시작할 때 추가된 읽기 전용 파일을 나타낸다.
Docker image creation
docker build -t=myimage .
사용자가 기본 시스템에서 애플리케이션을 분리할 수 있는 가상화된 런타임 환경이다.
이러한 컨테이너는 응용프로그램을 빠르고 쉽게 시작할 수 있는 portable units 이다.
중요 기능은 컨테이너 내부에서 실행되는 컴퓨팅 환경의 표준화다. (standardization of the computing environment running inside the container.)
응용 프로그램이 동일한 환경에서 작동하도록 할 뿐 아니라 다른 사람과의 공유도 단순화한다.
컨테이너는 자율적(autonomous)이기 때문에 strong isolation을 제공하며 서로 방해하지 않는 격리된 환경을 제공한다.
하드웨어 수준에서 가상화가 이루어지는 VM과 달리 컨테이너는 애플리케이션 계층에서 가상화된다.
하나의 머신을 활용하고 커널을 공유하며 분리된 프로세스를 실행하기 위한 운영 체제를 가상화할 수 있다.
따라서 컨테이너가 매우 가벼워져 리소스를 많이 사용하지 않을 수 있다.
Docker container creation
docker run -d --name mycontainer -p 8080:8080 myimage
둘은 밀접한 관련이 있으며 도커 플랫폼에 의해 정의된 시스템의 일부이다.
컨테이너가 존재하려면 이미지를 실행해야 하는 반면, 이미지는 컨테이너 없이 존재할 수 있다.
따라서 컨테이너는 이미지에 종속되어 런타임 환경을 구성하고 애플리케이션을 실행하는 데 사용된다.
도커 이미지는 도커 컨테이너에서 코드를 실행한다. 실행 중인 컨테이너를 만들려면 도커 이미지에 핵심 기능의 쓰기 가능 계층을 추가한다.(Writable container)
도커 컨테이너는 실행 중인 이미지 인스턴스로 간주한다. 각각의 고유한 데이터와 상태를 가진 동일한 이미지에서 여러 개의 컨테이너를 만들 수 있다. 컨테이너 채택의 주요 이점은 개발, 운영 및 테스트의 표준화 및 단순화이다.
CI/CD 파이프라인은 컨테이너를 빌드, 테스트 및 패키징할 수 있다. 그런 다음 배포는 해당 컨테이너를 애플리케이션의 일부로 실행할 수 있는 런타임 환경에 배포한다.
Dockerfile --(Build)--> Image --(Create)--> Container
Dockerfile은 도커 이미지를 빌드하는 방법을 정의하는 스크립트이다.
Docker에서는 환경 정보를 저장하는 파일을 Dockerfile이라고 한다. 이 Dockerfile에는 컨테이너의 구동에 필요한 정보가 작성되어 있다.
Docker file을 빌드해서 이미지를 생성한다.
이미지는 특정 환경에 대한 정보가 변하지 않고 저장되는 정적인 형태의 파일이다.
이미지를 동적인 형태로 변경한 것이 컨테이너이며, 컨테이너가 구동된다는 것은 우리가 필요로 하는 OS와 특정 환경이 경량 가상화로 구현된다는 것을 의미한다. 컨테이너는 어플리케이션을 실행할 격리된 환경이다.
다시 말하면 컨테이너를 생성하는 것은 다른 환경과 분리시킨 환경을 만든다는 말이고, 컨테이너를 구동하는 것은 분리된 프로세스화하여 특정 환경을 만드는 것이다.