Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 함께 실행할 수 있도록 구성하는 도구입니다. Docker Compose 구성 파일은 주로 docker-compose.yml 형식으로 작성되며, 주요 구성 요소는 아래와 같습니다.
1. version
- Compose 파일 형식의 버전을 지정합니다.
- Docker Compose는 다양한 버전이 있으며, 사용하는 Docker 버전에 따라 호환되는 버전을 선택해야 합니다.
- 최신 버전인
3.9
은 다양한 기능을 지원하며, 대부분의 최신 Docker 버전과 호환됩니다.
예시:
version: '3.9'
- 사용 이유: 파일 구문과 동작 방식의 호환성을 유지합니다. 최신 버전을 사용하면 새로운 기능을 활용할 수 있습니다.
2. services
- 실행하려는 컨테이너를 정의하는 가장 중요한 섹션입니다.
services
아래에 각 컨테이너를 정의하고, 해당 컨테이너의 설정을 포함합니다.
예시:
services:
web:
image: nginx
redis:
image: redis:alpine
- 사용 이유: 각 서비스는 애플리케이션의 개별적인 역할(예: 웹 서버, 데이터베이스, 캐시 등)을 수행합니다.
3. image
- Docker Hub 또는 로컬 레지스트리에 저장된 Docker 이미지를 지정합니다.
- 컨테이너를 실행할 때 필요한 환경을 포함한 이미지입니다.
예시:
image: redis:latest
- 추가 설명:
redis:latest
는 Redis의 최신 버전을 실행하도록 지정합니다. 명시적인 버전 태그(redis:6.2-alpine
)를 사용하는 것이 좋습니다.
4. build
- Dockerfile을 사용하여 이미지를 빌드할 때 사용됩니다.
- 컨텍스트(파일 경로)와 Dockerfile의 위치를 지정할 수 있습니다.
예시:
build:
context: ./app
dockerfile: Dockerfile
- 사용 이유: 커스터마이즈된 Docker 이미지를 생성하여 서비스에 필요한 특수 설정을 추가할 수 있습니다.
5. ports
- 호스트(로컬 컴퓨터)와 컨테이너 간의 포트를 매핑합니다.
- 포트 매핑 형식:
<호스트포트>:<컨테이너포트>
예:8080:80
은 호스트의 8080번 포트를 컨테이너의 80번 포트에 연결합니다.
예시:
ports:
- "8080:80"
- 사용 이유: 컨테이너 내부의 서비스(예: 웹 서버)에 외부에서 접근할 수 있도록 설정합니다.
6. volumes
- 호스트와 컨테이너 간 데이터를 공유하거나, 컨테이너 데이터의 영속성을 유지합니다.
- 형식:
<호스트_경로>:<컨테이너_경로>
예:./data:/var/lib/mysql
은 호스트의./data
디렉토리를 컨테이너의/var/lib/mysql
로 마운트합니다.
예시:
volumes:
- ./data:/var/lib/mysql
- 사용 이유: 컨테이너가 삭제되더라도 데이터가 손실되지 않도록 영구적으로 저장할 수 있습니다.
7. environment
- 컨테이너 내부에서 사용할 환경 변수를 설정합니다.
- 데이터베이스, 인증 등과 관련된 설정을 외부에서 전달할 때 유용합니다.
예시:
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=mydb
- 사용 이유: 코드를 변경하지 않고도 컨테이너의 동작 방식을 쉽게 변경할 수 있습니다.
8. depends_on
- 한 서비스가 다른 서비스가 시작된 후 실행되도록 설정합니다.
- 예를 들어, 데이터베이스가 준비된 후 웹 서버가 실행되도록 설정할 수 있습니다.
예시:
depends_on:
- db
- 사용 이유: 서비스 간의 의존성을 관리하여 실행 순서를 보장합니다.
(단, 의존성을 보장하지만 준비 상태를 확인하지는 않습니다. 준비 상태 확인은 별도로 구현해야 합니다.)
9. networks
- 컨테이너 간의 네트워크를 설정합니다.
- 네트워크를 생성하면, 동일한 네트워크에 속한 컨테이너는 이름을 사용해 통신할 수 있습니다.
예시:
networks:
- app-network
네트워크 정의:
networks:
app-network:
driver: bridge
- 사용 이유: 컨테이너 간의 통신을 안전하고 효율적으로 관리합니다.
10. restart
- 컨테이너의 재시작 정책을 정의합니다.
- 서비스가 종료되거나 실패했을 때 재시작 동작을 제어합니다.
예시:
restart: always
- 옵션 설명:
no
(기본값): 컨테이너를 재시작하지 않음.always
: 컨테이너를 항상 재시작.on-failure
: 오류 발생 시에만 재시작.unless-stopped
: 컨테이너가 수동으로 중지되지 않는 한 항상 재시작.
11. command
- 컨테이너가 시작될 때 실행할 명령을 정의합니다.
- 컨테이너의 기본 명령을 대체하거나 추가 설정이 필요할 때 사용합니다.
예시:
command: ["npm", "start"]
- 사용 이유: 컨테이너의 실행 동작을 사용자 정의할 수 있습니다.
12. volumes
(외부 정의)
services
섹션 외부에서 전역 볼륨을 정의합니다.- 여러 서비스에서 동일한 볼륨을 공유할 때 유용합니다.
예시:
volumes:
db-data:
driver: local
- 사용 이유: 여러 컨테이너가 데이터를 공유하거나 데이터의 영속성을 보장합니다.
13. networks
(외부 정의)
services
섹션 외부에서 전역 네트워크를 정의합니다.- 모든 컨테이너에 동일한 네트워크를 제공할 수 있습니다.
예시:
networks:
app-network:
driver: bridge
- 사용 이유: 네트워크를 명시적으로 정의하여 컨테이너 간 통신을 제어합니다.
'Docker' 카테고리의 다른 글
멀티스테이지 빌드(Multi-Stage Build) (0) | 2024.12.10 |
---|---|
바인드 마운트(Bind Mount)와 볼륨(Volumes) (0) | 2024.12.10 |
도커 인 액션 8장 (2) | 2024.12.06 |
도커 인 액션 7장 (0) | 2024.12.06 |
Dockerfile 명령어 (0) | 2024.12.06 |