728x90
Dockerfile 생성하기
Dockerfile
FROM openjdk:17-jdk
COPY build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/app.jar"]
build.gradle
jar {
enabled = false
}
Github 리포지토리 생성 후 push
AWS EC2 인스턴스 생성하기
- 키 페어
- 방화벽(보안 그룹)
- 탄력적 IP 주소
- 인스턴스의 Publid IP는 고정된 IP 주소가 아니라 유동적인 IP 주소이다.
- EC2 인스턴스를 STOP 하고 중지 상태에서 새롭게 실행 상태로 변경하면, 기존에 할당받은 IP 주소가 변경되어 버린다.
- 이를 해결하고자 AWS에서는 한 번 할당받으면 절대 바뀌지 않는 Elastic IP를 제공한다.
🐳 EC2 × Docker
# 패키지 원격 설치 도구인 YUM 업데이트한다.
sudo yum update -y
# YUM을 이용해 docker 설치한다.
sudo yum install -y docker
# 리눅스 계정인 ec2-user에 docker 사용 시 sudo를 붙이지 않고도 사용할 수 있게 한다.
sudo usermod -aG docker ec2-user
# docker 데몬 부팅 시 자동 시작 서비스로 등록하고 재시작한 뒤 EC2를 재시작한다.
sudo systemctl enable docker
sudo systemctl restart docker
sudo reboot
# 재시작을 확인한 뒤 putty를 재접속한 다음 docker version의 서버(Server:)를 통해 정상 동작하는 도커를 확인한다.
docker version
실행 중인 모든 컨테이너를 종료하려면
docker kill $(docker ps -a -q)
😺 EC2 × Git
# git 패키지를 설치한다.
sudo yum -y install git
# git을 다운로드 한다.
git clone [URL]
Git Actions를 사용해 자동 배포하기
Actions > New workflow > Java with Gradle 선택
./github/workflows/github-actions.yml
name: Java CI with Gradle
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Java JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Make application.yml
run: |
cd ./src/main/resources
touch ./application.yml
echo "${{ secrets.APPLICATION_YML }}" > ./application.yml
- name: Run chmod to make gradlew executable
run: chmod +x gradlew
- name: Gradle Build Action
uses: gradle/gradle-build-action@v2.6.0
with:
arguments: clean build
- name: Docker Login
uses: docker/login-action@v2.2.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker images
uses: docker/build-push-action@v4.1.1
with:
context: .
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/spring-boot-server
- name: Deploy to AWS EC2
uses: appleboy/ssh-action@v0.1.10
with:
host: ${{ secrets.HOST }}
username: ec2-user
key: ${{ secrets.PRIVATE_KEY }} # pem key
script: |
docker pull ${{ secrets.DOCKER_USERNAME }}/spring-boot-server
docker stop $(docker ps -a -q)
docker run -d --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/spring-boot-server
docker rm $(docker ps --filter 'status=exited' -a -q)
docker image prune -a -f
Settings > Secrets and variables > Actions > New repository secrets
- APPLICATION_YML : DB의 정보를 담고 있는 application.yml을 .gitignore에 추가하고 파일 내용을 비공개로 하여 생성하도록 하는 값
- DOCKER_PASSWORD : 도커 허브 비밀번호
- DOCKER_USERNAME : 도커 허브 사용자 이름
- HOST : EC2 탄력적 IP 주소
- PRIVATE_KEY : EC2 생성 시 생성한 pem 키 (BEGIN END 라인 포함)
위와 같이 완료되면 yml 파일 생성, 이미지 생성 및 도커 허브 업로드, 서버에서 실행된다.
에러 사항
Git Actions를 사용하면서 다양한 에러를 마주했다.😂
그 중에 가장 기억에 남는 것은 다음과 같다.
1. ssh.ParsePrivateKey: ssh: no key found (✅)
- Amazon Linux 2023 AMI ➔ Amazon Linux 2 AMI
https://github.com/appleboy/ssh-action/issues/6
https://github.com/appleboy/ssh-action#setting-up-ssh-key
2. dial tcp ~:22 i/o timeout' (✅)
3. 서버 구동 시 제대로 동작하지 않는 현상 (✅)
https://zzang9ha.tistory.com/331
- AWS EC2 보안 그룹의 8080 포트에 대해 인바운드 규칙을 설정하지 않아서 생긴 문제였다.
- 톰캣 포트(8080)을 붙여야 접속이 가능하므로 (80 ➔ 8080) 포트 포워딩을 해주었다.
- 80 포트에 대한 인바운드 규칙도 추가하였다.
# 80 port로 들어오면 8080 port로 재매핑
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
# 포트 포워딩 삭제
sudo iptables -t nat -D PREROUTING [num]
느낀점
도커의 중요성을 알고는 있었지만 적용해 본 것은 처음이라 재밌었다.
처음 자동 배포라는 것을 적용하면서 많은 어려움이 있었지만 복잡한 작업들을 내가 직접 하지 않아도 되어 개발이 매우 간편해졌다.
현업에서는 보통 DB를 RDS에 올려놓고 사용하는지? 도커 이미지를 생성해 사용하는지? 궁금해졌다.
728x90
'기타 > 정리.zip' 카테고리의 다른 글
[멋쟁이사자처럼] HTML 정리 (0) | 2023.02.28 |
---|---|
[MySQL] 코딩테스트 문법 정리 (0) | 2023.02.23 |
[IntelliJ] 단축키 정리 (0) | 2023.02.04 |
[Python] 코딩테스트 문법 정리 (0) | 2023.01.05 |