
https://dev-dx2d2y-log.tistory.com/241
[인프라] CI/CD와 깃허브 액션
CI/CD수동배포에서의 업데이트https://dev-dx2d2y-log.tistory.com/240 [인프라] AWS란? (AWS 왕왕기초) + 수동배포AWS개발이 끝났다면 내가 만든 애플리케이션을 사용자들이 사용할 수 있도록 배포를 해야한다.
dev-dx2d2y-log.tistory.com
저번에는 깃허브 액션을 통한 CI/CD 파이프라인을 구축했다.
이번에는 여기에 도커컴포즈를 적용시켜보려한다.
도커컴포즈 문서작성하기
version: "3.8"
services:
app:
image: kdhyun422/conx-server:${IMAGE_TAG}
container_name: conx
ports:
- "80:8080"
restart: unless-stopped
environment:
- SPRING_PROFILES_ACTIVE=prod
루트 디렉토리에 다음과 같이 docker-compose.yml 파일을 작성하면 된다. 저게 하나의 컨테이너가 된다.
보면 이미지 이름과 태그이름 (태그이름은 환경변수를 통해 얻는 중이며, 보통 그 환경변수는 .env 파일에 있다.) 을 지정하고, 컨테이너 이름도 지정하고, 포트와 restart 기준을 지정한다.
즉, 저번에 다뤘던 CD 과정의 대부분을 이 docker-compose의 한 속성으로 관리 중이다.
version: "3.8"
services:
app:
image: kdhyun422/conx-server:${IMAGE_TAG}
ports:
- "80:8080"
restart: unless-stopped
environment:
- SPRING_PROFILES_ACTIVE=prod
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:8080/health/ready" ]
interval: 10s
timeout: 3s
retries: 5
mysql:
image: mysql:8.0
container_name: mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD_ADMIN}
MYSQL_DATABASE: conx
MYSQL_USER: conx
MYSQL_PASSWORD: ${DATABASE_PASSWORD_USER}
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
도커컴포즈에 mysql까지 추가한 모습. 로컬이나 테스트 환경에서는 mysql을 컨테이너에 띄워서 사용하기도하는데 운영 환경에서는 RDS를 주로 사용한다고하기 때문에... (레디스도 비슷한 상황이다) 간단하게만 구성했다.
이러면 전에는 매번 컨테이너를 빌드하고 띄운 다음에 EC2가 실행시켜야했지만.. 도커컴포즈 하나면 이 컨테이너들을 한 번에 실행시킬 수 있다. 추가로 healthcheck 속성을 통해서 빌드 후에 수행할 명령어를 입력할 수 있다. 위는 app 속성에 대해서 10초 간격으로 5회 반복 테스트를 수행, 3초를 타임아웃으로 지정한다.
name: CONX server CD
on:
workflow_run:
workflows:
- "CI"
types:
- completed
jobs:
deploy:
if: >
github.event.workflow_run.conclusion == 'success' &&
github.event.workflow_run.event == 'push' &&
github.event.workflow_run.head_branch == 'main'
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.workflow_run.head_sha }}
- name: Setting Buildx Docker
uses: docker/setup-buildx-action@v3
- name: Login Docker
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and Push Docker Image
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
platforms: linux/amd64, linux/arm64
tags: |
kdhyun422/conx-server:latest
kdhyun422/conx-server:${{ github.event.workflow_run.head_sha }}
- name: Deploy to EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
script: |
IMAGE_TAG = ${{ github.event.workflow_run.head_sha }}
echo "IMAGE_TAG=$IMAGE_TAG" > .env
sudo docker compose pull
sudo docker compose up -d
for i in {1..10}; do
if curl -f http://localhost:80/health/ready; then
echo "Health Check passed"
break
fi
echo "Waiting for Service..."
sleep 2
done
curl -f http://localhost:80/health/ready || exit 1
sudo docker image prune -f
그럼 CD 파일도 이렇게 바뀐다.
매번 이미지를 띄우고 컨테이너를 실행시키는 것이 아니라 각 컨테이너의 속성을 도커컴포즈 파일에 적어놓기만하면 docker compose up 명령어만으로 여러 컨테이너를 일괄적으로 구동시킨다.
그리고 이전에는 컨테이너를 구동할 때 이미 돌고 있는 컨테이너가 있다면 끄고 구동했는데, 도커컴포즈를 사용하면 이 기능이 기본적으로 수행되기 때문에 딱히 컨테이너가 이미 돌고 있는지 검사할 필요가 없다고한다.
도커컴포즈 파일에 헬스체크 로직이 있지만 CD 쪽에서도 헬스체크 로직을 두는 것이 좋다고한다.
암튼 이렇게 도커컴포즈를 통해서 CI/CD를 구축하였다.
도커컴포즈를 사용해서 더 확장성이 높아졌다고 할 수 있다. 여러 개의 이미지와 컨테이너를 구동하는 것보다 도커컴포즈를 통해 한 번에 구동시킬 수 있기 때문이다.
'CS > 인프라' 카테고리의 다른 글
| [인프라] 도전! 실전 깃허브 액션 (0) | 2026.05.12 |
|---|---|
| [인프라] CI/CD와 깃허브 액션 (0) | 2026.05.07 |
| [인프라] AWS란? (AWS 왕왕기초) + 수동배포 (0) | 2026.05.06 |
| [인프라] 도커란? (도커왕왕기초) (0) | 2026.05.06 |
