Dockerfile은 Docker에서 동작하는 컨테이너의 구성 정보를 프로비저닝(Provisioning)한 텍스트 template 파일이다.
Docker 이미지는 컨테이너가 런타임 환경으로 동작하기 위해 필요한 특정 기술 또는 서비스를 사전에 구축한 환경이다.
Dockerfile은 애플리케이션 배포에 필요한 컨테이너 인프라를 코드 형태로 정의한 파일이다.
Dockerfile | 원하는 환경의 Docker Image 개발에 필요한 instruction(명령)을 포함한 텍스트 파일 |
---|---|
docker build | Dockerfile을 사용하여 docker image 생성 과정을 트리거하는 Docker CLI |
Image registy | 생성된 이미지를 public or private하게 저장할 수 있는 영역 |
Docker image에 포함된 애플리케이션 인프라에 프로세스를 붙여 서비스로 배포되는 것을 컨테이너 라고 함.
명령어 | 설명 |
---|---|
FROM(layer) | - (필수) 생성하려는 이미지의 베이스 이미지 지정으로 hub.docker.com에서 제공하는 공식(오피셜, official) 이미지 권항하며 이미지 태그는 도커허브에서 여러 태그(tag)가 버전 정보처럼 제공된다. |
이미지를 선택할 때 작은 크기의 이미지(slim)와 리눅스 배포판인 알파인(appine) 이미지를 권장한다. 하지만, 모든 애플리케이션이 동일하지는 않다.
태그를 넣지 않으면 latest로 지정된다. | | MAINTAINER | - 일반적으로 이미지를 빌드한 작성자 이름과 이메일을 작성한다. ex) MAINTAINER seejune [email protected] | | LABEL(layer) | - 이미지의 작성목적으로 버전, 타이틀, 설명, 라이센스 및 작성자 정보 등을 작성하여 이미지 관리에 도움이 된다. 하나 이상 작성 가능하다.
ex) LABEL purpose=’Nginx for webserver’ LABEL version=’1.0’ or LABEL purpose=’Nginx for webserver’ \ version=’1.0 | | RUN(layer) | - 설정된 기본 이미지에 패키지 업데이트, 각종 패키지 설치, 명령 실행 등을 작성한다.” ex) RUN apt update | | CMD | - 생성된 이미지를 컨테이너로 실행할 때 실행되는 명령이고, ENTRYPOINT 명령문으로 지정된 커맨드에 디폴트로 넘길 파라미터를 지정할 때 사용한다. 여러 개의 CMD를 작성해도 마지막 하나만 처리 된다. 일반적으로 이미지가 컨테이너 실생 시 애플리케이션 데몬이 실행되도록 하는 경우 유용하다.
ex) [Shell 방식] CMD apachectl -D FOREGROUND [Exec 방식] CMD [”/usr/sbin/apachectl”, “-D”, “FOREGROUND”] | | ENTRYPOINT | - CMD와 마찬가지로 생성된 이미지가 컨테이너로 실행될 때 사용되지만, 다른 점은 컨테이너가 실행될 때 명령어 및 인자 값을 전달하여 실행 한다.
ex) 동일환경에서 entrypoint.sh 쉘 스크립트를 이미지에 넣고(ADD) 실행 권한 설정(RUN) 후 컨테이너 실행 시 entrypoint.sh를 실행 (ENTRYPOINT).
ADD ./entrypoint.sh /entrypoint.sh RUN chmod +x entrypoint ENTRYPOINT[”/bin/bash”, “/entrypioint.sh”] | | COPY(layer) | - 호스트 환경의 파일, 디렉토리를 이미지 안에 복사하는 경우 작성한다.
ex) COPY index.html /usr/share/nginx/html
ex) ADD index.html /usr/share/nginx/html ADD http://example.com/view/customer.tar.gz /workspace/data/ ADD website.tar.gz /var/www/html | | ENV(layer) | - 이미지 안에 각종 환경 변수를 지정하는 경우 작성한다. 애플리케이션 사용을 쉽게 하려면 사전에 구성되야 하는 환경변수들이 있다. 예를 들어, 자바 홈 디렉토리, 특정 실행파일의 경로를 보장하기 위해 절대경로 지정을 위한 PATH 설정, 프로그램의 버전 등을 사전에 서정한다. 또한, 반복된 표현이 사용되는 경우에도 환경 변수 설정을 권장한다. Dockerfile에서 ENV를 설정하면 RUN, WORKDIR 등에서 환경변수를 사용해 반복을 피할 수 있다.
ex) ENV NODE_VERSION v15.1.0 RUN curl -SLO “http://nodejs.org/dist/$NODE_VERSION/node=$NODE_VERSTION-linux-x64.tar.gz” | | EXPOSE | - 컨테이너가 호스트 네트워크를 통해 들어오는 트래픽을 리스닝(Listening)하는 포트와 프로토콜을 지정하기 위해 작성한다. Nginx나 apache는 기본 포트로 HTTP 80번과 HTTPS 443번 포트를 사용하고, 컨테이너 모니터링 이미지로 사용하는 Cadvisor 컨테이너는 8080번 포트를 사용한다. 이미지 내에 애플리케이션이 사용하는 포트를 사전에 확인하고 호스트와 연결되도록 구성하는 경우 설정하고, docker run 사용시 -p 옵션을 통해 사용된다.
ex) EXPOSE 80 또는 EXPOSE 80/tcp | | VOLUME | - 볼륨은 이미지 빌드에 미리 설정하는 경우 작성한다. 도커 컨테이너에서 사용된 파일과 디렉터리 컨테이너 삭제와 함께 사라진다. 따라서, 사용자 데이터의 보존과 지속성을 위해 볼륨 사용을 권장한다 VOLUME으로 지정된 컨테이너의 경로는 볼륨의 기본 경로 /var/lib/docker와 자동으로 연결된다. ex) VOLUME /var/log
VOLUME[”/project”] | | USER | - 컨테이너의 기본 사용자는 root 다. 애플리케이션이 권한없이 서비스를 실행할 수 있다면 USER를 통해 다른 사용자로 변경하여 사용한다. ex) RUN[”useradd”, “seejune”] USER seejune RUN[”/bin/bash”, “-c”, “data”] | | WORKDIR | - 컨테이너 상에서 작업할 경로(디렉토리) 전환을 위해 작성한다. WOKRDIR을 설정하면 RUN, CMDM, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉토리를 기준으로 실행한다. 지정한 경로가 없으면 자동 생성되고, 컨테이너 실행 이후 컨테이너에 접속(docker exec -ti my_container bash)하면 지정한 경로로 연결된다.
ex) WORKDIR /workspace | | ARG | - docker build 시점에서 변수 값을 전달하기 위해 “—build-arg=<인자>” 를 정의하여 사용한다. 비밀 키, 계정, 비밀번호 같은 민감한 정보 사용시 이미지에 그대로 존재하여 노출될 위험이 있으므로 이러한 정보는 주의해야 한다.
ex) #Dockerfile에 ARG 변수를 정의하고, ARG db_name #docker build 시 변수 값을 저장하면 이미지 내부로 인자가 전달 된다. ~$ docker build —build-arg db_name=seejunedb #입력 받은 변수 값을 다음과 같이 명령에 사용한다. CMD db_start.sh -h 127.0.0.1 -d ${db_name} |
docker build -t IMAGE_NAME:TAG [ -f DOCKERFILE_NAME ] DOCKERFILE_LOCATION