본문 바로가기
개발/DevOps

Dockerfile을 이용해 Docker image 생성해보자.

by leedonggeun 2023. 12. 4.

Docker

우리는 이번 게시글을 통해 임의의 애플리케이션을 Docker Container로 실행가능하도록 도커 이미지를 생성하는 것을 학습합니다.
검색해보니 도커라이징(Dockerizing)이라고도 하는 것 같은데, 공식적인 단어는 아닌 것 같습니다.


0. 도커 설치하기

당연히 선행되어 도커를 설치해야합니다. 아래의 링크에서 자신의 운영체제에 맞게 접근하여 다운로드/설치를 진행합니다.
https://docs.docker.com/get-docker/

 

1. 테스트할 웹앱 생성하기

가볍게 /hello-world 으로 접근하면 "Hello, World!" 를 반환하는 컨트롤러를 생성해줍니다.

Spring Initializr를 통해 가벼운 웹앱을 만듭니다.
Hello, World를 반환하는 웹앱

 

2. Java Application build하기

먼저, 생성할 도커 이미지에서 사용될 Application Jar를 생성해야합니다.

cd ~/{projectDir}

./gradlew build

ll ~/{projectDir}/build/libs
-rw-r--r--@ 1 dglee  staff   2.4K Dec  4 14:51 practice-0.0.1-SNAPSHOT-plain.jar
-rw-r--r--@ 1 dglee  staff    19M Dec  4 14:51 practice-0.0.1-SNAPSHOT.jar

 

3. Dockerfile 생성/작성하기

애플리케이션이 정상적으로 실행된다면,  이제 Dockerfile을 생성합니다.

# project root directory로 이동
cd ~/{projectDir}

# Dockerfile 생성
touch Dockerfile
FROM amazoncorretto:17-alpine-jdk

LABEL maintainer="LEE DONGGEUN <dglee.dev@gmail.com>"
LABEL version="1.0.0"
LABEL description="Spring Boot Dockerfile Practice"

# JAR_FILE을 application.jar로 복사
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} application.jar

ENTRYPOINT ["java", "-jar", "/application.jar"]
명령어 설명
FROM 기반이 되는 이미지를 설정하는 명령어
Docker Hub와 같은 인증된 레파지토리에서 가져오는 것이 좋습니다.
(저는 amazon의 jdk 17 / alpine linux 기반으로 작성했습니다.)
LABEL 생성하는 이미지의 상세 정보를 표시하기 위한 명령어
KEY=VALUE 형태의 값으로 작성해야합니다.
ARG 이미지를 빌드할 때 사용되는 변수입니다.
여기서는 build된 Jar 파일을 COPY하기 위해 사용됩니다.
COPY 호스트OS의 파일을 컨테이너의 경로에 복사하기 위해 사용됩니다.
여기서는 ~/{projectRootDir}/build/libs/*.jar 를 /application.jar로 복사하게 됩니다.
ENTRYPOINT 컨테이너가 생성되고, 최초로 실행될 때 수행되는 명령어의 모음입니다.
여기서는 "java -jar /application.jar"가 최초에 수행됩니다.

그 외의 명령어는 여기서 확인 후 참조할 수 있습니다.
여기까지 수행했다면, 이제 사전 준비는 모두 완료했습니다.

 

4. Docker image build하기

위에서 생성한 Dockerfile을 통해 빌드를 할 수 있습니다.

cd ~/{projectRootDir}

# 도커 이미지 빌드
docker buildx build -t practice:1.0.0 .

 

빌드되는 과정

명령어 설명
docker docker cli를 사용하기 위한 명령어
buildx ARM 기반의 프로세서(AWS Gravition, Apple Silicon 등)의 등장(?)으로 멀티 플랫폼에서 사용되도록 해주는 명령어
build Docker Image 빌드 명령어
-t Docker Image의 Tag명 입력을 위한 명령어
practice:1.0.0 practice라는 이미지의 이름과 1.0.0이라는 태그로 생성하도록 선언
. 현재 위치에 있는 Dockerfile을 사용하도록 선언

 

5. 빌드된 도커 이미지 확인

docker images

REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
practice     1.0.0     4a0e2733eebd   2 minutes ago   287MB

 

6. 빌드된 도커 이미지 구동

아래와 같이 명령어를 입력합니다.

$ docker run -d -p 8080:8080 --rm --name practice practice:1.0.0

#실행된 컨테이너의 고유값이 표시된다.
b9a858982133596d9ff39d52b336eb3bb2e51fe5825ac54170c65f383c01fb7f


$ docker container ls
CONTAINER ID   IMAGE            COMMAND                  CREATED         STATUS         PORTS                    NAMES
cc7a307f9707   practice:1.0.0   "java -jar /applicat…"   3 seconds ago   Up 3 seconds   0.0.0.0:8080->8080/tcp   practice
명령어 설명
-d --detach, 백그라운드로 컨테이너를 실행하도록 합니다.
-p 8080:8080 컨테이너를 퍼블리싱할 포트를 설정합니다.
앞이 호스트OS의 포트이고, 뒤가 컨테이너의 IP입니다.

즉, 호스트OS 8080에 컨테이너 8080포트를 바인딩해라 입니다.
--rm 컨테이너가 종료될 때 관련된 리소스를 모두 깨끗하게 정리하도록 하는 명령어입니다.
보통 일회성으로 실행하는 컨테이너에서 사용합니다.
--name practice 컨테이너의 이름을 설정합니다.
practice:1.0.0 실행시킬 이미지를 설정합니다.

정상적으로 Container의 STATUS가 Up X seconds로 표시된다면 http://localhost:8080/hello-world에 접근이 잘 되는 것을 볼 수 있습니다.

위에서 복붙한거 아닙니다. 컨테이너로 새로 띄운거에요..

댓글