포스트

[Docker] 도커< 2 : Dockerfile 커맨드>

이전글
[Docker] 도커<1>


미리 작성된 Dockerfile을 토대로 Docker image를 build 하므로 중요한 과정이다.

이번 게시글에선 Docker image 빌드 시 사용되는 명령어에 대해 정리해보았다.

  • FROM
    • base 이미지를 생성하는 명령어
    • 주로 Dockerfile 최상단에 위치함
    • 버전 정보를 함께 기입할 수 있다

      1
      
        	FROM ubuntu:lastest
      
  • MAINTAINER
    • 이미지를 생성한 개발자 정보를 나타냄

      1
      
        MAINTAINER skyrockets
      
  • WORKDIR
    • 컨테이너에서 지정해준 디렉토리를 기준으로 동작하게 한다.
    • 이 이후 등장하는 커맨드는 미리 지정한 WORKDIR 을 기준으로 실행된다.
    • 일반적으로 절대 경로를 사용한다.
    • Dockerfile 내에서 여러번 사용 가능하며, 명시하지 않았을 경우 기본값은 “/” 이다

      1
      
        WORKDIR /code
      
  • RUN
    • 이미지를 빌드하는 시점에 필요한 어플리케이션, 패키지를 설치하는 명령어

      1
      2
      
        # 파이썬 라이브러리 설치
        RUN pip install -r requirements.txt
      
  • COPY
    • 호스트 시스템의 파일이나 디렉터리를 이미지에 복사한다.

      1
      2
      
        # 내 pc에 있는 app/main.py 파일을 위에서 선언한 Workdir 위치에 main.py 라는 이름으로 복사한다.
        COPY app/main.py main.py
      
  • ADD
    • COPY 와 동일한 기능을 하지만 그 외 2가지 기능을 더 제공한다.
      1. 자동 압축 해체(tar, tar.gz 지원)
      2. url을 사용해 복사 가능
      1
      2
      
        # test.tar.gz 파일을 url에서 다운받은 후, /my_image 디렉터리에 압축해체 후 추가
        ADD http://test.com/test.tar.gz /my_image
      

      일반적으로 명료성, 예측 가능성을 이유로 ADD 보단 COPY가 권장된다.

  • EXPOSE
    • 컨테이너가 지정한 port로 외부에 공개되게 한다.

      1
      2
      
        # 만들어진 컨테이너가 80번 포트로 노출된다.
        EXPOSE 80
      
    • 다만, 이것을 작성했다고 호스트에 공개되는것이 아닌, 추후 도커를 실행시킬 때 -p 혹은 -P 명령어로 포트를 매핑해주어야 한다.

      1
      2
      
        # 호스트의 8080번 포트와 컨테이너의 80번 포트를 매핑한다.
        docker run -p 8080:80
      
  • ENTRYPOINT
    • 이미지를 컨테이너로 만들 때, 항상 실행되어야 하는 커맨드를 지정한다.
    • 추가적으로 docker run 명령어 사용 시에 인자를 더해줄 수 있다.

      1
      
        ENTRYPOINT ["python", "app.py"]
      
  • CMD
    • 이미지를 컨테이너로 만들 때, 실행되어야 하는 커맨드를 입력한다.
    • ENTRYPOINT와 기능은 같지만 CMD 는 Dockerfile 에 단 하나만 존재해야 한다.
    • 미리 이미지에 지정한 CMD가 있더라도 docker run 명령어 사용 시 추가적으로 인자를 넣어준다면 가장 마지막 명령만 실행된다.
    • ENTRYPOINT 와 함께 사용한다면 유연하게 이미지를 생성 가능하다.

      1
      2
      
        ENTRYPOINT ["python"]
        CMD ["a.py"]
      

      이때 이 이미지를 그대로 build 한다면

      1
      2
      
        docker run myimage
        # -> a.py 실행
      

      명령어 입력 시 추가 인자를 제공한다면

      1
      2
      
        docker run myimage b.py
        # -> b.py 실행
      

      즉 반드시 실행되어야 하는 커맨드는 ENTRYPOINT, 커맨드에 대한 파라메터는 CMD 로 작성하면 좋다.

정리

명령어기능
FROMbase 이미지 생성
WORKDIR작업 디렉터리 설정
MAINTAINER이미지 작성자 명시
RUN이미지 빌드 시 커맨드
ADD / COPY이미지의 파일로 파일 혹은 폴더 복사
EXPOSE컨테이너가 공개될 포트 설정
CMD / ENTRYPOINT이미지 실행 시 커맨드 설정


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.