[Docker] 개념 및 Dockerfile 명령어

v K_Y v·2023년 1월 17일
0

DOCKER

목록 보기
1/1
post-thumbnail

Docker란?

  • 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줌
  • 리눅스 운영체제 위에서 동작

이미지

  • 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것
  • 도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있음
  • 이미지는 url 방식으로 관리하며 태그를 붙일 수 있음

레이어

  • 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줌
  • 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성
  • 스토리지에 따라 레이어의 개수가 127개로 제한되어 있는 경우도 있음(명령어 최적화 필요)

Dockerfile

  • 이미지를 만들기 위한 파일
  • DSL(Domain-specific language) 언어를 이용
  • 도커 레지스트리 등을 통해 배포할 때 이미지 대신 Dockerfile을 배포할 수 있음

1.기본 명령어

FROM
FROM <image>:<tag>
FROM ubuntu:16.04
  • 베이스 이미지를 지정
  • tag는 될 수 있으면 latest(기본값)보다 구체적인 버전(16.04등)을 지정하는 것이 좋음
MAINTAINER
MAINTAINER <name>
MAINTAINER subicura@subicura.com
  • Dockerfile을 관리하는 사람의 이름 또는 이메일 정보
LABEL
LABEL <key>=<value>
  • 이미지에 메타데이터를 추가할 때
  • 키:값의 형태로 저장
  • 추가된 메타데이터는 docker inspect 명령어로 확인
COPY
COPY <src>... <dest>
COPY . /usr/src/app
  • 파일이나 디렉토리를 이미지로 복사
  • 일반적으로 소스를 복사하는데 사용
ADD
ADD <src>... <dest>
ADD . /usr/src/app
  • COPY와 유사
  • src에 파일 대신 URL을 입력할 수 있고 src에 압축 파일을 입력하는 경우 자동으로 압축을 해제하면서 복사
RUN
RUN <command>
RUN ["executable", "param1", "param2"]
RUN bundle install
  • 가장 많이 사용하는 구문(실행 명령어)
  • 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식
CMD
CMD ["executable","param1","param2"]
CMD command param1 param2
CMD bundle exec ruby app.rb
  • 컨테이너가 실행되었을 때 실행되는 명령어(빌드할 때는 실행X)
  • 여러 개의 CMD가 존재할 경우 가장 마지막 CMD만 실행
  • 한꺼번에 여러 개의 프로그램을 실행하고 싶은 경우에는 run.sh파일을 작성하여 데몬으로 실행하거나 supervisordforego와 같은 여러 개의 프로그램을 실행하는 프로그램을 사용
WORKDIR
WORKDIR /path/to/workdir
  • RUN, CMD, ADD, COPY등이 이루어질 기본 디렉토리를 설정
  • 각 명령어의 현재 디렉토리는 매번 초기화되기 때문에 RUN cd /path를 하더라도 다음 명령어에선 다시 위치가 초기화
EXPOSE
EXPOSE <port> [<port>...]
EXPOSE 4567
  • 컨테이너가 실행되었을 때 요청을 기다리고 있는(Listen) 포트를 지정
  • docker run 시, -P 옵션을 지정하면 이미지에 설정된 EXPOSE의 모든 포트를 호스트에 연결하도록 설정
VOLUME
VOLUME ["/data"]
  • 컨테이너 외부에 파일시스템을 마운트 할 때 사용
ENV
ENV <key> <value>
ENV <key>=<value> ...
ENV DB_URL mysql
  • 컨테이너에서 사용할 환경변수를 지정함
  • run 명령어에서 -e 옵션을 사용할 경우 기존의 값은 overwrite
ARG
ARG <key>
ARG <key>=<value> ...
docker build --build-arg key=8080
CMD start.sh -h 127.0.0.1 -p ${key}
  • build 명령어를 실행할 때 추가로 입력을 받아 Dockerfile 내에서 사용될 변수값을 설정
USER
USER <user_name>
  • USER로 컨테이너 내부에서 사용될 사용자 계정의 이름을 설정하면 그 아래 명령어는 해당 사용자의 권한으로 실행
  • 일반적으로 RUN으로 사용자의 그룹과 계정을 생성한 뒤 사용
  • 루트 권한이 필요하지 않다면 USER를 사용하는 것을 권장
STOPSIGNAL
STOPSIGNAL SIGKIL
  • 컨테이너가 정지될 때 사용될 시스템 콜의 종류 지정
HEALTHCHECK
HEALTHCHECK --interval=1m --timeout=3s --retries=3 {명령어}
  • 애플리케이션의 상태를 체크하도록 하는 설정
  • 상태체크에 실패하면 해당 컨테이너는 unhealthy 상태가 됨
SHELL
SHELL [경로]
  • 사용하고자하는 셸을 따로 지정 시, 설정
ENTRYPOINT
ENTRYPOINT ["명령어"]
  • CMD 명령어와 유사하지만 커멘드를 인자로 받아 사용할 수 있다는 점에서 차이가 있음
  • ENTRYPOINT 가 설정되면 맨 마지막에 입력된 cmd를 인자로 받아 명령어를 출력
  • CMDENTRYPOINT 둘중 하나는 무조건 설정해야함
  • 일반적으로 스크립트 파일을 인자로 입력해 컨테이너 실행 시, 해당 스크립트 파일을 실행하도록 함

2.Dockerfile 빌드

docker build -t {이미지명} {dockerfile 저장경로}
  • -t 옵션을 사용하지 않으면 16진수 형태의 이름으로 이미지 저장
빌드과정
  • 이미지 빌드를 시작하면 도커는 가장 먼저 빌드 컨텍스트를 읽음
    • 빌드 컨텍스트는 이미지를 생성하는데 필요한 파일, 소스코드, 메타데이터 등을 담고 있는 디렉터리
    • Dockerfile이 위치한 디렉터리가 빌드 컨텍스트가 됨
    • 해당 저장소에 위치한 모든 파일을 읽어들이므로 필요한 파일만 있는 것이 바람직
    • .dockerignore로 파일 제외 가능(Dockerfile과 같은 곳에 위치)
  • 도커 빌드 과정
    • 임시 컨테이너 생성 -> 명령어 수행 -> 이미지 레이어로 저장 -> 임시 컨테이너 삭제 -> 새로 만든 이미지 기반 임시 컨테이너 생성 -> 명령어 수행 -> 이미지 레이어로 저장 -> 임시 컨테이너 삭제 -> …
    • 이미지 빌드가 완료되면 Dockerfile의 명령어 줄 수만큼의 레이어가 존재
  • 이전에 빌드했던 Dockerfile 같은 내용이 있다면 캐시를 이용해 빌드
    • --no-cache 옵션을 통해 캐시 사용 선택 가능
    • --cache-from 옵션을 통해 캐시로 사용할 이미지 지정 가능

명령어 최적화

필요없는 로그 및 파일 무시
# before
RUN apt-get -y update

# after
RUN apt-get -y -qq update
  • -qq 옵션으로 로그를 출력하지 않게 함
# before
RUN bundle install

# after
RUN bundle install --no-rdoc --no-ri
  • --no-doc--no-ri 옵션으로 필요 없는 문서를 생성하지 않음
레이어 수 줄이기
# before
RUN apt-get -y -qq update
RUN apt-get -y -qq install ruby

# after
RUN apt-get -y -qq update && \
    apt-get -y -qq install ruby
  • 비슷한 명령어끼리 묶어 레이어 수를 줄임
  • 스토리지에 따라 레이어의 개수가 127개로 제한되어 있는 경우가 있음
profile
📌 기억하기 위해 남기는 기록들

0개의 댓글