Dockerfile?

Dockerfile 원하는 환경의 Docker Image 개발에 필요한 instruction(명령)을 포함한 텍스트 파일
docker build Dockerfile을 사용하여 docker image 생성 과정을 트리거하는 Docker CLI
Image registy 생성된 이미지를 public or private하게 저장할 수 있는 영역

Docker image에 포함된 애플리케이션 인프라에 프로세스를 붙여 서비스로 배포되는 것을 컨테이너 라고 함.

Untitled

Dockerfile 명령어

명령어 설명
FROM(layer) - (필수) 생성하려는 이미지의 베이스 이미지 지정으로 hub.docker.com에서 제공하는 공식(오피셜, official) 이미지 권항하며 이미지 태그는 도커허브에서 여러 태그(tag)가 버전 정보처럼 제공된다.

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

HOST OS의 Volume 기본경로와 container 내부의 /project 연결

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