Dockerfile로 도커 이미지 만들기

동민·2023년 3월 21일
0
post-thumbnail

🚨 스프링 부트 프로젝트를 만드는 과정은 생략합니다.

Docker desktop 설치

도커 설치 관련 문서

  • Mac 또는 Window의 경우 Docker desktop을 설치하면 docker-compose를 따로 설치할 필요없습니다. (리눅스는 별도로 설치해야함)
  • 설치 후 아래 명령어를 입력했을 때, 버전 정보가 나오면 정상적으로 설치 된 상태입니다.
$ docker -v
Docker version 20.10.17, build 100c701

$ docker-compose -v
docker-compose version 1.29.2, build 5becea4c

Spring Boot 프로젝트 설정

1. jar 파일 이름 설정

  • jar 파일의 이름을 가독성이 좋은 이름으로 바꿔줍니다. (생략해도 됩니다!)
  • build.gradle에 아래 코드를 추가하면 해당 이름으로 jar 파일이 생성됩니다.
bootJar{
    archiveFileName = 'pharmacy.jar'
}

2. 프로젝트 빌드

  • 아래 명령어를 통해 프로젝트를 빌드 합니다.
  • 인텔리제이를 사용한다면 gradle 탭에서 build 버튼을 눌러서 진행해도 됩니다.
$ ./gradlew clean build
  • 빌드가 성공하면 build 폴더가 생기고, 아래 경로에 jar 파일이 생성됩니다.
build/libs
├── pharmacy-project-0.0.1-SNAPSHOT-plain.jar
└── pharmacy.jar

3. jar 파일 실행

  • java -jar 명령어로 jar 파일을 실행합니다.
java -jar build/libs/pharmacy.jar 
  • 아래처럼 뜨면 실행 성공! 이제 도커 이미지를 만들어볼 차례입니다~
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.9)
[생략]
2023-03-21 18:09:15.744  INFO 54721 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-21 18:09:15.744  INFO 54721 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 970 ms
2023-03-21 18:09:16.076  INFO 54721 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-03-21 18:09:16.085  INFO 54721 --- [           main] c.f.pharmacy.PharmacyProjectApplication  : Started PharmacyProjectApplication in 1.819 seconds (JVM running for 2.292)

Docker 이미지 생성 & 컨테이너 실행

1. Dockerfile 작성

  • touch Dockerfile 명령어로 Dockerfile을 생성하고, 아래 내용을 추가합니다.
$ FROM openjdk:17-alpine
$ ARG JAR_FILE=build/libs/pharmacy.jar
$ COPY ${JAR_FILE} ./pharmacy.jar
$ ENV TZ=Asia/Seoul
$ ENTRYPOINT ["java", "-jar", "./pharmacy.jar"]
  • FROM: 새로운 이미지를 생성할 때, 기반으로 사용할 이미지를 지정
    • java 기반의 프로젝트이기 때문에 openjdk17 버전을 지정했습니다.
  • ARG: 이미지 빌드 시점에서 사용할 변수 지정
    • jar 파일의 경로를 JAR_FILE 이라는 이름을 가진 변수에 담았습니다.
  • COPY: 호스트에 있는 파일, 디렉토리를 Docker 이미지의 파일 시스템으로 복사
    • jar 파일을 Docker 이미지 안에서 사용할 수 있도록 복사했습니다.
  • ENV: 컨테이너에서 사용할 환경변수 지정
  • ENTRYPOINT: 컨테이너가 실행될 때 실행될 때 항상 실행되어야 하는 명령어 지정
    • 도커 컨테이너를 실행할 때, jar 파일을 실행하도록 하기 위해 작성했습니다.

2. Docker 이미지 생성 & 확인

  • Dockerfile이 있는 위치에서 docker build 명령어를 실행하면, Dockerfile을 읽어서 이미지를 만들어줍니다.
$ docker build -t spring-project-test .
  • 아래 명령어로 생성된 이미지를 확인합니다.
$ docker images
  • 아래 명령어로 컨테이너를 실행합니다.
  • -p: 컨테이너는 기본적으로 외부와 격리되어 있기 때문에, 호스트와 컨테이너 port 포워딩 처리를 통해 외부에서 접속이 가능하도록 해줍니다.
$ docker run spring-project-test -p 8080:8080
  • 컨테이너를 실행하면, 스프링 프로젝트가 실행됩니다!!
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.7.9)

2023-03-21 18:27:55.335  INFO 1 --- [           main] c.f.pharmacy.PharmacyProjectApplication  : Starting PharmacyProjectApplication using Java 17-ea on 55f0ff799e0d with PID 1 (/pharmacy.jar started by root in /)
2023-03-21 18:27:55.345  INFO 1 --- [           main] c.f.pharmacy.PharmacyProjectApplication  : No active profile set, falling back to 1 default profile: "default"
2023-03-21 18:27:57.780  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2023-03-21 18:27:57.803  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-03-21 18:27:57.804  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.71]
2023-03-21 18:27:57.969  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-03-21 18:27:57.969  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2499 ms
2023-03-21 18:27:58.784  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-03-21 18:27:58.803  INFO 1 --- [           main] c.f.pharmacy.PharmacyProjectApplication  : Started PharmacyProjectApplication in 4.608 seconds (JVM running for 5.303)
profile
Backend engineer

0개의 댓글