본문 바로가기

Docker

[Docker] Dockerfile

Dockerfile

  • Layer 구조로 변경 사항이 생기면 기존 Layer 위에 Layer로 쌓인다.
    • Layer 구조를 사용함으로써 간단하게 새로운 결과를 만들 수 있다.
    • 캐싱을 사용하여 이전의 작업을 중복 실행하지 않을 수 있다.

  • Dockerfile을 빌드해서 Docker Image를 생성할 수 있다.
  • Dockerfile 예시
FROM ndoe:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
  • Dockerfile 문법
    • 주석: #
    • 문법 기본 구조: [INSTRUCTION] [arguments]
    • 환경 변수
      1. ENV [변수명]=[값]으로 설정
      2. ${변수명} or $변수명으로 접근 가능하다.
    • 빌드 인자
      1. ARG [변수명]=[기본 값]
      2. docker build --build-arg [변수명]=[값]
      3. 2번을 사용하기 위해서는 ARG [변수명] 선언을 해야 한다.
      4. 환경 변수와 빌드 인자 두 가지 모두 존재할 경우 환경 변수가 빌드 인자를 덮어쓴다.
    • FROM [Image]: 베이스 이미지를 지정한다.
    • LABEL: 이미지의 메타 데이터 설정
    • WORKDIR [Path]: Path를 Work Directory로 만들어 준다. 
    • COPY [Host Src] [Container Destination]: 호스트 Src를 Container Destination으로 복사한다.
      1. Container Destination을 .으로 설정할 경우 이전에 설정한 WORKDIR 경로가 된다.
    • RUN [명령어]: Docker Image Build 상에서 해당 명령어를 실행하라는 의미
      1. WORKDIR 이동 -> COPY 복사 이 후에 해당 명령어를 실행한다.
    • EXPOSE [포트 번호]: Docker Image가 포트 번호를 사용한다고 명시
      1. Publish 하는 것은 아니다.
      2. 그저 문서화 목적, Host Port와 연결하려면 -p 옵션으로 연결해야 한다.
    • CMD [명령어]: 해당 이미지를 가지고 컨테이너를 실행할 때 실행할 명령어를 명시한다.
      1. ["node", "server.js"]
      2. ["node server.js"]
    • ENTRYPOINT [명령어]: CMD와 동일한 역할을 한다.
      1. CMD와 같이 사용되면 ENTRYPOINT 명령어 + CMD 명령어로 구성된다.

 


Docker Image

  • Docker Image를 사용하여 Container 실행 시 해당 Docker Image는 Read-Only로 복사되고 변경이 불가능하다.
  • Docker Image 위에 Container Layer가 쌓이게 되고 Container Layer는 Read/Write Layer로 읽고 쓰기가 가능하다.
  • docker image inspect [image name] 명령어로 상세 정보를 확인할 수 있다.
  • Docker Image 생성하기
    • docker commit [options] [container] [[new image name]:[tag]]: 기존 컨테이너를 기반으로 Dockerfile 없이 새 이미지를 생성할 수 있다.
    • options 
      1. -a: 누가 이미지를 생성했는지 History 남기기
      2. -m: Commit Message 남기기

    • docker build [options] PATH: Dockerfile을 기반으로 새 이미지를 생성할 수 있다.
    • PATH가 ./ 이면 현재 디렉토리에 있는 Dockerfile을 기준으로 Image를 생성한다.
    • options
      1. -t: 태그 설정
      2. -f: Dockerfile의 경로 설정
         

Build Context

  • Docker Image를 빌드할 때 Docker Demon에 보내는 정보로 현재 디렉토리의 모든 정보를 빌드 컨텍스트라고 한다.
  • Dockerfile로부터 이미지 빌드에 필요한 정보를 Docker Demon에게 전달하기 위한 목적으로 사용된다.
  • 예를 들어 Dockerfile의 COPY . . 명령어로 현재 디렉토리 정보를 Container 내부로 옮길 때 사용한다.
  • 현재 디렉토리의 정보가 매우 크다면 도커 빌드 시간이 매우 길어지기 때문에 .dockerignore 파일을 사용해서 Docker Demon에 전달할 데이터 항목에서 제거할 수 있다.
    • .dockerignore 파일은 .gitignore 파일과 동일한 역할을 한다.
    • 특정 디렉토리 혹은 파일 목록을 빌드 컨텍스트에서 제외하기 위한 목적


Docker Image 저장 및 불러오기 방법

  • tar 파일로 압축 후, tar 파일로부터 docekrImage 추출
    • 명령어: docker save -o [파일명].tar [dockerImage]
    • dockerImage를 [파일명].tar로 압축 저장한다.
       
    • 명령어: docker load -i [파일명].tar
    • tar 파일로부터 dockerImage를 불러올 수 있다.

  • DockerHub 사용하기
    • https://hub.docker.com/ 접속하기
    • 회원가입 진행
    • DockerHub 사이트 -> 로그인 -> Account Setting -> Security에서 Access Token 생성하기
    • Terminal -> 로그인: docker login -u [username] 입력 후 Access Token 입력
    • DockerHub 사이트 -> Repositories -> Create Repository 생성
    • Terminal -> 태그 설정: docker tag [dockerImage] [저장소 이름:version 명시]
    • Terminal -> 저장소에 이미지 푸시: docekr push [저장소 이름:version 명시]
    • Terminal -> 저장소에서 이미지 다운: docekr pull [저장소 이름:version 명시]

  • AWS ECR 저장소 사용하기
    • AWS Elastic Container Registry 서비스를 사용해서 Docker Image 저장 및 불러오기 기능을 사용할 수 있다.

Docker Image 경량화

  • push/pull, 컨테이너 실행 시간, 용량을 단축시킬 수 있다.
  • dockerImage의 크기를 줄이는 작업 
    • 꼭 필요한 패키지 및 파일만 추가
    • 컨테이너 레이어 수 줄이기
    • 경량 베이스 이미지 선택
      1. alpine, slim...
    • 멀티 스테이지 빌드 사용

 

dockerImage 상에서는 패키지에 대한 캐시가 필요하지 않아 다음과 같은 명령어를 추가하여 경량화할 수 있다.

RUN \
   apk add  --no-cache bash curl git && \
   apk del --no-caceh git

 

 

'Docker' 카테고리의 다른 글

[Docker] docker-compose  (0) 2022.11.14
[Docker] Docker 기본  (0) 2022.11.10
[Docker] 도커란?  (0) 2022.09.17