서버를 배포하기 위해, 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 포트를 연결해주어야 한다.

필수적인 도커 명령어 몇 개를 알아보자.
MySQL과 Spring Boot 서버를 도커 상에서 연결하기 위해서는 애플리케이션 서버와 DB 컨테이너가 네트워크를 통해 통신을 해야한다.


MySQL 이미지를 생성할 수 있는 방법은 두 가지이다.
1. MySQL 공식 이미지 pull 받기
2. 호스트 machine에 저장되어 있는 기존 MySQL 이미지를 이용
나는 MySQL 이미지를 처음 받기 때문에 도커에서 mYSQL을 검색하여 pull 받겠다.


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

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

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

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

Gradle bootJar 실행 (jar 파일 생성)

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


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


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

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

이미지들을 모두 완성했으면, 컨테이너를 생성하고 이를 네트워크에 연결해야 한다.
이 과정을 수동으로 명령어를 작성하여 진행하면 컨테이너 수정사항이 생길 때마다 불편하다.
위 명령어들을, docker-compose.yml 파일을 생성하여 docker-compose up 명령어를 통해 간단하게 실행시키도록 하자.
(mysql 컨테이너와 spring boot 컨테이너를 생성하여 spring boot 컨테이너에서 mysql 컨테이너에 접근하는 방식)

DB는 클라우드에!
데이터베이스는 서버 배포랑 같이 컨테이너로 실행시킬 필요 없이 클라우드 환경에 띄어두면 된다! 따라서 해당 간단한 프로젝트에서는 docker-compose 필요없이 spring boot 프로젝트 탑재 과정만 커지면 된다!
즉, 이제부터는 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
빌드 후, 버전 2 이미지를 생성한 후 도커 허브에 올리자.

원래는 로컬 도커에서 먼저 컨테이너를 실행해보는 과정을 거친다. 여기서는 진행하지 않겠다.
먼저, 윈도우 터미널에서 ec2 인스턴스에 접속하자.
참고) https://wookim789.tistory.com/34

윈도우 터미널에서 ssh로 ec2 접속한 모습
그다음, 해당 터미널에서 도커를 설치하고 도커 이미지를 받아오자.








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

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