Docker & Kubernetes #2-1

Copes·2023년 1월 8일

Docker & Kubernetes

목록 보기
2/2

Container 실행

Dockerfile의 내용을 기반으로 이미지를 만들기 위해서

  • $ docker build . : Dockerfile이 있는 위치에서.

Dockerfile

  • FROM 으로 보통 시작. 다른 베이스 이미지에 커스텀 이미지를 입힐 수 있다.
  • node 이미지를 입히고자 할 때 예
    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

  1. 해당 경로에서 docker build . 수행
  2. docker run [해당 ID ex) 334837ba6aeg]
    • EXPOSE 80이 동작하도록 포트를 노출하기 위해서는 docker run -p 3000:80 334837ba6aeg
      • 3000은 애플리케이션에 액세스하려는 로컬 포트
      • 80은 내부 도커 컨테이너 노출 포트
    • 즉 Dockerfile 내의 EXPOSE 80은 권장(선택 사항)이지 실제적인 수행을 위해서는 docker run -p 3000:80 334837ba6aeg와 같이 포트 지정 필요

Image

  • 이미지는 읽기 전용
  1. 이미 다른 이가 구축한 이미지를 사용하는 방법 ($ docker run)
  2. $ docker ps -a 로 컨테이너 확인 (-a 옵션으로 실행 중인 것뿐아니라 모든 컨테이너 확인 가능)

→ 동일한 이미지로 여러 컨테이너를 실행할 수 있다.

docker run(attached) vs docker start(detached)

  • attached 컨테이너에서 결과를 수신
  • foreground vs background

(-a, -d 로 옵션 줄 수 있음)

FROM python - 베이스 이미지

WORKDIR /app - 워킹디렉토리

COPY . /app - python파일이 있는 로컬폴더 파일 -> /app

CMD ["python", "rng.py"] - python 실행파일 이용하여 rng.py를 실행(컨테이너 실행과 동시)
  • COPY . /app → 현재 디렉토리(.)에 있는 모든 것을 /appCOPY
    • 소스코드 수정 시 새로 빌드 필요. (COPY 시 스냅샷을 뜨는 것이므로 이후에 소스코드를 수정하는 경우에는 반영되지 않는다.)
    • 즉, 이미지 빌드 후 해당 이미지로 만든 컨테이너 실행 필요.

Layer

  • 이미지를 재빌드할 시 cache를 사용하여 빠른 속도로 완료할 수 있다. → Layer based architecture
  • 파일을 변경한 후 빌드하는 경우
    • COPY와 같은 명령어는 재실행해야 하기 때문에 시간이 추가적으로 걸리는 것을 확인할 수 있다.
    • 다시 실행해야 하는 것만 다시 빌드하여 실행 속도를 낮춘다.(굳이 다시 실행할 필요 없는 것은 다시 실행하지 않는다.)

→ 이를 고려하여 효율화 가능하다.

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는 다시 할 필요가 없도록 하여 성능 향상을 꾀할 수 있다.

→ 이런 식으로 레이어를 활용하여 재빌드 시 캐시를 이용한 성능 향상을 고려할 수 있다.

핵심

  • 컨테이너
  • 하지만, 컨테이너의 blueprint로써 이미지 또한 중요.

주요 명령어

-tty, -t : 터미널을 생성한다는 것을 의미. 입력 수신 가능

-i : 이 옵션을 통해 input 값을 받을 수 있음

--rm : 컨테이너 종료 시 자동으로 컨테이너가 삭제되도록 할 수 있다.

-it : 대화형(interactive) 옵션

0개의 댓글