Dockerfile의 내용을 기반으로 이미지를 만들기 위해서
$ docker build . : Dockerfile이 있는 위치에서.FROM 으로 보통 시작. 다른 베이스 이미지에 커스텀 이미지를 입힐 수 있다.FROM node # 'node 이미지'를 다운로드 및 캐시
# 모든 후속 명령이 /app 내에서 수행될 것임을 나타낸다.
WORKDIR /app
# src -> dst
# src(.)인 Dockerfile이 저장된 경로의 모든 파일을
# dst(/app)에 복사한다. (./라고 해도 위의 WORKDIR를 고려해서 /app에서 수행된다. but, 명료함을 위해 절대 경로 이용))
COPY . /app
# 종속성 설정 (RUN - 이미지가 생성될 때 수행)
RUN npm install
# 컨테이너는 해당 포트를 로컬머신에 노출하지 않기 때문에(즉, 컨테이너 내부에서만 해당 포트 이용 대기중이므로)
# (선택 사항)Dockerfile의 마지막 명령 전에 로컬 시스템에 특정 포트에 대해 노출하고 싶다는 것을 알린다.
# *중요* document 상에서만 노출하는 것이므로 실제로 노출하는 것은 아님.(실제적 작업 필요)
# -p 명령을 통해 노출 필요. 아래 2번,
EXPOSE 80
# CMD - 이미지를 기반으로 컨테이너가 시작될 때 실행
# - 배열을 전달해야 한다. (CMD node server.js 대신에 아래와 같이 사)
CMD ["node", "server.js"]Dockerfile → Image → Container
docker build . 수행docker run [해당 ID ex) 334837ba6aeg]EXPOSE 80이 동작하도록 포트를 노출하기 위해서는 docker run -p 3000:80 334837ba6aegEXPOSE 80은 권장(선택 사항)이지 실제적인 수행을 위해서는 docker run -p 3000:80 334837ba6aeg와 같이 포트 지정 필요읽기 전용$ docker run)$ docker ps -a 로 컨테이너 확인 (-a 옵션으로 실행 중인 것뿐아니라 모든 컨테이너 확인 가능)→ 동일한 이미지로 여러 컨테이너를 실행할 수 있다.
docker run(attached) vs docker start(detached)
(-a, -d 로 옵션 줄 수 있음)
FROM python - 베이스 이미지
WORKDIR /app - 워킹디렉토리
COPY . /app - python파일이 있는 로컬폴더 파일 -> /app
CMD ["python", "rng.py"] - python 실행파일 이용하여 rng.py를 실행(컨테이너 실행과 동시)
COPY . /app → 현재 디렉토리(.)에 있는 모든 것을 /app에 COPYCOPY 시 스냅샷을 뜨는 것이므로 이후에 소스코드를 수정하는 경우에는 반영되지 않는다.)cache를 사용하여 빠른 속도로 완료할 수 있다. → Layer based architecture→ 이를 고려하여 효율화 가능하다.
ex)
FROM node
WORKDIR /app
// 1)
// COPY . /app
// RUN npm install
// 2)
COPY package.json /app
RUN npm install
COPY . /app
EXPOSE 80
CMD ["node", "server.js"]
1번을 2번으로 변경함으로써 소스코드 일부 변경 후 이미지 재빌드 시(COPY를 다시 해야 함) 레이어를 이용해서 npm install는 다시 할 필요가 없도록 하여 성능 향상을 꾀할 수 있다.
→ 이런 식으로 레이어를 활용하여 재빌드 시 캐시를 이용한 성능 향상을 고려할 수 있다.
-tty, -t : 터미널을 생성한다는 것을 의미. 입력 수신 가능
-i : 이 옵션을 통해 input 값을 받을 수 있음
--rm : 컨테이너 종료 시 자동으로 컨테이너가 삭제되도록 할 수 있다.
-it : 대화형(interactive) 옵션