1. 개요
지금까지의 프로젝트에서 EC2에 서버를 배포하고, CodeDeploy를 이용하여 CI/CD를 구축하였다. Docker를 여태 들어보기는 했으나 사용하지 않던 중 이런 의문이 들었다.
Docker가 대체 뭐길래?
이를 직접 사용하면서 해결하고자, 직접 배포부터 CI/CD까지 구축해보면서 Docker의 장단점을 스스로 깨달아보고자 한다. 해당 게시글은 구구모 프로젝트를 바탕으로 진행하도록 한다.
2. 진행 과정
2-1. BootJar
우선 프로젝트를 빌드하여 실행 가능한 jar 파일을 하나 만든다. 해당 파일을 도커에 올리고, 이를 배포하여 실행하도록 할 것이다.
2-2. Dockerfile
FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","-Dspring.profiles.active=default","app.jar"]
해당 파일은 Dockerfile이라는 이름으로 프로젝트 최상위에 위치해야 한다. 간단히 보자면 다음과 같다.
- FROM openjdk:17: 프로젝트를 실행할 환경
- ARG JAR_FILE=build/libs/*.jar: 변수 선언
- COPY ${JAR_FILE} app.jar: JAR_FILE을 복사하여 app.jar라는 이름으로 생성
- ENTRYPOINT ["java","-jar","-Dspring.profiles.active=default","app.jar"]: 컨테이너가 수행할 명령
2-3 설정
배포의 과정은 다음과 같다.
- 로컬 환경에서 프로젝트를 빌드하여 도커 이미지를 생성한다.
- 1에서 만든 이미지를 레포에 push 한다.
- ec2에서 해당 이미지를 pull한다.
- 이미지를 컨테이너화하여 실행시킨다.
이에 따라 Docker에 가입 후 레포 하나를 만들어주었다.
Docker Desktop을 설치, 로그인 후 터미널에서 docker login을 입력하여 로그인을 진행한다.
2-4 이미지 생성 후 push
docker build -t theperz/gugumo-test .
프로젝트 최상단 위치에서 다음 명령어로 이미지를 생성한다. 해당 명령어는 다음을 의미한다.
Dockerfile로 빌드하여 theperz/gugumo-test라는 이름의 이미지를 만들어 경로 최상단에 저장한다.
docker push theperz/gugumo-test
위에서 생성한 이미지를 레포에 push한다. 이름에 :를 구분자로 태그를 지정할 수 있는데 지정하지 않으면 기본값으로 latest 태그가 지정된다.
2-5 EC2에 pull
해당 명령어를 사용하여 EC2에 도커 이미지를 받아온다.
2-6 필요한 컨테이너 생성 및 설정, 연결
이대로 바로 실행할 수 있으면 좋겠지만 본 프로젝트는 redis, postgresql을 사용한다. 해당 게시글에서는 각 기술 스택에 해당하는 컨테이너를 만들고, 네트워크를 구성하여 실행시키기로 한다. 우선 네트워크를 하나 만들어준다.
docker network create doc-net
doc-net라는 이름의 네트워크를 하나 만들어주었다. 이제 컨테이너를 실행시킬 때 마다 해당 네트워크를 등록해 줄 것이다.
docker run -p 5432:5432 --network doc-net --name test-postgres -e POSTGRES_PASSWORD=root -d postgres:latest
docker exec -it {test-postgres ID 첫 4자}
doc-net에 postgres를 올려 test-postgres라는 이름의 컨테이너를 실행시킨다. postgresql 이미지가 없다면 도커에서 자동으로 받아온다. docker exec를 사용하여 컨테이너에 접속하여 db 초기설정을 진행할 수 있다.
docker run -p 6379:6379 -d redis
redis도 동일한 방식으로 진행해준다. 먼저 올린 컨테이너를 네트워크에 올리려면 다음의 명령어를 입력하여 할 수 있다.
docker network connect {network-name} {container-name}
docker run -d --name gugumo-container --network doc-net -p 8080:8080 theperz/gugumo-test
이제 스프링 컨테이너를 실행시키면 정상 작동하는 것을 확인할 수 있다.
docker logs 를 입력하면 로그를 확인할 수 있다.
3. 다음으로...
가장 간단한 형태의 배포를 진행해보았다. 다음에는 도커와 Git Action을 이용하여 CI/CD를 진행해보도록 하자.
'Docker' 카테고리의 다른 글
Trouble Shooting: 배포 시 env 관리하기 (0) | 2024.12.30 |
---|---|
Docker CI/CD 진행하기 (1) | 2024.12.28 |
Docker-compose 사용하기 (0) | 2024.12.11 |