Docker 개인 정리
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 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 : 포트매핑한 포트번호로 접속해서 잘 실행됐는지 확인할 수 있다.