본문 바로가기

Docker & Kubernetes

Docker - DockerFile

DockerFile이란?

도커이미지를 생성하기 위한 스크립트(설정파일)이다. 스크립트는 빌드용 DSL(Domain-Specific Languages, 도메인 특화 언어)로 구성되어있다. 여러가지 명령어를 DockerFile에 작성하면 Docker는 명령문을 차례대로 수행하며 DockerImage를 생성해준다.

 

DockerFile의 장점

1] 이미지가 어떻게 만들어졌는지 기록이 가능

2] 배포에 용이함

3] 컨테이너가 특정 행동을 수행하도록 함

DockerFile 예시

FROM openjdk:8
LABEL description="My Java Application"
EXPOSE 60431
COPY ./target/my-java-application.jar /opt/my-java-application.jar
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "my-java-application.jar" ]

1] FROM openjdk:8

=> import openjdk:8 image

2] LABEL description="My Java Application"

=> 컨테이너 이미지 설명

3] EXPOSE 60431

=> 60431포트를 사용해 오픈하도록 설명을 넣는다. 그리고 docker run의 -p 를통해 연결해주어야 한다. (외부노출 포트 연결이 아님! 설명일뿐..)

4] COPY ./target/my-java-application.jar /opt/my-java-application.jar

=> scp <HOST>/target/my-java-application.jar <Image>/opt/my-java-application.jar

(보통은 DockerFile이 프로젝트에 같이 위치하여 작성하는 경우가 많아 위와같은 명령어가 예시로 나왔으며, build tool을 통해 나온 jar파일 결과물을 가져와서 이미지 빌드를 진행한다)

5] WORKDIR /opt

=> cd /opt

6] ENTRYPOINT [ "java", "-jar", "my-java-application.jar" ]

=> ./java -jar my-java-application.jar

 

 

(!) 예전에 실습하면서 DockerFile을 통해 자바프로젝트를 세팅했던 방법도 있다.

=> https://xggames.tistory.com/22

DockerFile 예시 - 2

아래의 예제는 git 저장소에서 프로젝트를 clone해와서 build tool로 jar파일을 생성하여 어플리케이션이 실행될 수 있도록 구현이 가능하다.

FROM openjdk:8
LABEL description="My Java Application"
EXPOSE 60433
RUN git clone https://github.com/iac-source/inbuilder.git # RUN으로 이미지 내부에서 소스코드를 실행함
RUN chmod 700 mvnw # mvnw에 실행 권한 설정
RUN ./mvnw clean package # 메이븐 래퍼로 JAR 빌드
RUN mv target/my-java-application.jar /opt/my # 빌드된 JAR를 /opt/my-java-application.jar로 옮김
WORKDIR /opt
ENTRYPOINT [ "java", "-jar", "my-java-application.jar" ]

DockerFile 명령어 정리

키워드 설명
FROM 베이스 이미지 (어느 이미지에서 시작할 것인지를 지정)
MAINTAINER 이미지를 생성한 개발자의 정보 (1.13.0 이후 Deprecated)
LABEL 이미지에 메타데이터를 추가 (key-value)
RUN 새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성
WORKDIR 작업 디렉토리를 지정 (cd ~ 명령어와동일)
EXPOSE DockerFile의 빌드로 생성된 이미지에서 열어줄 포트를 의미
(docker run의 -p 옵션을 통해 포트를 지정해야함)
USER 이미지를 어떤 계정에서 실행하는지 지정 (기본적으로 root에서 해준다)
COPY / ADD build 명령 중간에 호스트의 파일 또는 폴더를 이미지에 가져오는 것
(ADD 명령문은 일반 파일 뿐만 아니라 압축 파일이나 네트워크 상의 파일도 사용할 수 있기 때문에, 특수한 파일을 사용하는게 아니라면 일반적으로는 COPY명령어를 사용)
ENV 이미지에서 사용할 환경 변수 값을 지정
CMD 컨테이너를 생성, 실행할 때 실행하는 명령어
ENTRYPOINT 컨테이너를 생성, 실행할 때 실행하는 명령어
CMD와의 차이점으로 docker run 실행 시, 추가적인 명령어의 존재 여부와 상관 없이 무조건 실행되는 명령임

생성한 DockerFiledmf Image로 빌드

# 이미지 빌드 명령어
$ docker build -t [이미지 이름:이미지 버전] [DockerFile의 경로]
# 생성된 이미지 확인
$ docker images

참고자료

= https://wooono.tistory.com/123

= 서적 - 컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커, 길벗 - 제 4장