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  /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  /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
복사








