- 서버 환경 : Ubuntu 24.04 LTS (GNU/Linux 6.8.0-1012-aws x86_64)
- MySQL : 8.0.32
- 스프링부트 : 3.3.3
- Redis : latest(24.8.26 기준)
EC2에 Docker, Docker Compose 설치
sudo apt-get update && \
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && \
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && \
sudo apt-key fingerprint 0EBFCD88 && \
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && \
sudo apt-get update && \
sudo apt-get install -y docker-ce && \
sudo usermod -aG docker ubuntu && \
newgrp docker && \
sudo curl -L "https://github.com/docker/compose/releases/download/2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && \
sudo chmod +x /usr/local/bin/docker-compose && \
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
정상적으로 설치되었는지 확인
docker -v # Docker 버전 확인
docker compose version # Docker Compose 버전 확인
AWS ECR 설치
필자는 Mac OS를 사용중이므로 맥 기준으로 설명
로컬 PC에 AWS ECR 설치
brew install awscli
aws --version # 잘 출력된다면 정상 설치된 상태
EC2에도 AWS ECR 설치
sudo apt install unzip
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version # 잘 출력된다면 정상 설치된 상태
IAM 생성
사용자 생성
액세스 키 발급
액세스 키와 비밀 액세스 키는 따로 적어놓거나 보관해두어야 한다.
AWS CLI로 액세스 키 등록
$ aws configure
AWS Access Key ID [None]: <위에서 발급한 Key id>
AWS Secret Access Key [None]: <위에서 발급한 Secret Access Key>
Default region name [None]: ap-northeast-2
Default output format [None]:
로컬 PC에서 등록
EC2에서 등록
AWS EC2에 Spring Boot 배포
Docker 파일 작성
FROM openjdk:17-jdk
WORKDIR /spring-boot
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/spring-boot/app.jar"]
이미지 빌드 및 Push
Amazon Elastic Container Registry
Mac에서
먼저 스프링 부트를 빌드 하고, 4개의 항목에 대해서 터미널에 입력한다.
맥 사용자는 도커 이미지를 빌드할 때, --platform linux/amd64 를 붙혀주는 것을 잊지 말자.
#스프링부트 빌드
./gradlew clean build
#로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com
#--platform linux/amd64를 추가적으로 붙여준다(linux/amd64 플랫폼 지정)
docker build --platform linux/amd64 -t instargram-server .
#instargram-server:latest 이미지를 ECR 레포지토리에 맞는 태그로 재태깅함.
docker tag instargram-server:latest 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest
#ECR로 푸시
docker push 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest
Amazon Elastic Container Registry
이미지가 생긴 것을 확인할 수 있다.
이후 URI를 복사해둔다.
EC2에서 아래의 명령어를 입력한다.
#로그인
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com
docker pull <이전에 복사한 URI>
docker image ls
docker run -d -p 8080:8080 <image ls 확인한 명령어로 이미지 리포지토리 명>
<image ls 명령어로 이미지 리포지토리 명 확인 후 실행>
전체 과정
이후 EC2의 퍼블릭 아이피로 접속하면 스프링부트 프로젝트가 정상적으로 구동하고 있는 것을 확인할 수 있다.
Docker Compose를 이용한 SpringBoot + MySQL + Redis 배포
폴더를 하나 생성 후 vim 편집기로 compose 파일의 내용을 정의해준다.
#Vim 편집기로 Compose 파일 수정
vi compose.yml
services:
instagram-server:
image: <이전에 입력한 URI>
ports:
- 8080:8080
depends_on:
my-db:
condition: service_healthy
my-cache-server:
condition: service_healthy
my-db:
image: mysql:8.0.32
environment:
MYSQL_ROOT_PASSWORD: <사용자정의 비밀번호>
MYSQL_DATABASE: mydb
volumes:
- /home/ubuntu/mysql_data:/var/lib/mysql
ports:
- 3306:3306
healthcheck:
test: [ "CMD", "mysqladmin", "ping" ]
interval: 5s
retries: 10
my-cache-server:
image: redis
ports:
- 6379:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
- instagram-server:
-이미지: <이전에 입력한 URI>
이 Docker 이미지가 AWS ECR에 저장되어 있다. Docker Compose는 이 이미지를 사용하여 컨테이너를 시작한다.
-포트: 8080:8080
로컬 머신의 포트 8080을 컨테이너의 포트 8080에 매핑하여 외부에서 웹 애플리케이션에 접근할 수 있도록 한다.
-의존성(depends_on):
my-db와 my-cache-server가 service_healthy 조건을 만족할 때까지 이 서버는 시작되지 않는다. 이는 서비스가 실행되는 순서를 정의한다. - my-db:
-이미지: mysql
mysql 이미지를 사용하여 MySQL 데이터베이스를 설정한다.
-환경 변수:
MYSQL_ROOT_PASSWORD: MySQL의 루트 비밀번호를 설정한다.
MYSQL_DATABASE: mydb라는 데이터베이스를 생성한다.
-볼륨:
./mysql_data:/var/lib/mysql: 로컬 디렉토리 ./mysql_data를 컨테이너의 MySQL 데이터 디렉토리 /var/lib/mysql에 마운트하여 데이터를 유지한다.
-포트: 3306:3306
로컬 머신의 포트 3306을 컨테이너의 MySQL 포트 3306에 매핑한다.
-헬스체크:
MySQL이 정상적으로 실행되고 있는지 확인하기 위해 mysqladmin ping 명령을 사용하여 상태를 주기적으로 체크한다. - my-cache-server:
-이미지: redis
Redis 이미지를 사용하여 캐시 서버를 실행한다.
-포트: 6379:6379
로컬 머신의 포트 6379를 컨테이너의 Redis 포트 6379에 매핑한다.
-헬스체크:
redis-cli ping 명령을 사용하여 Redis가 정상적으로 실행 중인지 확인한다.
이후 Compose를 실행시켜야 한다.
docker compose up -d --build
스프링 부트, mysql, redis가 모두 정상적으로 실행되고 있는 것을 확인할 수 있다.
프로젝트 업데이트시 유지보수
프로젝트를 운영하면서 프로젝트의 변경사항이 있다고 가정하자.
./gradlew clean build
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com
docker build --platform linux/amd64 -t instargram-server .
docker tag instargram-server:latest 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest
docker push 420787877062.dkr.ecr.ap-northeast-2.amazonaws.com/instargram-server:latest
위 코드는 이전에 언급했던 명령어이다.
다시 이 코드를 입력하여 AWS CLI에 푸시한다.
새로운 이미지가 추가된 것을 확인할 수 있다.
이제 아래의 명령어를 이용하여 compose 파일에 작성되어 있는 이미지를 업데이트 시킨다.
docker compose pull
docker compose up -d --build
'Cloud > Docker' 카테고리의 다른 글
[Docker] 이미지 레지스트리 (3) | 2024.09.07 |
---|---|
[Docker] 이미지와 컨테이너 (0) | 2024.09.06 |
[Docker] 하이퍼바이저 및 컨테이너 가상화와 도커 아키텍쳐 (0) | 2024.09.05 |
[Docker] Docker Compose를 이용한 SpringBoot + MySQL + Redis 컨테이너 동시에 띄우기 (0) | 2024.08.26 |
[Docker] Spring Boot 프로젝트를 Docker 이미지로 만들기 (0) | 2024.08.25 |