우리는 이번 게시글을 통해 임의의 애플리케이션을 Docker Container로 실행가능하도록 도커 이미지를 생성하는 것을 학습합니다.
검색해보니 도커라이징(Dockerizing)이라고도 하는 것 같은데, 공식적인 단어는 아닌 것 같습니다.
0. 도커 설치하기
당연히 선행되어 도커를 설치해야합니다. 아래의 링크에서 자신의 운영체제에 맞게 접근하여 다운로드/설치를 진행합니다.
https://docs.docker.com/get-docker/
1. 테스트할 웹앱 생성하기
가볍게 /hello-world 으로 접근하면 "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에 접근이 잘 되는 것을 볼 수 있습니다.
'개발 > DevOps' 카테고리의 다른 글
Dockerfile에 환경변수를 추가해보자. (0) | 2023.12.17 |
---|---|
ChatGPT-4(챗지피티4)를 무료로 사용해보자 - 뤼튼 (0) | 2023.09.14 |
Docker의 Root Directory 위치를 변경해보자. (0) | 2023.04.24 |
Jenkins public key 변경하기 (2) | 2023.04.07 |
개발 서버를 무료로 배포하고 싶을 땐? (0) | 2023.02.27 |
댓글