Skip to main content

4. Docker Life Cycle

docker-life-cycle

출처: Introduction to the Docker Life Cycle, Dhanushka madushan, dev.to, 2019

이 문서는 도커 컨테이너의 생명주기에 대해 다룹니다.


Docker Hub

docker-hub

Docker Hub 링크

도커 허브는 도커 레지스트리, 즉 저장소입니다.

도커 라이프사이클을 이해하는 데 있어, 시작점이라고 볼 수도 있습니다. 도커 명령어가 Git과 유사한 점이 많아, Git Repository라고 가정하면 이해가 수월합니다.

hub.docker.comPublic Cloud이며, docker pull {image-name}로 도커 이미지를 받을 수 있습니다.

Public CloudOn-Premise
Docker Hub, ACR, AWS-ECR, etc..Harbor

다른 종류의 레지스트리도 궁금해서 찾아봤습니다. 레지스트리는 보통 공공Public 클라우드와 On-Premise 방식으로 나뉘며, 온프레미스로 사설private 이미지 저장소를 구성하기 위해 Harbor를 사용합니다.
현업에서는 보통 CSP 서비스와 Harbor 등을 조합하여 사내 레지스트리를 구성한다고 합니다.
사내 인프라 환경(AWS, Azure Cloudflare 등)에 따라 적절한 툴을 사용하면 되는 것으로 이해했습니다.

Azure가 궁금해서 찾아봤는데, ACR(Azure Container Registry)가 있습니다. 문서 번역도 잘 되어있어 첨부합니다:

Azure Container Registry는 Docker Hub에서 공개 Docker 이미지를 저장하는 것과 유사한 방식으로 퍼블릭 Docker 컨테이너 이미지 및 기타 아티팩트를 저장하고 관리합니다. Docker CLI(Docker 명령줄 인터페이스)를 사용하여 컨테이너 레지스트리에서 로그인, 푸시, 풀 및 기타 컨테이너 이미지 작업을 수행합니다.

출처: learn.microsoft.com

마찬가지로 AWS ECR도 문서가 잘 정리되어있습니다.

Amazon Elastic Container Registry(Amazon ECR)는 안전하고 확장 가능하며 안정적인 AWS 관리형 컨테이너 이미지 레지스트리 서비스입니다. Amazon ECR은 AWS IAM을 사용하여 리소스 기반 권한을 가진 프라이빗 리포지토리를 지원합니다. 따라서 지정된 사용자 또는 Amazon EC2 인스턴스가 컨테이너 리포지토리 및 이미지에 액세스할 수 있습니다. 원하는 CLI를 사용하여 도커 이미지, Open Container Initiative(OCI) 이미지 및 OCI 호환 아티팩트를 푸시, 풀 및 관리할 수 있습니다.

출처: docs.aws.amazon.com

기본 개념은 거의 유사해 보입니다. 클라우드 한가지를 익히면 나머지 CSP도 모두 익힐 수 있다는 조언을 들었는데, 이래서인가 싶습니다.

Image

Docker Image = Package

Docker 이미지는 컨테이너로 실행될 소프트웨어 모음입니다. 여기에는 Docker 플랫폼에서 실행할 수 있는 컨테이너 생성 지침이 포함되어 있습니다. 이미지는 변경할 수 없으며, 이미지를 변경하려면 새로운 이미지를 생성해야 합니다.
출처: 오라클 공식문서

허브에서 pull한 이미지를 바탕으로 컨테이너를 생성합니다.

막연히 이미지를 node_modules, venv 같은 의존성 패키지로 이해했습니다만, 그것보다 더 확장된 개념으로 보입니다.

특성

도커 이미지가 궁금해서 Gemini에게 물어보고, 그 내용을 정리했습니다.

  • 도커 이미지는 애플리케이션 실행에 필요한 모든 것(소스 코드, 라이브러리, 환경 설정 등)을 담은 불변의 '템플릿'입니다.
    • 이를 바탕으로 도커 컨테이너를 생성하여 애플리케이션을 격리된 환경에서 실행할 수 있습니다.
  • 불변성: 한번 만들어진 이미지는 변경할 수 없습니다. 변경이 필요하면 새로운 이미지를 만들어야 합니다.
  • 실행 단위: 이미지를 실행하면 컨테이너라는 독립적인 실행 환경이 만들어집니다. 컨테이너는 이미지의 인스턴스라고 볼 수 있습니다.
  • 구성 요소: 애플리케이션 코드, 라이브러리, 운영체제 등 컨테이너를 실행하는 데 필요한 모든 것이 이미지 안에 포함되어 있습니다.
  • 표준화된 패키지: 애플리케이션을 패키징하여 어떤 환경에서든 동일하게 실행할 수 있도록 표준화된 방법을 제공합니다.
    • 예시
    • Node.js 서버: Node.js와 Express.js 코드가 포함된 이미지를 실행하면, 해당 서버가 즉시 컨테이너 환경에서 실행됩니다.
    • MySQL 데이터베이스: MySQL 서버가 설치되고 설정된 이미지를 실행하면, 별도의 설치 과정 없이 컨테이너에서 즉시 MySQL 데이터베이스를 사용할 수 있습니다.

node_modules보다 github에서 하나의 repository를 압축된 형태로 받는다-고 이해하는 게 더 적절해보입니다. package.json, ts.config.ts 같은 설정 파일을 모두 포함하는 개념으로 보는 게 맞겠습니다.

도커 이미지는 이미지 오버레이, 리눅스 unmount 등 리눅스 커널과 관련된 기능을 기반으로 하는데, 이는 별도의 리눅스 문서에 작성하겠습니다.

Container Life Cycle

컨테이너는 독립된 실행 환경이다.

마지막으로 컨테이너의 생애주기를 정리한 뒤 마치겠습니다.

  1. 도커 허브에서 이미지를 받는다
    • docker pull {Image.registry}
  2. 이 이미지를 바탕으로 독립된 실행 환경인 컨테이너를 생성/실행한다.
    • docker run/create {image.name} --name {container.name} -p {container-port:host-port}
  3. 다음 명령어로 Exit | Pause | Dead (remove)로 컨테이너의 상태를 정지, 일시정지, 삭제한다.
    • docker stop/pause/rm {container.name | container.key(hash)}