[Docker] 2.도커 이미지 직접 만들기

어려운 내용이 들어가면 내가 이해하기 어려우니까 도커에 대한 간단한 글

도커 이미지 직접 만들기

도커 이미지는 Dockerfile을 build하여 직접 만들 수 있다.

도커 파일의 예제

# Dockerfile
FROM openjdk:11-jdk-slim as builder
COPY . .
WORKDIR /
RUN chmod +x ./gradlew
RUN ./gradlew bootjar

FROM openjdk:11-jre-slim
COPY --from=builder build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

위 예제는 gradle 프로젝트 전체를 복사하고 이미지 빌드 과정 내부에서 gradle 프로젝트를 빌드하고 실행하기 때문에 굉장히 시간이 오래 소요된다. 보통은 빌드를 한 후 파일을 이미지 빌드에 포함시키는 방법을 사용한다.

# Dockerfile
FROM openjdk:11-jre-slim
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

도커파일도 최적화를 하여야 하며 위 경우 내부에서 빌드가 아닌 실행만 이루어지기 때문에 jdk보다 상대적으로 가벼운 jre 이미지를 사용하였다.

  • FROM <이미지>:<태그> : 정규화 된 Docker 이미지 이름
  • COPY: 지정된 폴더를 컨테이너의 폴더에 복사
  • WORKDIR <경로> : 컨테이너 내부의 현재 디렉토리 변경
  • RUN [“command”, “param1”, … ] : 이미지 빌드 과정에서 필요한 커맨드 실행
  • ENTRYPOINT [“command”, “param1” .. ] : 컨테이너를 실행 할 때 실행되야 하는 커맨드
  • CMD [“command”, “param1”… ] :
  • EXPOSE : 컨테이너가 리스닝할 포트 및 프로토콜 설정. 컨테이너를 실행 할 때 -p 옵션을 통해 포워딩 해주어야 함.
  • ENV: 환경 변수 설정
  • ARG: 이미지 빌드시 넘어올 수 있는 인자 설정

빌드하기

$ docker build [dockerfile 경로]
옵션 설명
–force-rm=false 이미지 생성에 실패 했을 경우 임시 컨테이너 삭제
-no-cahce=false 이전 빌드에서 생성된 캐시를 사용하지 않음. 도커는 기본으로 각 과정을 캐시함
-q, –quiet=false RUN의 실행 출력 결과를 표시하지 않음
–rm=true 이미지 생성에 성공 했을 경우 임시 컨테이너 삭제
-t, –tag=”” 저장소 이름, 이미지 이름, 태그 설정 <저장소>/<이미지>:<태그>

예시

$ docker build -t zkdlu/my_image:v1 .

Docker 로그인

$ docker login -U

Docker Hub에 Push/Pull

Docker hub

$ docker push zkdlu/my_image:v1
$ docker pull zkdlu/my_image:v1