이 프로젝트는 2026년 하계 글로벌 교육 프로그램 특강에서 진행하는 회원 관리 웹 제작 프로젝트입니다.
- 1주차: PHP, HTML, CSS, JavaScript로 웹 제작
- 2주차: Docker와 GitHub Actions를 통한 CI/CD 파이프라인을 구성
- PHP
- HTML
- CSS
- JavaScript
- MySQL
- Docker
- Docker Compose
- Prometheus
- Grafana
- GitHub Actions
- Docker Hub
- Trivy
.
├── Dockerfile
├── docker-compose.yml
├── mysql/
│ ├── init.sql
│ └── exporter.cnf
├── prometheus/
│ └── prometheus.yml
├── grafana/
│ ├── dashboards/
│ │ └── mysql-overview.json
│ └── provisioning/
├── .github/
│ └── workflows/
│ └── docker-image.yml
├── db.php
├── login.html
├── register.html
├── login_check.php
├── admin_users.php
├── insert_user.php
├── edit_user.php
├── delete_user.php
├── css/
└── js/
XAMPP에서 MySQL을 실행한 뒤, 프로젝트 루트에서 PHP 내장 서버를 실행합니다.
C:\xampp\php\php.exe -S localhost:8080브라우저에서 접속합니다.
http://localhost:8080/login.html
기본 DB 설정은 db.php에서 관리합니다.
$host = getenv("DB_HOST") ?: "localhost";
$dbname = getenv("DB_NAME") ?: "my_site";
$username = getenv("DB_USER") ?: "root";
$password = getenv("DB_PASS") ?: "";로컬 XAMPP 실행 시에는 my_site 데이터베이스와 member 테이블이 필요합니다.
Docker Compose 실행 시에는 mysql/init.sql을 통해 member 테이블과 테스트 계정이 자동 생성됩니다.
docker build -t cicd-assignment .docker run --name cicd-assignment-test -p 8080:8080 cicd-assignment브라우저에서 접속합니다.
http://localhost:8080/login.html
컨테이너 정리:
docker rm -f cicd-assignment-test단일 컨테이너 실행은 PHP 애플리케이션만 실행합니다. DB 기능까지 테스트하려면 Docker Compose 실행을 사용합니다.
PHP 애플리케이션, MySQL 데이터베이스, Prometheus, Grafana를 함께 실행합니다.
docker compose up --build웹 애플리케이션:
http://localhost:8080/login.html
테스트 계정:
ID: admin
PW: admin123
Prometheus:
http://localhost:9090
Grafana:
http://localhost:3000
Grafana 기본 로그인:
ID: admin
PW: admin
Grafana에는 Prometheus datasource와 MySQL Overview 대시보드가 자동 등록됩니다.
컨테이너 종료:
docker compose downDB 볼륨까지 초기화:
docker compose down -vDocker Compose에는 모니터링용 컨테이너가 포함되어 있습니다.
mysql-exporter: MySQL 상태를 Prometheus 메트릭으로 노출prometheus: 메트릭 수집grafana: 대시보드 시각화
Prometheus scrape 설정 파일:
prometheus/prometheus.yml
Grafana datasource 설정:
grafana/provisioning/datasources/prometheus.yml
Grafana dashboard 설정:
grafana/dashboards/mysql-overview.json
MySQL exporter 계정은 mysql/init.sql에서 생성됩니다. 기존 Docker volume이 이미 만들어져 있다면 아래 명령으로 DB를 초기화한 뒤 다시 실행해야 exporter 계정이 생성됩니다.
docker compose down -v
docker compose up --buildDocker Hub repository:
https://hub.docker.com/r/jaekyup/cicd-assignment
이미지 pull:
docker pull jaekyup/cicd-assignment:latest이 프로젝트는 GitHub Actions를 사용해 Docker 이미지를 자동으로 빌드하고 Docker Hub에 push합니다.
Workflow는 main 브랜치에 push될 때 실행됩니다.
수행 단계:
- Repository checkout
- Docker Hub 로그인
- Docker Buildx 설정
- Docker 이미지 빌드
- Trivy 보안 스캔
- Docker Hub 이미지 push
이 프로젝트는 GitHub Actions에서 Docker 이미지를 빌드한 뒤 Trivy를 사용해 컨테이너 이미지 취약점을 검사합니다.
Workflow는 Docker Hub에 이미지를 push하기 전에 GitHub Actions runner에서 로컬로 빌드된 이미지를 먼저 스캔합니다. CRITICAL 등급 취약점이 발견되면 workflow가 실패하도록 설정했습니다.
exit-code: 1
severity: CRITICAL이 설정을 통해 심각도가 높은 취약점이 포함된 이미지는 Docker Hub에 배포되지 않도록 차단합니다.
Workflow 파일:
.github/workflows/docker-image.yml
실행 조건:
main 브랜치 push
Docker Hub에 생성되는 태그:
jaekyup/cicd-assignment:latest
jaekyup/cicd-assignment:<git-commit-sha>
Workflow는 이미지 빌드 후 Trivy 스캔을 수행하고, 스캔을 통과한 경우에만 Docker Hub에 이미지를 push합니다.
GitHub Secrets:
DOCKERHUB_USERNAME
DOCKERHUB_TOKEN