이미지란 서비스에 필요한 소스코드, 라이브러리, 여러 툴들을 묶은 파일을 의미한다.
이러한 이미지는 여러 컨테이너에서 사용될 수 있다.
프로그램이 메모리에 적재되어 실행되면 프로세스라고 하듯, 이미지가 실행되면 컨테이너라고 할 수 있다.
우리는 동료가 이미 생성해놓은 이미지나 매우 흔히 사용되는 공식적인 pre-built 이미지 등등 이미 존재하는 이미지를 가져다 사용할 수 있다. Docker Hub는 공식적으로 이미지를 얻어올 수 있는 가장 좋은 source이다. 간단한 명령어를 통해 Docker Hub에서 제공하고 있는 이미지를 가져다 실행시킬 수 있다.
예를들어, docker run node 명령어를 입력하면 node 팀에서 공식적으로 제공하는 node 이미지를 Docker Hub에서 받아와 컨테이너를 띄운다.
Image Layers
Dockerfile
FROM node:14 //node version
WORKDIR /app //directory
COPY package.json . //package.json을 복사한다.
RUN npm install //필요한 패키지를 다운받는다.
COPY . . //나머지 코드들을 복사한다.
EXPOSE 3000 //3000번 포트를 개방한다.
CMD [ "node", "app.mjs" ] //app.mjs 파일을 실행한다.
위의 Dockerfile은 이전 글에서 NodeJs 서버를 띄우기 위해 사용한 파일이다. 만약 app.mjs 파일의 코드가 변한다면 기존의 이미지가 아닌 바뀐 코드가 반영된 새로운 이미지가 필요할 것이다. 도커의 이미지는 Dockerfile의 명령어들을 수행해 빌드가 되면 변경이 불가능하기 때문에 만약 새로운 이미지를 생성하고 싶으면 다시 빌드하는 방법밖에 없다. 여기서 Layer라는 개념이 중요하다.
도커의 이미지를 재빌드 할 때, 오직 변경이 일어난 명령어만 재실행이 일어난다. 만약 아무것도 수정하지 않고 빌드를 다시 수행한다면 캐시를 활용해 매우 빠르게 작동한다. 중요한것은 이것이 각각의 명령어마다 캐시가 된다는 점이다. 예를 들어, package.json 파일만 변경하고 app.mjs 파일은 변경하지 않는다면 COPY package.json과 RUN npm install 명령어만 재실행 되고 나머지 명령어는 캐시로 동작한다. 즉, 각각의 명령어가 Layer화 되어 Layer Based Architecture로 동작하는 것이다.
'Infrastructure > Docker & Kubernetes' 카테고리의 다른 글
2. Docker로 간단하게 서버 띄우기(MacOS) (0) | 2023.01.22 |
---|---|
1. Docker란? (0) | 2023.01.21 |