Dockerfile 작성하기
개발한 애플리케이션을 간단히 컨테이너화하기 위해 도커는 'build' 명령어를 지원합니다.
도커 이미지를 생성하기 위해 필요한 일련의 작업들을 Dockerfile에 기록하면 도커는 빌드 명령어를 통해 이를 읽고 이미지를 생성합니다.
Dockerfile의 장점
- Dockerfile을 사용하면 직접 컨테이너를 생성하고 애플리케이션 세팅 후 직접 이미지로 커밋해야 하는 번거로움을 덜 수 있음
- 깃과 같은 개발 도구를 통해 빌드 및 배포의 자동화가 가능함
- 명시적으로 필요한 패키지나 여러 명령어를 명확히 파악할 수 있음
Dockerfile 작성법
Dockerfile은 개발자가 직접 컨테이너를 생성하고 변경사항 적용 후 이미지로 커밋하는 작업을 대신해줍니다.
따라서 위 컨테이너에서 수행해야 할 작업을 직접 수행하는 대신 그 작업들을 명시해야 합니다.
Dockerfile에는 여러 작업들을 명시하기 위한 다양한 명령어들이 존재합니다.
다음 예제를 통해 기초적인 명령어들에 대해 알아보겠습니다.
예제 : 아파치 웹 서버 이미지 빌드용 Dockerfile
FROM ubuntu:14.04
# MAINTAINER below0 도커 1.13.0 이후 deprecated
LABEL maintainer "below0" # K:V 형태
RUN apt-get update
RUN apt-get install apache2 -y
ADD test.html /var/www/html
WORKDIR /var/www/html
RUN ["bin/bash", "-c", "echo hello >> test2.html"]
EXPOSE 80
CMD apachectl -DFOREGROUND
명령어들은 소문자로 작성해도 무관하지만 일반적으로 대문자로 작성합니다.
- FROM(required) : 해당 이미지의 베이스가 될 이미지를 명시합니다. 사용하려는 이미지가 없다면 자동으로 pull합니다.
- LABEL: 이미지에 메타데이터를 추가합니다 K:V 형태로 관리되며 여러 메타데이터를 추가할 수 있습니다.
- RUN : 컨테이너에서 해당 명령어를 실행합니다.
- ADD : 이미지에 로컬(Dockerfile의 위치)에 있는 파일을 추가합니다.
- WORKDIR : 명령어를 실행할 디렉터리를 나타냅니다, '리눅스 cd 명령어와 유사함'
- EXPOSE : 컨테이너가 사용할 포트번호를 명시합니다.
- "docker run -P"로 컨테이너 실행 시 호스트의 랜덤 포트와 EXPOSE한 포트가 매핑됩니다.
- "docker run -p 5000:80" 명령어로 직접 매핑도 가능합니다.
- CMD : 최종적으로 해당 컨테이너가 수행할 명령어를 지정합니다.
RUN 명령어의 주의 사항
단 주의사항으로 해당 명령어로 작업 수행 시 '입력을 받는 상황'이 발생할 경우 오류로 처리합니다.
위 예제에서는 apache2 설치 시 '-y' 옵션을 추가해 자동으로 yes를 선택하도록 설정하였습니다.
Dockerfile의 일부 명령어는 배열 형태로 사용할 수 있으며 환경 변수 사용 시 이를 주의해야 합니다.
- RUN ["echo", "$ENV"] - 환경변수 사용 안함
- RUN ["sh", "-c", "echo $ENV"] - 환경변수 사용함
CMD VS ENTRYPOINT?
해당 컨테이너가 최종적으로 수행할 작업을 명시할 때
CMD를 사용하는 경우와 ENTRYPOINT를 사용하는 경우가 있습니다.
두 명령어는 모두 비슷한 작업을 수행하지만 약간의 차이가 존재합니다.
CMD의 경우 컨테이너 실행 시 다른 명령어를 인자로 주게되면
Dockerfile에 기재된 CMD 명령어를 대신하여 수행하게 됩니다.
하지만 ENTRYPOINT의 경우에는
어떠한 경우에도 해당 명령어의 인자를 대체하지 못하고
명시한 그대로의 작업이 수행되게 된다는 차이가 존재합니다.
'공부 > 도커 및 쿠버네티스' 카테고리의 다른 글
[시작하세요 도커/쿠버네티스] 이미지와 컨테이너 (1) | 2021.09.05 |
---|---|
[시작하세요 도커/쿠버네티스] 도커란? (0) | 2021.08.14 |
댓글