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