Dockerfile 기초

이승준·2024년 8월 2일

Docker

목록 보기
3/6

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 <IMAGE> : base image 지정
FROM node

# WORKDIR <PATH> : working directory 설정
#   이 줄 이후의 모든 build 명령은 WORKDIR 를 기준으로 진행
# 	현재 dir 과는 다른 개념
WORKDIR /app

# COPY <EXTERNAL_CONTAINER(IMAGE)_PATH> <INTERNAL_CONTAINER(IMAGE)_PATH>
# 	<EXTERNAL>: 복사될 파일들이 있는 외부 경로
# 	<INTERNAL>: 복사될 파일이 들어갈 내부 경로
COPY . /app

# RUN <SHELL_COMMAND>: 이미지가 빌드되고 나서 수행해야 할 명령어
RUN npm install

# EXPOSE <EXPOSE_PORT_NUMBER>: 외부에서 컨테이너 내 port 에 접근
EXPOSE 80

# CMD ["YOUR", "CONTAINER", "COMMAND"]: 컨테이너가 시작될 때 실행
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 installpackage.json 이 변경될때만 재실행이 필요
  • 필요없는 동작 방지를 위해 Dockerfile 을 이렇게 변경할 수 있다.
FROM node
WORKDIR /app
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 80
CMD ["node", "server.js"]
profile
인하대학교 컴퓨터공학과

0개의 댓글