Backend
home
🕛

2024. 9. 27 (Docker, CI/CD)

생성일
2025/01/24 05:52
태그

Docker 실습 (rest_product 프로젝트 배포)

기존에 설치되어 있는 Docker Container, Docker image 삭제

hms@ubuntu:~/2024-kosta-project/back$ docker stop front-container back-container mysql-container front-container back-container mysql-container hms@ubuntu:~/2024-kosta-project/back$ docker rm front-container back-container mysql-container front-container back-container mysql-container hms@ubuntu:~/2024-kosta-project/back$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 660c94f1e4d3 f05d9449e619 "/bin/sh -c './gradl…" 4 hours ago Exited (126) 4 hours ago charming_williamson hms@ubuntu:~/2024-kosta-project/back$ docker rm 660c 660c hms@ubuntu:~/2024-kosta-project/back$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE back-image latest f95d8a9d5226 23 minutes ago 377MB <none> <none> 01f78139c4ef 23 minutes ago 660MB <none> <none> a6543a52708b 3 hours ago 660MB <none> <none> 894ff6326204 3 hours ago 377MB <none> <none> 3af1ab7b093f 3 hours ago 660MB <none> <none> 0c16c8268714 4 hours ago 660MB <none> <none> f05d9449e619 4 hours ago 608MB front-image latest 87ed939d1f53 4 hours ago 50.2MB <none> <none> e2102b88367b 4 hours ago 1.97GB gradle 8-jdk17-alpine b3c54050e08c 2 weeks ago 555MB node 20 dd223fd5024d 5 weeks ago 1.1GB nginx alpine c7b4f26a7d93 6 weeks ago 43.2MB mysql 8 f742bd39cd6b 2 months ago 584MB openjdk 17-jdk-alpine 264c9bdce361 3 years ago 326MB hms@ubuntu:~/2024-kosta-project/back$ docker network rm kosta-net kosta-net # 이미지 전체 삭제인 경우 $(docker images -q) 명령어를 활용 hms@ubuntu:~/2024-kosta-project/back$ docker rmi $(docker images -q)
Shell
복사

Front

Dockerfile
# 1. node 이미지 FROM node:20 AS build # 2. 컨테이너에 작업 디렉토리 설정 WORKDIR /app # 3. package.json & package-lock.json을 작업 디렉토리에 복사 (와일드카드 적용 : *) COPY package*.json ./ # 4. 의존성 업데이트 및 설치 RUN npm update RUN npm install # 5. 소스 코드를 컨테이너에 복사 COPY . . # 6. React 애플리케이션 빌드 RUN npm run build # 배포 # 1. nginx 이미지 FROM nginx:alpine # 2. nginx 설정 파일을 교체 COPY nginx.conf /etc/nginx/conf.d/default.conf # 3. nginx 기본 html 삭제 RUN rm -rf /usr/share/nginx/html/* # 4. 빌드된 React 애플리케이션을 nginx 디렉토리로 복사 COPY --from=build /app/build /usr/share/nginx/html # 5. nginx 포트 노출 EXPOSE 80 # 6. nginx 서버 실행 CMD [ "nginx", "-g", "daemon off;" ]
Docker
복사
docker-compose.yml
version: '3' services: front-container: build: context: . container_name: front-container ports: - "80:80"
YAML
복사

Back

Dockerfile
# 빌드 # 1. 빌드 이미지 (gradle) FROM gradle:8-jdk17-alpine AS build # 2. 컨테이너 작업 디렉토리 설정 WORKDIR /app # 3. Gradle 파일만 복사 COPY build.gradle settings.gradle gradlew ./ COPY gradle ./gradle # 4. 프로젝트 파일 전체 복사 COPY . . # 5. gradlew 파일에 실행 권한을 추가 부여 (gradlew은 빌드를 진행하기 위한 파일) # [r : 읽기 권한, w : 쓰기 권한, x : 실행 권한] RUN chmod +x gradlew # 6. 빌드 실행 RUN ./gradlew clean build -x test # 배포 # 1. openjdk 이미지 FROM openjdk:17-jdk-alpine # 2. 컨테이너 작업 디렉토리 설정 WORKDIR /app # 3. 빌드 단계에서 생성된 jar 파일 복사 (build.gradle jar { enabled: false }) COPY --from=build /app/build/libs/*.jar /app/app.jar # 4. 포트 노출 EXPOSE 8080 # 5. 애플리케이션 실행 ENTRYPOINT [ "java", "-jar", "/app/app.jar" ]
Docker
복사
docker-compose.yml
version: '3' services: mysql: image: mysql:8 container_name: mysql-container environment: - MYSQL_ROOT_PASSWORD=1234 - MYSQL_USER=codesche - MYSQL_PASSWORD=1234 - MYSQL_DATABASE=product_db - TZ=Asia/Seoul ports: - "3306:3306" networks: - kosta-net back-image: build: context: . container_name: back-container ports: - "8080:8080" environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysql-container:3306/product_db - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=1234 networks: - kosta-net depends_on: - mysql restart: always networks: kosta-net: driver: bridge
YAML
복사

Github Action 실습

구조도
Github Actions
Github에서 제공하는 CI/CD 도구
Repository에서 어떤 이벤트가 발생하면, 특정 작업이 수행되도록 함
Github Actions의 구성
Workflow(워크플로)
Github Actions의 상위 개념
YAML 파일로 작성 (Repository > .github/workflows)
Event(이벤트)
Workflow를 실행하게 하는 규칙이나 조건 (Trigger)
on 속성을 통해 정의
Job(잡)
독립된 가상머신 or 컨테이너에서 동작하는 하나의 처리 단위
Job들은 병렬적으로 실행됨
Job은 여러 개의 Step으로 구성
Step(스텝)
여러 단계를 순차적으로 실행하는 작업 순서
직접 작성하거나 github에서 가져와 사용도 가능
Github Action work-flow 예제
# WORKFLOW의 이름 지정 name: my-first-workflow # Event 지정 on: push # JOB 정의 jobs: # JOB 이름 지정 my-first-job: # RUNNER 정의 runs-on: ubuntu-latest #STEP 정의 steps: # uses : ACTION을 사용 # GIT에 있는 코드 받아오는 ACTION - name: my-git-step uses: actions/checkout@v3 # RUN : 커맨드 명령어 실행 - name: my-cmd-step run: ls - name: my-cmd-step run: echo "Hello World"
Shell
복사
AWS 설정
EC2 접속 시 참고사항
Docker
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 "$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 ubuntu@ip-172-31-34-164:~$ sudo usermod -aG docker $USER ubuntu@ip-172-31-34-164:~$ newgrp docker ubuntu@ip-172-31-34-164:~$ docker info
Shell
복사
Github action 정리
name: FRONT-WORKFLOW on: push: branches: [ "main" ] jobs: front-job: runs-on: ubuntu-latest steps: - name: SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} script: | # 오류 발생 시 스크립트 중단 set -e # SSH 접속 후 작업 디렉토리로 이동 echo "SSH 접속" cd 2024-aws-kostagram/front # 환경 설정 파일 생성 echo "환경 설정 파일 생성" echo -e "REACT_APP_REST_SERVER=${{ secrets.REACT_APP_REST_SERVER }}" >> .env echo -e "REACT_APP_SERVER=${{ secrets.REACT_APP_SERVER }}" >> .env echo -e "REACT_APP_GOOGLE_ID=${{ secrets.REACT_APP_GOOGLE_ID }}" >> .env echo -e "REACT_APP_GOOGLE_REDIRECT_URI=${{ secrets.REACT_APP_GOOGLE_REDIRECT_URI }}" >> .env echo -e "REACT_APP_KAKAO_ID=${{ secrets.REACT_APP_KAKAO_ID }}" >> .env echo -e "REACT_APP_KAKAO_REDIRECT_URI=${{ secrets.REACT_APP_KAKAO_REDIRECT_URI }}" >> .env # GIT 최신 코드 가져오기 echo "GIT PULL 작업" git_output=$(sudo git pull origin main 2>&1) echo "$git_output" # Docker 빌드 echo "Docker build" docker compose up -d --build front-image
Shell
복사