공부

Docker 개인 정리

맴썰 2024. 8. 15. 00:07

Springboot 프로젝트를 진행하면서 docker를 이용한 배포를 진행해보고 싶어서 docker를 사용하는 과정을 정리해보고자 한다.

 

1. Docker Desktop 설치

https://www.docker.com/products/docker-desktop/ 에서 설치

docker hub 회원가입 및 로그인

 

2. IntelliJ -> 프로젝트 오픈 -> terminal

프로젝트 루트 디렉토리 확인

  - docker login -u [userId] 명령어 입력 -> Password 입력

   - login succeeded 확인

3. Dockerfile 작성

 

Docker는 컨테이너라고 불리는 가상 플랫폼을 제공해주고, 나는 그 컨테이너에 실행가능한 jar파일을 올려서 실행하는 것을 목적으로 하고 있다.

필요요소 1) 실행가능한 jar file 

 

Intellij 우측의 Gradle menu 클릭 -> Tasks -> build -> bootJar 더블클릭

프로젝트 루트 -> build -> libs에 jar 파일 생성 확인

 

프로젝트 루트 우클릭 -> new -> file -> Dockerfile 생성 (대소문자 구별함 -> 대문자는 Dockerfile에서 D만! DockerFile X)

 

# file명 = Dockerfile

# JDK Image Start
FROM openjdk:17


# application 프로필 분리 -> Oracle ATP DB 접근을 위한 wallet 위치 때문에 프로필 분리 
ENV SPRING_PROFILES_ACTIVE=docker 
ENV CLASSPATH=/app/app.jar


# 인자 설정 - JAR_File
ARG JAR_FILE=build/libs/[jar file name].jar

# jar 파일 복제
COPY ${JAR_FILE} /app/app.jar

# wallet 폴더 -> 컨테이너 내부 경로로 이동
COPY src/main/resources/wallet /app/wallet

# 실행 명령어
ENTRYPOINT ["java", "-jar", "/app/app.jar"]

EXPOSE 8080

 

요약하면 JDK버전은 17이며 build/libs 하위에 있는 jar file을 도커 컨테이너 내부 /app/app.jar로 이동시키고, 

src/main/resources 하위에 있는 wallet이라는 폴더를 도커 컨테이너 내부 /app/wallet으로 이동시킨다.

 

그 후 컨테이너가 가동되면 ENTRYPOINT 구문이 실행되는데, "java -jar /app/app.jar" 명령어를 실행시킨다고 보면 된다. 

따라서 컨테이너를 가동하면 실행가능한 jar 파일을 실행시켜 springboot 프로젝트를 가동해준다. 

 

 

4. docker image build

아까 켜놓은 Intellij 터미널에서 해당 명령어를 수행한다

docker build -t [username]/[imagename] .
# -t -> 이미지에 태그 (닉네임)을 붙임 
#username : docker hub Id
#imagename : 원하는 이미지 이름

# . : Dockerfile 위치 -> .은 루트경로를 의미

 - username과 docker hub Id가 불일치하면 push가 불가능하다.

이런 메세지가 뜨면 성공이다.

 

 

 

Docker Desktop에 접속하고, Images -> Local에서 빌드한 이미지를 확인할 수 있다.

 

5. Docker Hub에 push

 형상관리 시 Local Change를 외부 컴퓨터에서 확인 못하듯이, 로컬 이미지는 다른 컴퓨터, 세션에서 접근할 수 없다.

따라서 Docker Hub에 업로드해서 외부 접근이 가능하게 만들어준다.

docker push [username]/[imagename] -> docker hub에 push

이렇게 Docker Desktop에서 push한 정보를 확인할 수 있다. 

이제 외부에서도 접근이 가능한 상태가 되었다. 

다른 컴퓨터에서 내려받아 컨테이너에 올려 실행해도 되고, 나처럼 AWS나 Oracle Cloud에서 배포 테스트를 수행해도 된다.

 

내려받을 때는 docker pull [username]/[imagename]으로 Docker hub에 있는 이미지를 로컬 이미지로 다운받을 수 있다.

 

6. ubuntu 접속 후 docker download

나는 oracle cloud를 이용해서 ubuntu 기반의 서버를 가동했고, mobaXterm을 이용해 ssh로 접속했다.

sudo apt-get update
sudo apt install -y docker.io

 접속 후 위 명령어를 실행하여 도커를 우분투 환경에 설치한다.

 

7. docker login 및 image pull

IntelliJ 터미널에서 했던 것과 동일하게 로그인을 진행해준다.

아까 로컬환경에서 빌드하고 hub에 올려둔 이미지를 우분투 환경의 로컬 이미지로 pull한다.

 

docker images

위 명령어를 통해 우분투 로컬 이미지 목록을 불러오고, 방금 pull 받은 이미지가 있는지 확인한다.

 

8. docker run

 

docker run -d -p 8080:8080 [username]/[imagename]:latest 

-d -> background 실행
-p 8080:8080 -> host 8080포트를 컨테이너의 8080포트에 매핑
 [username]/[imagename]:latest  -> 이미지명

docker ps 명령어를 통해 현재 실행중인 프로세스 세부정보를 확인할 수 있다.

sudo docker logs --tail 100 -f [containername]

위 명령어를 통해 통상적으로 로그파일을 읽을 때 쓰는 tail -f 기능을 docker 컨테이너 log에 적용할 수 있다.

 

"docker ps -q" 명령어로 컨테이너명만을 알아내고, 상기한 로그 명령어로 로그를 보는게 편한 것 같다.

 

로그를 통해 정상적으로 웹 어플리케이션이 실행됐으면, 클라우드 서버의 고정 IP : 포트매핑한 포트번호로 접속해서 잘 실행됐는지 확인할 수 있다.