MySQL과 스프링부트 서버를 Docker를 이용해 배포하기

강연주·2023년 11월 6일

도커를 왜 사용하나?

서버를 배포하기 위해, AWS EC2 가상서버에 나의 노트북 서버 환경과 동일하게 셋팅하는 과정이 필요했다.

하지만, 컨테이너로 필요한 환경을 구성한 후 도커 이미지를 만들어 배포하면 해당 이미지를 기반으로 컨테이너를 생성하여 사용하기만 하면 되므로 쉽게 서버 배포가 가능하다!

컨테이너는 이와 같이 어플리케이션과 그 의존성을 패키징(by 도커 이미지)하여 해당 애플리케이션을 독립적으로 실행할 수 있는 환경을 제공하는 기술이다. 즉, "나의 로컬에서는 동작하는데 왜 배포환경에서는 동작하지 않는가?"라는 흔한 문제를 해결해준다. 우리는 AWS EC2에서 별도의 환경 셋팅 없이 docker run (내가 만든 이미지), docker run (DB 관련 이미지)의 간단한 몇 줄로 실행이 가능하다.

도커 설치

내 컴퓨터에 있는 Spring Boot 프로젝트를 이미지로 생성하고 도커 허브에 올리기 위해서는 윈도우에 도커를 깔아야한다. Docker는 리눅스를 기반으로 하기 때문에, 윈도우 환경에서 VM과 같은 도구 없이 리눅스를 사용할 수 있도록 도와주는 WSL2를 활성화해서 Docker를 실행시키자.

자세한 윈도우용 도커 설치방법은 아래 사이트를 참고하자.
https://axce.tistory.com/121

도커 이미지 빌드

이미지를 만드는 방법은 1. 커밋 2. Dockerfile에 원하는 이미지를 기술하여 그것을 빌드하여 만드는 방법 두 가지가 있다. 커밋을 사용하면 어떤 내용인지 알 수 없으므로, 체계적으로 이미지를 만들기 위해서는 Dockerfile이라는 파일을 만들어서 이미지를 빌드하고, 이를 도커 허브에 공유하자.

도커 네트워크

기본적인 웹 실행은 다음과 같이 두 대의 컴퓨터에서 실행이 된다. 아래는 웹 브라우저가 설치된 클라이언트가 웹 서버가 설치되어 있는 서버 컴퓨터에 80포트로 요청이 들어오는 과정이다.

도커에서는 컨테이너와 호스트가 독립적인 환경이기 때문에 포트도 따로 가지고 있다. 클라이언트가 호스트의 80 포트에 접근한다면, 웹 서버에 도달하지 못한다. 따라서 도커 네트워크를 통해 호스트의 80포트와 컨테이너의 80 포트를 연결해주어야 한다.

도커 명령어

필수적인 도커 명령어 몇 개를 알아보자.

  1. 컨테이너 관련 명령어
  • 도커 컨테이너 실행 : docker container run {이미지명}
  • 도커 컨테이너 실행 + 컨테이너 내부 터미널 접속 : docker container run --interactive --tty {이미지명}
  • 백그라운드 실행 + 호스트 포트와 연결하여 웹 호스팅 : docker container run --detach --publish {호스트 포트번호}:{컨테이너 포트번호} {이미지명}
  1. 이미지 관련 명령어
  • 도커 이미지 다운로드 : docker image pull {이미지명}
  • 도커 이미지 빌드 : docker image build --tag {이미지 별명} .
  • 도커 이미지 도커 허브에 공유(push)
    (1) 도커 허브 로그인 : docker login --username {도커 username}
    (2) 기존 도커 이미지에 대한 새로운 태그 생성 : docker image tag {기존 이미지명} {바꿀 이미지명}
    (3) 도커 허브에 공유(push) : docker image push {도커 username}/{이미지명}:{버전}
  1. 도커 네트워크 관련 명령어
  • 도커 네트워크 생성 : docker network create {네트워크명}
  • 사용자 정의 네트워크에 연결하여 컨테이너 생성 : docker container run --network {네트워크명} {이미지명}
  1. 도커 컴포즈 관련 명령어
  • 도커 컴포트 실행 : docker-compose up
  • 서비스 시작 : docker-compose start
  • 애플리케이션 중지+삭제 : docker-compose down

DB서버와 애플리케이션서버 배포

1. 도커 네트워크 생성

MySQL과 Spring Boot 서버를 도커 상에서 연결하기 위해서는 애플리케이션 서버와 DB 컨테이너가 네트워크를 통해 통신을 해야한다.

2. MySQL 이미지 생성

MySQL 이미지를 생성할 수 있는 방법은 두 가지이다.
1. MySQL 공식 이미지 pull 받기
2. 호스트 machine에 저장되어 있는 기존 MySQL 이미지를 이용

나는 MySQL 이미지를 처음 받기 때문에 도커에서 mYSQL을 검색하여 pull 받겠다.

3. Spring Boot 탑재

DB를 이미지로 만들었으니, 이제는 서버를 이미지로 변환하자.
1. Dockerfile 이란 파일을 프로젝트 폴더에 생성

2. Dockerfile 내부를 다음과 같이 작성

FROM <이미지명>:<태그>
: Docker 베이스 이미지. 즉, openjdk 이미지 17버전을 베이스 이미지로 지정.
ARG
: 변수 선언. 즉, JAR_FILE을 *.jar파일로 지정
COPY [원본 경로][복사경로]
: 호스트의 파일 또는 디렉토리를 도커 이미지로 복사 . 즉, JAR_FILE을 도커 이미지의 app.jar로 복사
ENTRYPOINT
: 컨테이너 시작 시 스크립트 실행. 즉, 관련 자바파일(서버)을 실행

  1. Gradle Clean 실행

  2. build.gradle에 아래의 코드 작성 후 gradle 업데이트

  3. Gradle bootJar 실행 (jar 파일 생성)

  4. docker build -t {이미지명} . 명령으로 이미지 생성

4. Docker Hub에 올려 공유하기

필요한 도커 이미지를 모두 생성하였으므로, 이제 이 이미지들을 공유하여 다른 호스트에서도 같은 이미지를 사용할 수 있도록 하자.
아이디:yeonjookang
비밀번호:풀12샵

새로 생성된 이미지를 Docker Hub에 올리자.

Docker Hub에 올라간 것을 볼 수 있다.

5. Docker-Compose 작성

이미지들을 모두 완성했으면, 컨테이너를 생성하고 이를 네트워크에 연결해야 한다.
이 과정을 수동으로 명령어를 작성하여 진행하면 컨테이너 수정사항이 생길 때마다 불편하다.

  • Spring Boot 이미지 컨테이너 생성:
    docker run -p 8080:8080 --name [컨테이너명] --network [네트워크명] -d [도커이미지]
  • MySQL 이미지 컨테이너 생성:
    docker run --name [컨테이너명] -p 3306:3306 --network [도커 네트워크명] -e MYSQL_ROOT_PASSWORD=[MySQL Root사용자 비밀번호] -e MYSQL_DATABASE=[db명] -e MYSQL_USER=[DB사용자명] -e MYSQL_PASSWORD=[User비밀번호] -d mysql:[버전]

위 명령어들을, docker-compose.yml 파일을 생성하여 docker-compose up 명령어를 통해 간단하게 실행시키도록 하자.
(mysql 컨테이너와 spring boot 컨테이너를 생성하여 spring boot 컨테이너에서 mysql 컨테이너에 접근하는 방식)

DB는 클라우드에!
데이터베이스는 서버 배포랑 같이 컨테이너로 실행시킬 필요 없이 클라우드 환경에 띄어두면 된다! 따라서 해당 간단한 프로젝트에서는 docker-compose 필요없이 spring boot 프로젝트 탑재 과정만 커지면 된다!

6. Spring Boot + AWS RDS 연동하기

즉, 이제부터는 MySQL 이미지를 컨테이너화하는 과정이 아닌, 클라우드에 AWS RDS를 띄워두고, Spring Boot 컨테이너에서 해당 클라우드 DB에 접근하는 방식을 이용할 것이다.

먼저, AWS RDS 데이터베이스를 생성하여 Spring Boot 프로젝트에 연결시켜준다.

참고) https://velog.io/@u-nij/Spring-Boot-AWS-RDS-MySQL-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0

7. 수정된 Spring Boot 이미지 새로 만들기

빌드 후, 버전 2 이미지를 생성한 후 도커 허브에 올리자.

8. 로컬에서 컨테이너 실행해보기(테스트)

원래는 로컬 도커에서 먼저 컨테이너를 실행해보는 과정을 거친다. 여기서는 진행하지 않겠다.

9. AWS EC2에서 Spring Boot 이미지 받아오기

먼저, 윈도우 터미널에서 ec2 인스턴스에 접속하자.
참고) https://wookim789.tistory.com/34

윈도우 터미널에서 ssh로 ec2 접속한 모습

그다음, 해당 터미널에서 도커를 설치하고 도커 이미지를 받아오자.







그 다음, 내가 도커 허브에 올려놓은 Spring Boot 이미지를 받자.

그 다음, 호스트(80)과 컨테이너(8080)을 연결하여 백그라운드로 컨테이너를 실행시키자.(톰캣 첫 실행 시 localhost:8080으로 접속하므로 컨테이너로 8080로 연결)

요청 성공!!

profile
백엔드 개발자 준비중

0개의 댓글