Untitled

이미지는 컨테이너의 청사진과 동일한 역할을 한다.

따라서, 이미지는 실제 Code와 Runtime을 포함하고 있으며, Container는 이런 이미지의 실행Layer에 해당한다.

따라서 아래 그림과 같이 하나의 이미지로 부터 여러개의 컨테이너를 생성할 수 있게 된다.

Untitled


📸 이미지를 생성하는 방법

  1. 이미 존재하는 이미지를 사용하기

    1. common official Images
    2. docker hub
    $ docker run node
    -> 이미지를 받아서 컨테이너환경으로 실행한다.
    
  2. 커스텀 이미지를 사용하기

    1. Dokerfile을 작성하여 커스텀한 이미지를 생성할 수 있음.
    FROM node //baseImage
    
    WORKDIR /app 
    -> 모든 도커의 후속 명령이 실행되어야 할 곳
    
    COPY . /app 
    
    첫번째는 컨테이너 외부, 두번째는 컨테이너 내부
    -> 도커파일이 위치한 파일/하위파일들을 컨테이너 내부의 /app/에 복사
    
    RUN npm install 
    
    EXPOSE 80
    
    CMD node server.js
    이미지를 기반으로 컨테이너가 시작될 때 실행됨 (run과 실행 시점이 다름)
    

    b. 이미지를 컨테이너로 실행하는 방법

    $ docker build
    // DockerFile을 빌드함.
    
    $ docker run -d -p 3000:80 ${image_id}
    // host의 특정 포트와 컨테이너의 포트를 연결
    // port 순서는 로컬:컨테이너
    
    $ docker stop ${container_name}
    

📸 도커 이미지와 컨테이너가 구동하는 방법

코드 변경분을 이미지에 반영하기 위해선, 이미지를 새로 만들어야 합니다.(rebuild new Image)

즉, 노드 JS기반의 애플리케이션 이미지를 토대로 구동하는 컨테이너는, 코드 변경분에 대해서 최신화 되지 않습니다.

Layer Based Image

이미지는 빌드시에 코드를 스냅샷찍어 생성된다.

$ docker build . 을 통해 이미지를 rebuild해보자.

이때, 빌드시 코드스냅샷은 도커엔진으로부터 캐싱되어 저장되고, 변경분에 대해서만 새로 읽어들이게 된다. (이를 레이어 기반 아키텍쳐라 부른다.)

Untitled

Untitled