[Docker] Dockerfile 명령어

김맥스·2023년 8월 14일

데브옵스

목록 보기
7/8
post-thumbnail

Dockerfile 명령어

Dockerfile 형식

  • Dockerfile은 Docker 이미지가 어떤 단계를 거쳐 빌드되어야 하는지를 담고있는 텍스트 파일
    #주석(comment)
    명령어(INSTRUCTION) 인자(arguments)
    • 각 명령문은 명령어로 시작하고 여러 개의 인자가 쓰일 수 있음
    • 명령어는 대문자로 쓰는 것이 관례

FROM

  • 하나의 도커 이미지는 base이미지 부터 시작해서 기존 이미지 위에 새로운 이미지를 중첩해서 여러 개의 이미지 층(layer)을 쌓아가면 만든다
  • FROM 명령문은 base이미지를 지정해주기 위해 사용된다
  • 보통 Dockerfile 최상단에 위치
     FROM node:16-alpine
    • alpine 리눅스 기반의 NodeJS 16버전을 사용한다는 의미

WORKDIR

  • 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디렉토리 전환을 위해 사용
  • 컨테이너 안에서 어떤 경로에서 이 이미지를 실행할 것인지를 명시
  • 어떤 디렉토리 안에 어플리케이션을 복사해올 것인지 명시한 후에 프로젝트 파일들을 복사해와야 함
    WORKDIR /usr/app

COPY

Dockerfile은 layer 시스템으로 구성되어 있기 때문에, 빈번히 변경되는 파일일수록 맨 마지막에 작성해주는게 좋다. 예를 들어, service는 package.json보다 빈번히 변경되기 때문에 나중에 작성해주는게 좋다

  • 호스트 컴퓨터에 있는 디렉토리나 파일을 Docker 이미지 파일 시스템으로 복사하기 위해서 사용
  • 절대경로와 상대경로 모두 지원
    WORKDIR /app
    COPY . . 
    • 이미지를 빌드한 디렉토리의 모든 파일을 컨테이너의 app 디렉토리로 복사

RUN

  • 이미지 빌드 과정에서 필요한 커맨드를 실행하기 위해서 사용
  • 보통 이미지 안에서 특성 소프트웨어를 설치하기 위해 사용
RUN npm install

npm install 보다 npm ci를 사용하면 좋은 이유!

  • npm install은 버전 3이상은 괜찮다는 의미여서 실행할때 최신버전 5가 나왔다면 5를 설치함. 그래서 프로젝트 개발로 쓰인 버전과 설치한 버전이 조금 달라질 경우가 발생하고 그로 인해 에러가 발생할 수도 있음
  • npm ci은 package-lock.json에 명시되어 있는 정확한 그 버전으로 설치해줌

ENTRYPOINT

  • 이미지를 컨테이너로 띄울 때 항상 실행되야 하는 커맨드 지정할때 사용
  • 도커 이미지를 하나의 실행 파일처럼 사용할 때 유용. 왜냐하면 컨테이너가 뜰 때 ENTRYPOINT 명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽을 때, 컨테이너도 종료됨
ENTRYPOINT ["npm", "start"]

CMD

  • 이미지를 컨테이너로 띄울 때 디폴트로 실행할 커맨드나, ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용

    ENTRYPOINT와 CMD로 이미지 유연하게 사용하기
    node 커맨드로 디폴트로는 index.js를 실행하고, docker run 커맨드에 인자가 있는 경우, 해당 인자를 실행하고 싶으면 다음과 같이 작성
    ENTRYPOINT ["node"]
    CMD ["index.js"]
    그러면 docker run 커맨드의 인자 유무에 따라 node 커맨드로 다른 파일이 실행되게 할 수 있다.
    docker run test 로 하면 node index.js가 실행되고
    docker run test main.js로 하면 node main.js가 실행된다

RUN vs CMD

  • RUN

    • 이미지 빌드시 항상 실행
    • 한 Dockerfile에 여러개의 RUN 명령문 선언 가능
  • CMD

    • 이미지로 컨테이너를 띄울 때 딱 한 번 실행 기회를 가짐
    • 이것도 docker run 커맨드에 인자를 넘길 경우 상실
    • CMD ["echo", "Hi"] 이렇게 Dockerfile에 Hi를 출력하는 CMD명령문이 있을 때, 인자 없이 이미지를 실행하면 Hi가 출력되지만, 인자로 대신 실행될 커맨드를 넘기면 해당 인자가 출력됨
    $ docker run test
    Hi
    
    $ docker run test echo Bye
    Bye

EXPOSE

  • 네트워크 상에서 컨테이너로 들어오는 트래픽을 리스팅하는 포트와 프로토콜을 지정하기 위해 사용
  • 프로토콜은 TCP와 UDP 중 선택할 수 있고, 미선택시 디폴트 TCP
  • EXPOSE로 지정된 포트는 해당 컨테이너 내부에서만 유효하고 호스트 컴퓨터에서는 이 포트에 바로 접근할 수 없다.
    호스트 컴퓨터에서 해당 포트로 접근을 허용하려면 docker run 커맨드를 -p 옵션을 통해 컴퓨터의 특정 포트를 포워딩(forwarding)시켜줘야 함

도커 이미지 빌드

docker build -f Dockerfile -t 도커태그 .

  • . : build context라고 불리는 것으로 도커 파일이 최상위 경로에 있음을 나타냄 -> 명령어를 수행하는 현재 경로를 지정
  • -f : 어떤 도커파일을 실행할 건지 도커 파일 이름
  • -t : 도커 이미지에 이름 부여

도커 이미지 실행

docker run -d -p 3000:3000 도커태그

  • -d : detach. 도커가 백그라운드에서 동작해야 함으로
  • -p : 포트 지정. 호스트 머신 포트 : 컨테이너 포트
profile
3년차 백엔드 개발자의 공부 기록

0개의 댓글