## 📌 EC2 + Docker + MariaDB + Spring Boot 배포 복습 ### 1. EC2 인스턴스 생성 - Ubuntu 22.04 LTS 선택 - 보안 그룹에서 인바운드 규칙: SSH(22), HTTP(80), MySQL(3306) 등 필요한 포트 오픈 - 키 페어 생성 (keykey.pem) <img width="500" alt="Image" src="https://github.com/user-attachments/assets/7eaaf023-26fd-42fc-a101-5b06ae9f29f8" /> <img width="1449" alt="Image" src="https://github.com/user-attachments/assets/bc534e04-8ccc-45d7-8d91-31a163f02273" /> ### 2. EC2 인스턴스 접속 ```bash chmod 400 *.pem ssh -i "keykey.pem" ubuntu@ec2-13-209-35-195.ap-northeast-2.compute.amazonaws.com ``` <img width="1007" alt="Image" src="https://github.com/user-attachments/assets/af0f33a3-08db-477f-9a4d-36b2de3cc8f1" /> - 네트워크 확인 ```bash ping 8.8.8.8 curl ifconfig.me ``` ### 3. Docker 설치 (공식 가이드 기반) ```bash # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` - 설치 확인 ```bash docker --version docker compose version sudo docker run hello-world ``` - sudo 없이 docker 명령어 사용 ```bash sudo gpasswd -a $USER docker sudo service docker restart sudo su - su - ubuntu # 다시 일반 계정으로 돌아가기 ``` ### 4. MariaDB 설치 (Docker) - [공식 도커 허브 문서](https://hub.docker.com/_/mariadb) 참고 ```bash docker run -d -p 3306:3306 --name db -e MARIADB_ROOT_PASSWORD=rootpass -e MARIADB_DATABASE=mydb mariadb:latest ``` <img width="1142" alt="Image" src="https://github.com/user-attachments/assets/0720afb1-3f78-4ed6-aaea-0d30d54f3cab" /> ### 5. DBeaver 연결 실패 원인 및 해결 연결 실패 원인 - AWS 보안 그룹에서 3306 포트가 열려있지 않음 <img width="1093" alt="Image" src="https://github.com/user-attachments/assets/26e83690-9ab0-4093-881f-a655c961f4e0" /> <img width="1193" alt="Image" src="https://github.com/user-attachments/assets/14d0237b-6f92-4012-ada7-1adbe2224d40" /> 해결 방법 1. EC2 대시보드 → 보안 → 보안 그룹 2. 인바운드 규칙 → 편집 3. 규칙 추가: - 유형: MySQL/Aurora - 포트 범위: 3306 - 소스: 내 IP 또는 0.0.0.0/0 (공개 허용) <img width="1203" alt="Image" src="https://github.com/user-attachments/assets/8b4fe966-c883-450c-92e5-6c68bdac4497" /> <img width="1375" alt="Image" src="https://github.com/user-attachments/assets/0c6ddf51-a9a2-4717-b599-4b1b791fedb5" /> - 연결 성공! <img width="926" alt="Image" src="https://github.com/user-attachments/assets/6b560334-e2c2-4267-ab40-0b496fdc3252" /> ### 6. Spring Boot 프로젝트 (boot-cloud-step3) 빌드 및 실행 ```bash git clone https://github.com/soheeGit/boot-cloud-step3.git cd boot-cloud-step3 docker build -t step3 . docker run -d -p 80:8080 --name step3 -e DB_URL=jdbc:mariadb://13.209.35.195:3306/mydb -e DB_USERNAME=root -e DB_PASSWORD=rootpass step3 ``` ### 7. 실행 실패 - RDS로 전환 💀 죽었다. 잘가~ --- ## 📌 RDS 반영 (MariaDB RDS 사용하여 Spring Boot 연결) ### 1. AWS RDS 인스턴스 생성 1. AWS 콘솔 → RDS → 데이터베이스 생성 2. 엔진 선택: MariaDB 3. 템플릿: 프리 티어 사용 가능 선택 4. 설정 - DB 식별자: database-1 - 마스터 사용자 이름: admin - 비밀번호: y7ZaAcFbZPqXOtYpy74O (예시, 노출주의) 5. DB 인스턴스 옵션 - 퍼블릭 액세스: 예 (Yes) (배포 목적이면 외부 접속 가능해야 함) - 가용 영역 등은 기본값 사용 6. VPC 보안 그룹: EC2와 동일한 보안 그룹 설정 - 인바운드 규칙: 포트 3306, 소스 EC2 IP 또는 0.0.0.0/0 (테스트 시) <img width="1355" alt="Image" src="https://github.com/user-attachments/assets/e2fbd5bf-29f8-4350-933d-200690b755a8" /> <img width="559" alt="Image" src="https://github.com/user-attachments/assets/abec4570-bed2-43a3-916a-6f5cdaacc19c" /> <img width="552" alt="Image" src="https://github.com/user-attachments/assets/66e1b69b-adca-4b8e-9912-36424b997c81" /> <img width="553" alt="Image" src="https://github.com/user-attachments/assets/a5168bb8-fbb0-4525-a6e9-aaed514bcdc4" /> <img width="1162" alt="Image" src="https://github.com/user-attachments/assets/ec35ed36-7cc1-45a0-864f-ca4d6742fa8a" /> - 둘만의 관계 생성 <img width="1196" alt="Image" src="https://github.com/user-attachments/assets/39a7a7db-f5ef-428c-943c-d69b96392be9" /> <img width="828" alt="Image" src="https://github.com/user-attachments/assets/8abe02f1-f1b7-4ab9-a09d-1707d9327c7d" /> ### 3. 보안 강화를 위한 접근 제한 설정 - 필요 시 RDS 인스턴스를 퍼블릭 비활성화 - 또는 보안 그룹에서 EC2 인스턴스만 접속하도록 제한 <img width="1284" alt="Image" src="https://github.com/user-attachments/assets/cbcf87ee-0059-44f3-96f1-7fcf7aa468d4" /> ### 4. EC2에 Docker 설치 및 애플리케이션 배포 전체 요약 ```bash chmod 400 "keykeykey.pem" ssh -i "keykeykey.pem" ubuntu@ec2-3-35-10-229.ap-northeast-2.compute.amazonaws.com ``` ```bash # Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` - 설치 확인 ```bash docker --version docker compose version sudo docker run hello-world ``` - sudo 없이 docker 명령어 사용 ```bash sudo gpasswd -a $USER docker sudo service docker restart sudo su - su - ubuntu # 다시 일반 계정으로 돌아가기 ``` ### 5. Spring Boot 프로젝트 배포 ```bash git clone https://github.com/soheeGit/boot-cloud-step3.git cd boot-cloud-step3 docker build -t step3 . docker run -d -p 80:8080 --name step3 -e DB_URL=jdbc:mariadb://database-1.cxk0ssqi8ba9.ap-northeast-2.rds.amazonaws.com:3306/mydb -e DB_USERNAME=root -e DB_PASSWORD=y7ZaAcFbZPqXOtYpy74O step3 curl ifconfig.me ``` <img width="936" alt="Image" src="https://github.com/user-attachments/assets/961b20a2-651c-4101-9646-f1098e03e564" /> --- ## 📌 액션즈 붙이기 - .github/workflows/ghcr.yml ```yaml name: Docker Image CI with Layer Caching on: push: branches: - main jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write steps: # GitHub에 올라간 내 프로젝트 코드를 작업 환경으로 가져오기 - name: Checkout repository uses: actions/checkout@v4 # 참고: https://github.com/actions/checkout # Docker 환경 설정 (프로그램을 담는 컨테이너를 만드는 환경을 준비) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # 참고: https://github.com/docker/setup-buildx-action # GitHub의 저장소(컨테이너를 보관하는 공간)에 로그인 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # 참고: https://github.com/docker/login-action # Docker 이미지에 이름표(태그와 라벨)를 자동으로 붙여주는 과정 - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} # 참고: https://github.com/docker/metadata-action # Docker가 빠르게 작동하도록 이전 작업 내용을 기억하는 캐시 설정 - name: Cache Docker layers uses: actions/cache@v4 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- # 참고: https://docs.github.com/actions/using-workflows/caching-dependencies-to-speed-up-workflows # 컨테이너 이미지(Docker 이미지)를 실제로 만들어서 저장소에 올리기 - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache ``` 1. main 브랜치로 push → GitHub Actions (.github/workflows/ghcr.yml) 동작 2. Docker 이미지 빌드 → Dockerfile 기준으로 GitHub Actions에서 이미지 생성 3. 이미지를 ghcr.io에 push → 자동으로 ghcr.io/soheegit/boot-cloud-step3:main 저장됨 4. EC2에서 pull + run → docker run ... ghcr.io/soheegit/boot-cloud-step3:main 실행 ```bash # docker rm -f step3 docker rmi ghcr.io/soheegit/boot-cloud-step3:main docker run -d -p 80:8080 --name step3 -e DB_URL=jdbc:mariadb://database-1.cxk0ssqi8ba9.ap-northeast-2.rds.amazonaws.com:3306/mydb -e DB_USERNAME=root -e DB_PASSWORD=y7ZaAcFbZPqXOtYpy74O ghcr.io/soheegit/boot-cloud-step3:main ``` --- ## 📌 Slack webhook 붙이기 <img width="1125" alt="Image" src="https://github.com/user-attachments/assets/ea89da9b-ee72-491f-a8ff-80cfcf5a949a" /> <img width="1131" alt="Image" src="https://github.com/user-attachments/assets/678667f4-50ee-4329-aeae-021d6cd7aee1" /> - .github/workflows/ghcr.yml 수정 ```yaml name: Docker Image CI with Layer Caching on: push: branches: - main jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write steps: # GitHub에 올라간 내 프로젝트 코드를 작업 환경으로 가져오기 - name: Checkout repository uses: actions/checkout@v4 # 참고: https://github.com/actions/checkout # Docker 환경 설정 (프로그램을 담는 컨테이너를 만드는 환경을 준비) - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # 참고: https://github.com/docker/setup-buildx-action # GitHub의 저장소(컨테이너를 보관하는 공간)에 로그인 - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # 참고: https://github.com/docker/login-action # Docker 이미지에 이름표(태그와 라벨)를 자동으로 붙여주는 과정 - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} # 참고: https://github.com/docker/metadata-action # Docker가 빠르게 작동하도록 이전 작업 내용을 기억하는 캐시 설정 - name: Cache Docker layers uses: actions/cache@v4 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- # 참고: https://docs.github.com/actions/using-workflows/caching-dependencies-to-speed-up-workflows # 컨테이너 이미지(Docker 이미지)를 실제로 만들어서 저장소에 올리기 - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache # Slack으로 결과 전송 - name: Send Slack Notification if: always() # Send notification regardless of build success or failure uses: act10ns/slack@v2.1.0 with: webhook-url: ${{ secrets.SLACK_WEBHOOK_URL }} # Replace with your Slack webhook URL secret status: ${{ job.status }} message: | *GitHub Actions Workflow Status:* *Repository:* `${{ github.repository }}` *Branch:* `${{ github.ref_name }}` *Commit:* `${{ github.sha }}` *Workflow:* `${{ github.workflow }}` *Run ID:* `${{ github.run_id }}` *Status:* `${{ job.status }}` *Link:* `${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}` # You can customize the message further with more details # For example, if you want to show the Docker image tags: # `*Docker Image Tags:* ${{ steps.meta.outputs.tags }}` ``` <img width="732" alt="Image" src="https://github.com/user-attachments/assets/10ad8ef2-add2-47ac-aad1-864e8c4a20a2" />
📌 EC2 + Docker + MariaDB + Spring Boot 배포 복습
1. EC2 인스턴스 생성
2. EC2 인스턴스 접속
3. Docker 설치 (공식 가이드 기반)
4. MariaDB 설치 (Docker)
5. DBeaver 연결 실패 원인 및 해결
연결 실패 원인
해결 방법
6. Spring Boot 프로젝트 (boot-cloud-step3) 빌드 및 실행
7. 실행 실패 - RDS로 전환
💀 죽었다.
잘가~
📌 RDS 반영 (MariaDB RDS 사용하여 Spring Boot 연결)
1. AWS RDS 인스턴스 생성
3. 보안 강화를 위한 접근 제한 설정
4. EC2에 Docker 설치 및 애플리케이션 배포 전체 요약
5. Spring Boot 프로젝트 배포
📌 액션즈 붙이기
main 브랜치로 push
→ GitHub Actions (.github/workflows/ghcr.yml) 동작
Docker 이미지 빌드
→ Dockerfile 기준으로 GitHub Actions에서 이미지 생성
이미지를 ghcr.io에 push
→ 자동으로 ghcr.io/soheegit/boot-cloud-step3:main 저장됨
EC2에서 pull + run
→ docker run ... ghcr.io/soheegit/boot-cloud-step3:main 실행
# docker rm -f step3 docker rmi ghcr.io/soheegit/boot-cloud-step3:main docker run -d -p 80:8080 --name step3 -e DB_URL=jdbc:mariadb://database-1.cxk0ssqi8ba9.ap-northeast-2.rds.amazonaws.com:3306/mydb -e DB_USERNAME=root -e DB_PASSWORD=y7ZaAcFbZPqXOtYpy74O ghcr.io/soheegit/boot-cloud-step3:main📌 Slack webhook 붙이기