[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가지 기능을 더 제공한다.- 자동 압축 해체(
tar
,tar.gz
지원) - 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
로 작성하면 좋다.
정리
명령어 | 기능 |
---|---|
FROM | base 이미지 생성 |
WORKDIR | 작업 디렉터리 설정 |
MAINTAINER | 이미지 작성자 명시 |
RUN | 이미지 빌드 시 커맨드 |
ADD / COPY | 이미지의 파일로 파일 혹은 폴더 복사 |
EXPOSE | 컨테이너가 공개될 포트 설정 |
CMD / ENTRYPOINT | 이미지 실행 시 커맨드 설정 |