이제 만든 프로젝트를 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 해가지고 값 넣어주면됨.