[DEVOPS-003][입문] Docker Compose로 웹과 캐시 함께 실행하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[DEVOPS-003][입문] Docker Compose로 웹과 캐시 함께 실행하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 265회 작성일 26-08-30 17:35

본문

[이번 수업]
Docker Compose는 여러 컨테이너 서비스를 하나의 YAML 파일로 정의하고 함께 실행하는 도구입니다. Nginx 웹 서버와 Redis 캐시를 띄워 서비스 상태, 시작 순서, 내부 이름 연결, 볼륨을 관찰합니다.

[선수지식]
DEVOPS-001의 개발·운영 흐름과 DEVOPS-002의 컨테이너·이미지 개념을 알면 좋습니다. Docker Desktop 또는 Docker Engine과 Compose 플러그인이 필요합니다.

[학습목표]
1. Compose의 서비스·네트워크·볼륨을 설명합니다.
2. 헬스체크를 통과한 뒤 의존 서비스를 시작합니다.
3. 실행·상태 확인·종료 명령을 사용합니다.

[핵심개념]
서비스(service)는 컨테이너의 논리적 정의입니다. 이미지는 실행 파일 묶음, 컨테이너는 이미지의 실행 인스턴스입니다. Compose는 기본 네트워크를 만들고 서비스 이름을 내부 DNS 이름으로 제공하므로 `web` 컨테이너는 `cache`라는 이름으로 Redis를 찾을 수 있습니다. 컨테이너 안의 `localhost`는 그 컨테이너 자신입니다.

`depends_on`의 짧은 형식은 시작 순서만 보장하고 준비 완료까지 기다리지 않습니다. 아래처럼 `condition: service_healthy`와 healthcheck를 함께 쓰면 Redis가 PONG을 반환한 뒤 web을 시작합니다. 이름 있는 볼륨은 컨테이너를 다시 만들어도 데이터를 보존하며 `docker compose down`만으로는 삭제되지 않습니다.

[따라하기]
빈 연습 폴더에 다음을 `compose.yaml`로 저장하세요.

```yaml
services:
  web:
    image: nginx:1.28.3-alpine
    ports:
      - "127.0.0.1:8080:80"
    depends_on:
      cache:
        condition: service_healthy

  cache:
    image: redis:8.2.9-alpine
    command: ["redis-server", "--appendonly", "yes"]
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5
    volumes:
      - cache_data:/data

volumes:
  cache_data:
```

Windows/macOS/Linux 모두 해당 폴더에서 `docker compose config -q`를 실행합니다. 출력이 없고 종료 코드가 0이면 형식이 유효합니다. `docker compose up -d`로 시작하고 `docker compose ps`에서 web은 Up, cache는 healthy인지 확인하세요. macOS/Linux는 `curl http://127.0.0.1:8080`, Windows PowerShell은 `curl.exe http://127.0.0.1:8080`으로 Nginx 환영 HTML을 봅니다.

`docker compose exec cache redis-cli ping`은 PONG을 출력해야 합니다. `docker compose exec web getent hosts cache`는 cache의 내부 주소를 보여 줍니다. `docker compose logs cache`로 로그를 보고 `docker compose down`으로 종료하세요.

[흔한 실수]
YAML 들여쓰기에 탭을 쓰거나 칸 수를 다르게 하지 마세요. 컨테이너 사이 주소에 `localhost`를 쓰면 자기 자신을 가리킵니다. `depends_on`만으로 준비까지 보장된다고 생각하지 말고 healthcheck를 정의합니다. `down` 후에도 볼륨이 남고 호스트 8080 포트가 이미 사용 중일 수 있습니다.

[보안 주의]
예제는 본인 컴퓨터의 로컬 연습 환경에서만 사용하며 Redis를 호스트 포트로 공개하지 않습니다. web 포트도 `127.0.0.1`에만 묶었습니다. 운영에서는 비밀번호·토큰을 YAML이나 Git에 넣지 말고 비밀 관리 기능을 사용합니다. `privileged: true`나 Docker 소켓 마운트는 강한 권한을 주므로 피하고, 이미지 태그·다이제스트 고정과 취약점 검사를 운영 절차에 포함합니다. 이 Redis 설정은 인증 없는 학습용이므로 외부 환경에 배포하지 않습니다.

[직접 해볼 과제]
`docker compose exec cache redis-cli SET course devops`로 값을 저장하고 GET으로 확인하세요. down 후 다시 up한 뒤 값이 남는지 확인해 볼륨 역할을 설명합니다. 연습 데이터가 더 필요 없을 때만 프로젝트 폴더에서 `docker compose down -v`로 볼륨까지 제거합니다.

[확인문제]
1. 컨테이너끼리 cache라는 이름으로 연결할 수 있는 이유는 무엇인가요?
2. service_healthy 조건에는 왜 healthcheck가 필요한가요?
3. docker compose down 후 Redis 값이 남을 수 있는 이유는 무엇인가요?

[다음 학습]
전체 순환의 다음 수업은 SEC-003 ‘인증과 인가·최소 권한’입니다. 이어서 DEVOPS-004 ‘CI에서 빌드·테스트 자동화’를 학습하세요.

[공식 참고 자료]
Compose 서비스 정의: https://docs.docker.com/reference/compose-file/services/
시작·종료 순서: https://docs.docker.com/compose/how-tos/startup-order/
Compose 네트워킹: https://docs.docker.com/compose/how-tos/networking/
Docker 볼륨: https://docs.docker.com/engine/storage/volumes/

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,660
어제
5,103
최대
16,772
전체
772,714
Copyright © 소유하신 도메인. All rights reserved.