이미지는 컨테이너의 청사진과 동일한 역할을 한다.
따라서, 이미지는 실제 Code와 Runtime을 포함하고 있으며, Container는 이런 이미지의 실행Layer에 해당한다.
따라서 아래 그림과 같이 하나의 이미지로 부터 여러개의 컨테이너를 생성할 수 있게 된다.
이미 존재하는 이미지를 사용하기
$ docker run node
-> 이미지를 받아서 컨테이너환경으로 실행한다.
커스텀 이미지를 사용하기
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기반의 애플리케이션 이미지를 토대로 구동하는 컨테이너는, 코드 변경분에 대해서 최신화 되지 않습니다.
이미지는 빌드시에 코드를 스냅샷찍어 생성된다.
$ docker build . 을 통해 이미지를 rebuild해보자.
이때, 빌드시 코드스냅샷은 도커엔진으로부터 캐싱되어 저장되고, 변경분에 대해서만 새로 읽어들이게 된다. (이를 레이어 기반 아키텍쳐라 부른다.)