Skip to main content

Image and Container

이미지와 컨테이너

info

이미지: 도커 이미지란 애플리케이션을 실행하는 데 필요한 파일과 설정을 포함하는 읽기 전용 템플릿입니다. 이미지는 컨테이너를 생성하는 데 사용되며, 동일한 이미지를 사용하여 여러 개의 컨테이너를 만들 수 있습니다.

컨테이너: 도커 컨테이너는 이미지로부터 생성된 실행 가능한 인스턴스입니다. 컨테이너는 애플리케이션과 그 종속성을 포함하며, 격리된 환경에서 실행됩니다. 컨테이너는 가볍고 빠르게 시작할 수 있으며, 필요에 따라 쉽게 생성하고 삭제할 수 있습니다.

DockerFile

# Docker Hub에서 공식 Node.js 이미지를 사용합니다
FROM node

# 컨테이너 내부의 작업 디렉토리를 /app으로 설정합니다
WORKDIR /app

# 호스트에서 package.json 파일을 컨테이너의 작업 디렉토리로 복사합니다
COPY package.json /app

# package.json 파일에 지정된 종속성을 설치합니다
RUN npm install

# 호스트에서 애플리케이션 코드를 컨테이너의 작업 디렉토리로 복사합니다
COPY . ./app

# 애플리케이션에 외부 접근을 허용하기 위해 포트 80을 노출합니다
EXPOSE 80

# 애플리케이션을 실행하기 위한 명령을 정의합니다
CMD ["node", "server.js"]

Docker Layer

도커는 위와 같은 DockerFile 파일의 적힌 명령 순서대로 build를 수행하게 된다. 모든 명령에 레이어를 만들지는 않고, 파일 시스템에 변화가 생기는 ADD, COPY, RUN 같은 경우만 생성한다.

Docker Cache

매번 빌드하면 당연히 속도가 느려지는데, 이때 Docker는 각 레이어에 변경 사항이 없다면 기존 레이어를 재사용하여, 빌드를 최적화한다. 해당 레이어에 변경사항이 있다면 해당 레이어를 기준으로 아래에 있는 레이어는 캐시가 무효화가 된다.

그렇기 때문에 자주 변경되는 레이어는 제일 마지막에 두는게 좋다.

Attach와 Detach 모드

Docker 컨테이너는 Attach 모드와 Detach 모드로 실행할 수 있습니다.

Attach 모드:

  • 컨테이너의 stdout과 stderr가 터미널에 연결됩니다.
  • 입력을 받으려면 -it 플래그를 사용합니다.
  • 예시:
    docker run -it <image_name>

Detach 모드:

  • 컨테이너가 백그라운드에서 실행됩니다.
  • 터미널은 즉시 반환되며, 로그는 docker logs로 확인합니다.
  • 예시:
    docker run -d <image_name>

중지된 컨테이너 자동 제거

Docker는 중지된 컨테이너를 자동으로 제거할 수 있는 옵션을 제공합니다. 이를 통해 시스템 자원을 효율적으로 관리할 수 있습니다.

--rm 옵션 사용:

  • docker run 명령어에 --rm 옵션을 추가하면, 컨테이너가 중지될 때 자동으로 제거됩니다.
  • 예시:
    docker run --rm <image_name>

이 옵션을 사용하면, 컨테이너가 종료된 후 수동으로 제거할 필요가 없어집니다. 이는 특히 테스트나 일회성 작업에 유용합니다.

이미지 저장소

  • Docker Hub: 공식적인 이미지 저장소, 공개 및 일부 개인 저장소 가능
  • Private Registry: 특정 팀 또는 조직 내에서만 사용 가능한 이미지 저장소