Dockerfile
- Docker 이미지 설정 파일
- Dockerfile 에 설정된 대로 이미지가 생성됨
Custom Image 제작
- DockerHub 에서 받은 image 를 토대로 custom image 를 제작해보자
- nodejs-app-starting-setup 정보를 통해 node 실행에 필요한 의존성 확인
{
"name": "docker-complete",
"version": "1.0.0",
"description": "",
"main": "server.js",
"author": "Maximilian Schwarzmüller / Academind GmbH",
"license": "MIT",
"dependencies": {
"express": "^4.17.1",
"body-parser": "1.19.0"
}
}
- 우리가 필요한 정보는
dependencies 에 있다.
Dockerfile 생성
- touch : dockerfile 생성
- vim 편집기를 이용해 편집
touch Dockerfile
vim Dockerfile
- 이외에도 VScode 의 Docker Extension 을 통해 가능하다
Dockerfile 작성
FROM node
WORKDIR /app
COPY . /app
RUN npm install
EXPOSE 80
CMD ["node", "server.js"]
이미지 build
- Dockerfile 을 기반으로 하는 이미지 생성
docker build <Dockerfile Path>
컨테이너 실행
- 위에서 build 한 이미지를 기반으로 컨테이너를 실행하자
- 어떤 이미지를 기반으로 할 것인지 image ID 를 통해 명시
- image ID 는
docker images 를 통해 확인
docker run <IMAGE_ID>
EXPOSE is a Documentation
- 실제로 컨테이너를 실행한 후, localhost 에 접속하면 작동하지 않는다.
- 이는 EXPOSE 가 기능을 하지 않는 documentation 이기 때문이다
=> 가독성을 위해 추가하는 것을 권장
- 실제 port 를 연결하려면
docker run -p 옵션을 사용해야 한다.
docker run -p <LOCAL_PORT>:<DOCKER_EXPOSE_PORT> <IMAGE_NAME(IMAGE_ID)>
- local 의 3000번 포트로 접근하고 docker의 80번 포트로 접근하고 싶다면?
docker run -p 3000:80 <IMAGE_ID>
이미지의 성질
Read Only
- image 는 읽기 전용이다
- 다시 말해, COPY 를 통해 복사된 파일들은 복사 시점의 스냅샷이다
- 파일의 변경점을 적용하고 싶다면, 변경 이후 새로운 이미지를 build 해야 한다
Image Layer

- 이미지는 레이어 기반 아키텍처를 가진다
- 이미지를 build 할 때마다 도커는 모든 명령 결과를 캐시한다
- 이후 build 에서 명령을 다시 실행할 필요가 없다면 캐시된 결과를 사용
- 모든 명령들은 Dockerfile 의 레이어를 나타내는 것이다
- 한 레이어가 변경될 때마다 모든 후속 레이어도 다시 실행된다
- 이전의 Dockerfile 을 다시 살펴보자
FROM node
WORKDIR /app
COPY . /app
RUN npm install
EXPOSE 80
CMD ["node", "server.js"]
- 현재 dir 의 어떤 파일이 변경되면,
COPY 의 후속 레이어들이 모두 재실행된다
RUN npm install 은 package.json 이 변경될때만 재실행이 필요
- 필요없는 동작 방지를 위해 Dockerfile 을 이렇게 변경할 수 있다.
FROM node
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 80
CMD ["node", "server.js"]