728x90
Docker Compose 사용 이유
- 편하게 설정: 여러 컨테이너를 한 번에 쉽게 설정 가능
- 자동 배포: 설정 파일이 있으면 Docker Compose가 알아서 컨테이너들을 만들어 주고 실행
- 의존성 관리: 컨테이너들이 서로 의존하는 관계 관리
- 모니터링과 로깅
- 확장성: 여러 컨테이너를 하나의 그룹으로 관리하고 확장하기 쉬움
- 유연성: 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지 가능
- 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한
- 유지보수가 쉬워요: 설정 파일 하나로 컨테이너들을 관리하기 때문에 파일만 수정하면 됨
Docker Compose 사용 환경
- 개발 환경에서
- 앱을 따로 떼어 놓고 실행하고 테스트할 수 있는 환경
- Compose 파일은 앱이 필요로 하는 모든 서비스들(데이터베이스, 큐, 캐시, 웹 API 등)을 정리해주고, docker compose up 명령어로 이 모든 것을 한 번에 시작
- 자동화된 테스트 환경에서
- 테스트를 위한 별도의 환경을 쉽게 만들고 없앨 수 있음
- 예시: docker compose up -d ./run_tests docker compose down
- 단일 호스트 배포에서
- 실제로 앱을 운영하는 환경(프로덕션)에도 사용 가능
YAML file이란?
YAML( YAML Ain't Markup Language) 파일: 컴퓨터가 읽을 수 있는 설정 파일
사람이 읽기에도 쉬운 텍스트 형식으로 되어 있음
- 사용 이유
- YAML 파일은 설정을 정리하고 관리하기에 좋음
- YAML은 읽기 쉽고, 쓰기도 간단해서 많은 프로그램과 도구에서 선호하는 설정 파일 형식
- 특징
- YAML 파일은 구조가 명확하고 간단해서, 사람이 보기에도 이해하기 쉬워요
- 들여쓰기를 사용해서 각 설정의 관계를 나타냄
- 문법
- 키-값 쌍: 키와 값으로 이루어진 쌍으로 구성. 키와 값은 콜론(:)으로 구분.
- 리스트: 쉼표(,)로 구분된 값들의 리스트로 구성.
- 딕셔너리: 중괄호({})로 둘러싸인 키-값 쌍의 리스트로 구성.
- 불린 값: true, false, yes, no 등의 값으로 표현.
- 문자열: 큰 따옴표("")나 작은 따옴표('')로 둘러싸인 문자열로 표현.
Docker Compose 파일 예제
version: '3'
services:
web:
image: nginx:latest
ports:
- 80:80
volumes:
- ./web:/usr/share/nginx/html
depends_on:
- api
links:
- api:api
api:
image: java:latest
volumes:
- ./api:/app
ports:
- 8080:8080
environment:
- REDIS_HOST=redis
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=test
depends_on:
- mysql
- redis
links:
- mysql:mysql
- redis:redis
redis:
image: redis:latest
ports:
- 6379:6379
mysql:
image: mysql:latest
ports:
- 3306:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- version: Docker Compose의 버전을 정의
- services
- web 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출
- api 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출
- redis 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출
- mysql 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출
services:
web:
build:
context: . # Dockerfile 의 위치
dockerfile: Dockerfile # Dockerfile 파일명
container_name: testapp_web_1 # 생략하는 경우
# 자동으로 부여 docker run 의 --name 옵션과 동일
ports: "8080:8080" # docker run 의 -p 옵션과 동일
expose: "8080" # 호스트머신과 연결이 아니라
# 링크로 연결된 서비스 간 통신이 필요할 때 사용
networks: testnetwork # networks 를 최상위에 정의한다면 해당 이름을 사용
# docker run의 --net 옵션과 동일
volumes: .:/var/lib/nginx/html # docker run 의 -v 옵션과 동일
environment:
- APPENV=TEST # docker run 의 -e옵션과 동일
command: npm start # docker run 의 가장 마지막
restart: always # docker run 의 --restart 옵션과 동일
depends_on: db # 이 옵션에 지정된 서비스가 시작된 이후에 `web`서비스가 실행
links: db # Docker가 네트워크를 통해 컨테이너를 연결하도록 정의합니다.
# 컨테이너를 연결할 때 Docker는 환경 변수를 만들고
# 컨테이너를 알려진 호스트 목록에 추가하여 서로를 검색할 수 있도록 합니다.
deploy: # 서비스의 복제본 개수 등 지정
replicas: 3
mode: replicated
- volumes: 현재 디렉토리 내 web/api/mysql 디렉토리를 컨테이너에 연결하여 데이터를 영구적으로 저장
- 도커 볼륨 혹은 호스트 볼륨을 마운트하여 사용
- 선언된 볼륨만 docker-compose.yml에서 사용 가능
- depends_on: 각 서비스 간의 의존성을 정의
- links: 각 서비스 간의 링크를 정의
- networks: 서비스(컨테이너)가 소속된 네트워크
- 따로 지정하지 않을 경우 default_${project}와 같이 지정됨
- 기본적으로 컨테이너는 같은 네트워크에 있어야 서로 통신이 가능함
- healthcheck
- 서비스 컨테이너가 "healthy"한지 계속 체크
- Dockerfile에 정의된 것을 먼저 따르지만 docker-compose 파일에서 재지정 가능
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
start_period: 40s
start_interval: 5s
Docker Compose CLI
- docker-compose [COMMAND] [SERVICES...] : 지정된 서비스(컨테이너)만 제어 가능
- docker-compose up
- --build : 이미 빌드가 되었더라도 강제로 빌드를 진행합니다.
- -d : 백그라운드로 실행합니다.
- --force-recreate : 강제로 컨테이너를 종료했다가 재생성
- docker-compose down : 서비스를 멈추고 삭제. 컨테이너와 네트워크를 삭제.
- --volume : 선언된 도커 볼륨도 삭제합니다.
- docker-compose stop, docker-compose start : 서비스를 멈추거나, 멈춰 있는 서비스를 시작
- docker-compose ps : 현재 환경에서 실행 중인 각 서비스의 상태를 표시합니다.
- docker-compose logs : 컨테이너 로그를 확인합니다.
- -f : 컨테이너 로그를 실시간으로 확인
- docker-compose exec [명령어] : 실행 중인 컨테이너에 해당 명령어를 실행합니다.
- docker-compose run
- 특정 명령어를 일회성으로 실행하지만 컨테이너를 batch성 작업으로 사용하는 경우에 해당
- 컨테이너를 기동시키고 특정 명령어를 실행이 완료된 후에 컨테이너를 종료
'[스파르타코딩클럽] > Docker & CICD' 카테고리의 다른 글
Docker volume (0) | 2024.03.19 |
---|---|
Docker 모니터링&로깅 (0) | 2024.03.19 |
Dockerfile (0) | 2024.03.18 |
Github Actions와 CI/CD (0) | 2024.03.18 |
CI/CD와 Docker (0) | 2024.03.18 |