Search

초기 프로젝트 CI/CD 구축

이제 만든 프로젝트를 Dockfile를 통해서 이미지 파일로 만들고 실행해볼거다.

그 전에 Dockfile이 뭐고 Docker 이미지가 뭐하는 건데?

Dockerfile과 Docker 이미지는 컨테이너화된 애플리케이션을 구축하고 실행하는 데 사용되는 중요한 개념.
1.
Dockerfile
애플리케이션을 Docker 이미지로 빌드하기 위한 명령어를 포함한 텍스트 파일이다.
필요한 OS, 애플리케이션 파일, 종속성 등을 정의
2.
Docker 이미지
Dockerfile을 기반으로 생성된 읽기 전용 템플릿
애플리케이션 실행에 필요한 모든 요소를 포함한다.
3.
사용 이유
일관된 환경: 어떤 시스템에서든 동일하게 작동.
배포 용이성: 복잡한 설정 없이 컨테이너로 애플리케이션 배포.
확장성: 컨테이너를 쉽게 스케일링하여 애플리케이션 성능 최적화.
Dockerfile을 통해 빈티지 커뮤니티 사이트를 Docker 이미지로 만들어 배포 및 관리가 더 쉬워진다.

맥북 터미널로 도커 설치

brew install --cask docker docker --version
Bash
복사

우선 JAR 파일 생성

bootJar 클릭하면
build 폴더 안에 libs 폴더가 생김
그럼 안에 vintage-0.0.1-SNAPSHOT.jar 라는 파일이 생김

프로젝트 최상위 루트에 Dockerfile 생성

# Start with a base image containing Java runtime FROM openjdk:17 ARG JAR_FILE=build/libs/*.jar # Copy the built JAR file COPY ${JAR_FILE} app.jar # Expose the port the application runs on EXPOSE 8080 # Run the application ENTRYPOINT ["java", "-jar", "app.jar"]
Plain Text
복사

Dockerfile로 이미지 빌드

docker build -t zero0zone/vintage:0.0.1
Bash
복사
zero0zone은 어디서 나왔냐면 도커사이트때 가입한 닉네임(도커계정명)
근데 도커 데스크탑 안열고 실행시키면 데몬 실행시켜달라고 오류가 뜬다!
도커 데스트탑 키고
다시 쳐주면 진행됨
이미지가 잘 생성됐는지 확인
docker image ls
Bash
복사
이미지를 실행하면 spring boot 프로젝트가 뜬다
docker run zero0zone/vintage:0.0.1
Bash
복사
근데 바로 터미널에서 오류뱉기
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections. at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:342) ~[postgresql-42.6.2.jar!/:42.6.2] at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54) ~[postgresql-42.6.2.jar!/:42.6.2] at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:263) ~[postgresql-42.6.2.jar!/:42.6.2] at org.postgresql.Driver.makeConnection(Driver.java:443) ~[postgresql-42.6.2.jar!/:42.6.2] at org.postgresql.Driver.connect(Driver.java:297) ~[postgresql-42.6.2.jar!/:42.6.2]
Bash
복사
postgresql하고 연결이 안된다는건데
우선 켜져있고 로컬에서 잘 작동하는데 localgost 대신 컨테이너 이름을 사용해야 한다.
최상위 루트에 docker-compost.yml 생성
version: '3.8' services: db: image: postgres:14 environment: POSTGRES_DB: vincamo POSTGRES_USER: vincamouser POSTGRES_PASSWORD: vincamo0126 ports: - "5432:5432" networks: - app-network app: image: zero0zone/vintage:0.0.1 depends_on: - db environment: SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/vincamo SPRING_DATASOURCE_USERNAME: vincamouser SPRING_DATASOURCE_PASSWORD: vincamo0126 ports: - "8080:8080" networks: - app-network networks: app-network:
XML
복사
docker-compose up --build
Bash
복사
애플리케이션이랑 데이터베이스를 실행한다
그러면 실시간 로그랑 실행되는데 나가고 싶으면 ctrl+c

DockerHub로 push

이미지로 만들었으니까 이제 컨테이너를 만들어서 실행시켜봐도 된다.
그전에 다른 환경에서도 이미지에 쉽게 접근할 수 있도록 DockerHub에 이미지를 Push 해야 한다
docker login
Bash
복사
도커에 로그인 해주고
docker push zero0zone/vintage:0.0.1
Bash
복사
근데 민감한 정보가 담겨있으니까 따로 docker hub 들어가서 설정에 private로 변경해주거나
처음부터 private로 생성해서 진행해주면 된다.

CI/CD 소스 추가에 AWS랑 Docker 설정 추가

.github/workflows/deploy.yml 생성
name: CI/CD Pipeline on: push: branches: - main jobs: build: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 - name: Set up JDK 17 uses: actions/setup-java@v2 with: java-version: '17' - name: Build with Gradle run: ./gradlew build - name: Build Docker image run: docker build -t vintage-community:latest . - name: Push Docker image run: | docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} docker tag vintage-community:latest your-docker-repo/vintage-community:latest docker push your-docker-repo/vintage-community:latest - name: Deploy to EC2 uses: appleboy/ssh-action@v0.1.8 with: host: ${{ secrets.EC2_HOST }} username: ${{ secrets.EC2_USER }} key: ${{ secrets.EC2_SSH_KEY }} port: 22 script: | docker pull your-docker-repo/vintage-community:latest docker stop vintage-community || true docker rm vintage-community || true docker run -d -p 80:8080 --name vintage-community your-docker-repo/vintage-community:latest
XML
복사
여기서 ${{ secrets.EC2_SSH_KEY }} 이런 값들은
해당 깃허브 프로젝트 > Settings > Secrets and variables > Actions
레파지토리에 new 해가지고 값 넣어주면됨.