FROM openjdk:16-jdk
// 어떤 자바 버전을 사용할 것인지. 실행되고 있는 jdk버전과 동일하게 해야 오류가 발생하지않음.LABEL maintainer="email"
// 도커 이미지를 누가 관리하는지. 임의로 작성해도됨ARG JAR_FILE=build/libs/*.jar
// JAR_FILE이라는 변수를 정의함 .jar의 위치를 저장하기 위한 변수명이다. 빌드 파일의 경로도 설정해준다.ADD ${JAR_FILE} docker-springboot.jar
//JAR_FILE 변수에 도커 이미지로 사용할 이름을 입력함ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/docker-springboot.jar"]
// 컨테이너 실행 시 반드시 실행될 명령어를 입력합니다. []로 여러 명령어를 지정할 수 있습니다.bootJar
로 build => build 디렉토리가 생성됨[ docker build -t docker-springboot . ]
=> 인텔리제이 터미널에 해당 명령어를 통해 도커 이미지 생성[ docker run -p 5000:8080 docker-springboot ]
=> 인텔리제이 터미널에 해당 명령어를 통해 도커 이미지 실행먼저 cmd에 ipconfig를 통해 IP주소와 기본게이트웨이주소를 확인한다.
여기서 게이트웨이주소를 주소창에 입력해서 접근하면 IPTIME관리자 홈페이지로 이동한다.
IPTIME관리자 홈페이지 > 관리도구로 이동한다. => 시스템 요약 정보 내 외부IP주소(119.192.89.21)를 확인한다.
외부접속포트와 내부 포트를 연결해줌.
고급설정 > NAT/라우터관리 > 포트포워드 설정 => 새 규칙 추가
고급설정 > NAT/라우터관리 > 고급NAT 설정 => DMZ로 선택 후 내부 IP주소 입력하고 적용 선택
외부에서 접속할 수 있게 포트를 열어줘야함.
윈도우 검색창 > 방화벽 및 네트워크 보호 > 고급설정 > 인바운드 규칙 > 새 규칙 > 포트 > TCP 및 특정 로컬포트 선택 후 포트번호(ex.6112) > 연결 허용 > 도메인,개인,공용 선택 후 다음 > 이름 및 설명 적고 마침
=> 이렇게하면 내부IP주소에 대한 외부포트개방이 된것이다.
=> 외부(폰 & 데이터모드)에서 119.192.89.21:6221/hello 로 접근 시 접근이 가능하다.
=> 외부에서 포트포워딩을 통해 접근할때, 폰으로 접근하든 다른 컴퓨터로 접근하든 프로그램을 실행하고 있는 컴퓨터의 외부ip주소로 접근하는것이다.
참고
Dockerfile을 최적화하는 것은 도커 이미지를 효율적으로 빌드하고 실행하기 위해 중요한 작업입니다. 최적화를 통해 이미지 크기를 줄이고 빌드 속도를 개선할 수 있습니다.
- 적절한 베이스 이미지를 사용해라.
- 단계 병렬 실행
- 불필요한 파일 제거
- 적절한 순서로 명령어 작성
- 멀티 스테이지
openjdk
와 같은 베이스 이미지가 있다. 도커 이미지를 더욱 효율적으로 빌드하고 관리하기 위해 사용되는 기술
이다. 이를 통해 불필요한 파일과 의존성을 제거하며, 최종 이미지의 크기를 최적화 할수 있다.빌드스테이지
와 실행스테이지
부분으로 나누어서 작성한다.기존에 있던 Dockerfile을 최적화 해보자.
# Build Stage
FROM openjdk:16 AS build
LABEL maintainer="email"
WORKDIR /app
COPY . .
RUN ./gradlew build
# Final Stage
FROM openjdk:16-jdk
LABEL maintainer="email"
ARG JAR_FILE=/app/build/libs/*.jar
COPY --from=build ${JAR_FILE} /docker-springboot.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/docker-springboot.jar"]
FROM: 도커 이미지의 기반이 되는 베이스 이미지를 지정합니다. 모든 Dockerfile은 FROM으로 시작해야 한다.
예를 들어, FROM ubuntu:20.04는 Ubuntu 20.04를 베이스로 하는 이미지를 생성하겠다는 의미입니다.
LABEL: 이미지에 메타데이터를 추가하는 데 사용됩니다. 주석이나 버전 정보 등을 포함하여 이미지에 대한 정보를 추가할 수 있습니다.
예를 들어, LABEL maintainer="your-email@example.com"는 이미지의 유지 관리자 이메일 주소를 추가합니다.
WORKDIR: 작업 디렉토리를 설정합니다. 컨테이너 내에서 실행되는 명령어들의 기본 작업 디렉토리를 지정합니다.
예를 들어, WORKDIR /app은 /app 디렉토리를 작업 디렉토리로 설정합니다.
COPY: 파일이나 디렉토리를 이미지 내에 복사합니다. 호스트 파일 시스템의 파일을 이미지 내의 경로로 복사하여 추가할 수 있습니다.
예를 들어, COPY app.jar /app은 호스트의 app.jar 파일을 이미지의 /app 디렉토리로 복사합니다.
RUN: 컨테이너 내에서 명령어를 실행합니다. 명령어는 셸에서 실행되며, 이미지 내에 패키지 설치, 설정 변경 등의 작업을 수행하는 데 사용됩니다.
예를 들어, RUN apt-get update && apt-get install -y curl은 패키지 업데이트와 curl 패키지 설치를 수행합니다.
ARG: 빌드 타임에 전달되는 인수(argument)를 정의합니다. 주로 이미지 빌드 시에 변수를 전달하여 동적인 설정을 가능하게 합니다.
예를 들어, ARG VERSION=latest는 이미지 빌드 시에 VERSION 변수를 지정할 수 있습니다.
ENTRYPOINT: 컨테이너가 실행될 때 기본 실행 명령어를 정의합니다. 컨테이너가 시작될 때마다 실행될 실행 파일이나 스크립트를 지정할 수 있습니다.
예를 들어, ENTRYPOINT ["java", "-jar", "app.jar"]은 컨테이너가 실행될 때 java -jar app.jar 명령어를 실행합니다.
하지만 이렇게 수정하고나서, 도커이미지를 생성하려고하니 오류가 발생했다.
Gradle 빌드 단계에서 문제가 발생한 것이고, 이러한 오류는 다양한 이유로 발생할 수 있어서 해결방법을 찾아보았는데 모르겠다..
그래서 단순히 빌드 오류를 무시하고 빌드 과정을 계속 진행하도록 하는 코드로 바꿨더니 오류없이 빌드가 잘되었다.
RUN ./gradlew build
==> RUN gradle build continue > /dev/null 2>&1 || true
또는 RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true
RUN gradle build continue > /dev/null 2>&1 || true
gradle build
: gradle 빌드를 실행continue
: 빌드오류가 발생하더라도 중단하지않고 빌드를 계속 진행한다.> /dev/null 2>&1
: 표준 출력(프로그램의 실행상태, 결과, 메시지)과 표준오류(오류메시지, 디버깅 정보)를 무시하기 위한 코드이다.|| true
: 이전 명령이 실패할 경우에도 스크립트(도커파일)을 중단하지않고 계속 실행하도록 하는 부분이다.
RUN gradle build -x test --parallel --continue > /dev/null 2>&1 || true
gradle build
: gradle 빌드를 실행-x test
: Gradle 빌드 시에 테스트를 실행하지 않도록 설정--parallel
: 빌드 작업을 병렬로 실행하도록 합니다.continue
: 빌드오류가 발생하더라도 중단하지않고 빌드를 계속 진행한다.> /dev/null 2>&1
: 표준 출력(프로그램의 실행상태, 결과, 메시지)과 표준오류(오류메시지, 디버깅 정보)를 무시하기 위한 코드이다.|| true
: 이전 명령이 실패할 경우에도 스크립트(도커파일)을 중단하지않고 계속 실행하도록 하는 부분이다.
이런 다음, docker run -p 5000:8080 docker-springboot
를 실행해보면 도커이미지 실행까지 잘 되는것을 확인할수 있다.